diff --git a/converter/src/main/java/org/geysermc/pack/converter/converter/texture/TextureConverter.java b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/TextureConverter.java index 03dc622..4f559d3 100644 --- a/converter/src/main/java/org/geysermc/pack/converter/converter/texture/TextureConverter.java +++ b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/TextureConverter.java @@ -39,6 +39,10 @@ import org.geysermc.pack.converter.data.TextureConversionData; import org.jetbrains.annotations.NotNull; import team.unnamed.creative.texture.Texture; +import javax.imageio.ImageIO; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; @@ -67,11 +71,13 @@ public class TextureConverter implements Converter { List textures = new ArrayList<>(context.javaResourcePack().textures()); + context.info("Bulk transforming textures..."); BulkTransformContext bulkContext = new BulkTransformContext(context, mappings, textures); for (BulkTextureTransformer bulkTransformer : this.bulkTransformers) { bulkTransformer.transform(bulkContext); } + context.info("Transforming and writing textures..."); for (Texture texture : textures) { String output = texture.key().value(); Path outputPath = context.outputDirectory().resolve(BEDROCK_TEXTURES_LOCATION).resolve(output); @@ -95,12 +101,28 @@ public class TextureConverter implements Converter { } try (OutputStream stream = Files.newOutputStream(textureOutput)) { - texture.data().write(stream); + byte[] bytes = texture.data().toByteArray(); + + BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); + if (!image.getColorModel().hasAlpha()) { + BufferedImage newImage = new BufferedImage( + image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); + + Graphics2D g = newImage.createGraphics(); + g.drawImage(image, 0, 0, null); + g.dispose(); + + image = newImage; + } + + ImageIO.write(image, "png", stream); } context.data().addTransformedTexture(transformedTexture); } } + + context.info("Texture conversion complete!"); } @Override diff --git a/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/ColorizeTransformer.java b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/ColorizeTransformer.java new file mode 100644 index 0000000..6fb6363 --- /dev/null +++ b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/ColorizeTransformer.java @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/PackConverter + * + */ + +package org.geysermc.pack.converter.converter.texture.transformer.bulk.type; + +import com.google.auto.service.AutoService; +import net.kyori.adventure.key.Key; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTextureTransformer; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTransformContext; +import org.geysermc.pack.converter.util.ImageUtil; +import org.geysermc.pack.converter.util.UnsafeKey; +import org.jetbrains.annotations.NotNull; +import team.unnamed.creative.texture.Texture; + +import javax.imageio.ImageIO; +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; + +@AutoService(BulkTextureTransformer.class) +public class ColorizeTransformer implements BulkTextureTransformer { + private static final List COLORIZE_DATA = List.of( + // Armor (Colors from px 9/1 from original cloth_1.png bedrock texture) + new ColorizeData(new Overlay("models/armor/leather_layer_1.png", new Color(167, 105, 67)), "models/armor/cloth_1.png"), + new ColorizeData(new Overlay("models/armor/leather_layer_2.png", new Color(167, 105, 67)), "models/armor/cloth_2.png"), + + // Grass, fern, water & co. + new ColorizeData(new Overlay("block/large_fern_top.png", new Color(80, 121, 43)), "blocks/double_plant_fern_carried.png"), // 3/5 (double_plant_fern_carried.png) + new ColorizeData(new Overlay("block/tall_grass_top.png", new Color(80, 121, 43)), "blocks/double_plant_grass_carried.png"), // 3/5 (double_plant_fern_carried.png) + new ColorizeData(new Overlay("block/fern.png", new Color(50, 81, 44)), "blocks/fern_carried.png"), // 7/0 (fern_carried.tga) + new ColorizeData(new Overlay("block/grass_block_top.png", new Color(78, 119, 42)), "blocks/grass_carried.png"), // 0/0 (grass_carried.png) + new ColorizeData(new Overlay("block/acacia_leaves.png", new Color(42, 106, 9)), "blocks/leaves_acacia_carried.png"), // 0/0 (leaves_acacia_carried.tga) + new ColorizeData(new Overlay("block/dark_oak_leaves.png", new Color(34, 90, 9)), "blocks/leaves_big_oak_carried.png"), // 0/0 (leaves_big_oak_carried.tga) + new ColorizeData(new Overlay("block/birch_leaves.png", new Color(71, 92, 46)), "blocks/leaves_birch_carried.png"), // 0/0 (leaves_birch_carried.tga) + new ColorizeData(new Overlay("block/jungle_leaves.png", new Color(42, 107, 9)), "blocks/leaves_jungle_carried.png"), // 0/1 (leaves_jungle_carried.tga) + new ColorizeData(new Overlay("block/oak_leaves.png", new Color(23, 63, 3)), "blocks/leaves_oak_carried.png"), // 0/0 (leaves_oak_carried.tga) + new ColorizeData(new Overlay("block/spruce_leaves.png", new Color(58, 92, 58)), "blocks/leaves_spruce_carried.png"), // 0/0 (leaves_spruce_carried.tga) + new ColorizeData(new Overlay("block/mangrove_leaves.png", new Color(58, 92, 58)), "blocks/mangrove_leaves_carried.png"), // 0/0 (leaves_spruce_carried.tga) + new ColorizeData(new Overlay("block/grass.png", new Color(81, 123, 44)), "blocks/tallgrass_carried.png"), // 1/5 (tallgrass_carried.tga) + new ColorizeData(new Overlay("block/lily_pad.png", new Color(67, 102, 36)), "blocks/carried_waterlily.png"), // 4/2 (carried_waterlily.png) + new ColorizeData(new Overlay("block/water_flow.png", new Color(86, 132, 254)), "blocks/water_flow.png"), // 0/0 (water_flow.png) + new ColorizeData(new Overlay("block/water_still.png", new Color(215, 215, 215)), "blocks/cauldron_water.png"), // 0/0 (cauldron_water.png) + new ColorizeData(new Overlay("block/water_still.png", new Color(86, 132, 254)), "blocks/water_still.png"), // 0/0 (water_flow.png) + new ColorizeData(new Overlay("block/vine.png", new Color(80, 121, 43)), "blocks/vine_carried.png"), // 1/1 (vine_carried.png) + + // Lingering potion (Colors from px 7/9 from original bedrock textures) + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(88, 148, 255)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(232, 58, 56)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_damageBoost.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 244, 92)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_fireResistance.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(106, 16, 14)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_harm.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 58, 56)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_heal.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(202, 208, 232)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_invisibility.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(54, 255, 120)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_jump.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(242, 255, 202)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_luck.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(142, 172, 204)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_moveSlowdown.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(196, 255, 255)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_moveSpeed.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(50, 50, 255)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_nightVision.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(124, 232, 78)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_poison.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 146, 255)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_regeneration.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 255, 255)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_slowFall.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(186, 144, 156)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_turtleMaster.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(72, 130, 242)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_waterBreathing.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(114, 122, 114)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_weakness.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(84, 66, 62)), new Overlay("item/lingering_potion.png") },"items/potion_bottle_lingering_wither.png"), + + // Map (Colors from px 6/7 from original bedrock textures) + new ColorizeData(new Overlay[] { new Overlay("item/filled_map.png"), new Overlay("item/filled_map_markings.png", new Color(82, 76, 68)) },"items/map_mansion.png"), + new ColorizeData(new Overlay[] { new Overlay("item/filled_map.png"), new Overlay("item/filled_map_markings.png", new Color(67, 124, 111)) },"items/map_monument.png"), + new ColorizeData(new Overlay[] { new Overlay("item/filled_map.png"), new Overlay("item/filled_map_markings.png", new Color(103, 90, 173)) },"items/map_nautilus.png"), + new ColorizeData(new Overlay[] { new Overlay("item/filled_map.png"), new Overlay("item/filled_map_markings.png", new Color(131, 131, 131)) },"items/map_filled.png"), + new ColorizeData(new Overlay[] { new Overlay("item/filled_map.png"), new Overlay("item/filled_map_markings.png", new Color(131, 131, 131), true) }, "items/map_locked.png"), + // new ColorizeData(new Overlay[] { new Overlay("ui/cartography_table_map.png"), new Overlay("ui/cartography_table_glass.png") }, "ui/cartography_table_glass.png"), + + // Potion (Colors from px 7/9 from original bedrock textures) + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(58, 130, 255)), new Overlay("item/potion.png") }, "items/potion_bottle_absorption.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(50, 50, 56)), new Overlay("item/potion.png") }, "items/potion_bottle_blindness.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(134, 46, 118)), new Overlay("item/potion.png") }, "items/potion_bottle_confusion.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(232, 58, 56)), new Overlay("item/potion.png") }, "items/potion_bottle_damageBoost.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(118, 104, 36)), new Overlay("item/potion.png") }, "items/potion_bottle_digSlowdown.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 255, 106)), new Overlay("item/potion.png") }, "items/potion_bottle_digSpeed.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(88, 148, 255)), new Overlay("item/potion.png") }, "items/potion_bottle_drinkable.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 244, 92)), new Overlay("item/potion.png") }, "items/potion_bottle_fireResistance.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(106, 16, 14)), new Overlay("item/potion.png") }, "items/potion_bottle_harm.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 58, 56)), new Overlay("item/potion.png") }, "items/potion_bottle_heal.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 198, 56)), new Overlay("item/potion.png") }, "items/potion_bottle_healthBoost.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(140, 186, 132)), new Overlay("item/potion.png") }, "items/potion_bottle_hunger.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(202, 208, 232)), new Overlay("item/potion.png") }, "items/potion_bottle_invisibility.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(54, 255, 120)), new Overlay("item/potion.png") }, "items/potion_bottle_jump.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(54, 255, 120)), new Overlay("item/potion.png") }, "items/potion_bottle_levitation.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(142, 172, 204)), new Overlay("item/potion.png") }, "items/potion_bottle_moveSlowdown.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(196, 255, 255)), new Overlay("item/potion.png") }, "items/potion_bottle_moveSpeed.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(50, 50, 255)), new Overlay("item/potion.png") }, "items/potion_bottle_nightVision.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(124, 232, 78)), new Overlay("item/potion.png") }, "items/potion_bottle_poison.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 146, 255)), new Overlay("item/potion.png") }, "items/potion_bottle_regeneration.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(242, 110, 92)), new Overlay("item/potion.png") }, "items/potion_bottle_resistance.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 58, 56)), new Overlay("item/potion.png") }, "items/potion_bottle_saturation.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 255, 255)), new Overlay("item/potion.png") }, "items/potion_bottle_slowFall.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(186, 144, 156)), new Overlay("item/potion.png") }, "items/potion_bottle_turtleMaster.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(72, 130, 242)), new Overlay("item/potion.png") }, "items/potion_bottle_waterBreathing.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(114, 112, 114)), new Overlay("item/potion.png") }, "items/potion_bottle_weakness.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(84, 66, 62)), new Overlay("item/potion.png") }, "items/potion_bottle_wither.png"), + + // Redstone dust + // new ColorizeData(new Overlay[] { new Overlay("blocks/redstone_dust_cross.png"), new Overlay("blocks/redstone_dust_overlay.png") }, "blocks/redstone_dust_cross.png"), + // new ColorizeData(new Overlay[] { new Overlay("blocks/redstone_dust_line.png"), new Overlay("blocks/redstone_dust_overlay.png", Color.WHITE, true) }, "blocks/redstone_dust_line.png"), + + // Saddle + new ColorizeData(new Overlay[] { new Overlay("entity/pig/pig.png"), new Overlay("entity/pig/pig_saddle.png") }, "entity/pig/pig_saddle.png"), + new ColorizeData(new Overlay[] { new Overlay("entity/strider/strider.png"), new Overlay("entity/strider/strider_saddle.png") }, "entity/strider/strider_saddled.png"), + new ColorizeData(new Overlay[] { new Overlay("entity/strider/strider_cold.png"), new Overlay("entity/strider/strider_saddle.png", Color.WHITE, true) }, "entity/strider/strider_suffocated_saddled.png"), + + // Splash potion (Colors from px 7/9 from original bedrock textures) + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(88, 184, 255)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(58, 130, 255)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_absorption.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(50, 50, 56)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_blindness.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(134, 46, 118)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_confusion.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(232, 58, 56)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_damageBoost.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(118, 104, 36)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_digSlowdown.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 255, 106)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_digSpeed.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 255, 184)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_fireResistance.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(212, 32, 28)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_harm.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 116, 112)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_heal.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 198, 56)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_healthBoost.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(140, 186, 132)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_hunger.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(202, 208, 232)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_invisibility.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(54, 255, 120)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_jump.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(54, 255, 120)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_levitation.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(142, 172, 204)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_moveSlowdown.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(196, 255, 255)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_moveSpeed.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(50, 50, 255)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_nightVision.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(124, 232, 78)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_poison.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 146, 255)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_regeneration.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(242, 110, 92)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_resistance.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 58, 56)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_saturation.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(255, 255, 255)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_slowFall.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(186, 144, 156)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_turtleMaster.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(72, 130, 242)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_waterBreathing.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(114, 122, 114)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_weakness.png"), + new ColorizeData(new Overlay[] { new Overlay("item/potion_overlay.png", new Color(84, 66, 62)), new Overlay("item/splash_potion.png") }, "items/potion_bottle_splash_wither.png"), + + // Spawn egg (Colors from px 8/9 and 5/9 from original bedrock textures) + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(65, 53, 41)), new Overlay("item/spawn_egg_overlay.png", new Color(13, 13, 13)) }, "items/egg_bat.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(204, 167, 58)), new Overlay("item/spawn_egg_overlay.png", new Color(59, 32, 24)) }, "items/egg_bee.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(211, 153, 1)), new Overlay("item/spawn_egg_overlay.png", new Color(226, 220, 112)) }, "items/egg_blaze.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(239, 200, 142)), new Overlay("item/spawn_egg_overlay.png", new Color(135, 101, 74)) }, "items/egg_cat.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(10, 57, 67)), new Overlay("item/spawn_egg_overlay.png", new Color(149, 12, 12)) }, "items/egg_cave_spider.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(138, 138, 138)), new Overlay("item/spawn_egg_overlay.png", new Color(226, 0, 0)) }, "items/egg_chicken.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(205, 90, 18)), new Overlay("item/spawn_egg_overlay.png", new Color(226, 221, 212)) }, "items/egg_clownfish.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(166, 143, 91)), new Overlay("item/spawn_egg_overlay.png", new Color(203, 174, 123)) }, "items/egg_cod.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(58, 46, 33)), new Overlay("item/spawn_egg_overlay.png", new Color(143, 143, 143)) }, "items/egg_cow.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(11, 143, 9)), new Overlay("item/spawn_egg_overlay.png", new Color(0, 0, 0)) }, "items/egg_creeper.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(29, 51, 66)), new Overlay("item/spawn_egg_overlay.png", new Color(221, 221, 221)) }, "items/egg_dolphin.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(71, 59, 49)), new Overlay("item/spawn_egg_overlay.png", new Color(119, 104, 90)) }, "items/egg_donkey.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(123, 207, 185)), new Overlay("item/spawn_egg_overlay.png", new Color(107, 138, 90)) }, "items/egg_drowned.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(177, 175, 160)), new Overlay("item/spawn_egg_overlay.png", new Color(103, 105, 130)) }, "items/egg_elderguardian.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(19, 19, 19)), new Overlay("item/spawn_egg_overlay.png", new Color(19, 19, 19)) }, "items/egg_enderman.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(19, 19, 19)), new Overlay("item/spawn_egg_overlay.png", new Color(97, 97, 97)) }, "items/egg_endermite.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(128, 133, 133)), new Overlay("item/spawn_egg_overlay.png", new Color(27, 25, 23)) }, "items/egg_evoker.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(166, 143, 91)), new Overlay("item/spawn_egg_overlay.png", new Color(203, 174, 123)) }, "items/egg_fish.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(183, 156, 137)), new Overlay("item/spawn_egg_overlay.png", new Color(181, 93, 28)) }, "items/egg_fox.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(214, 214, 214)), new Overlay("item/spawn_egg_overlay.png", new Color(167, 167, 167)) }, "items/egg_ghast.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(77, 112, 98)), new Overlay("item/spawn_egg_overlay.png", new Color(214, 111, 43)) }, "items/egg_guardian.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(165, 136, 107)), new Overlay("item/spawn_egg_overlay.png", new Color(211, 203, 0)) }, "items/egg_horse.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(102, 99, 83)), new Overlay("item/spawn_egg_overlay.png", new Color(197, 191, 127)) }, "items/egg_husk.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(45, 0, 0)), new Overlay("item/spawn_egg_overlay.png", new Color(223, 223, 0)) }, "items/egg_lava_slime.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(165, 136, 107)), new Overlay("item/spawn_egg_overlay.png", new Color(136, 84, 57)) }, "items/egg_llama.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(219, 0, 0)), new Overlay("item/spawn_egg_overlay.png", new Color(240, 226, 0)) }, "items/egg_mask.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(23, 2, 0)), new Overlay("item/spawn_egg_overlay.png", new Color(72, 45, 26)) }, "items/egg_mule.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(137, 13, 14)), new Overlay("item/spawn_egg_overlay.png", new Color(162, 162, 162)) }, "items/egg_mushroomcow.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png"), new Overlay("item/spawn_egg_overlay.png") }, "items/egg_null.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(205, 191, 107)), new Overlay("item/spawn_egg_overlay.png", new Color(76, 60, 46)) }, "items/egg_ocelot.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(217, 217, 215)), new Overlay("item/spawn_egg_overlay.png", new Color(19, 19, 25)) }, "items/egg_panda.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(11, 143, 9)), new Overlay("item/spawn_egg_overlay.png", new Color(226, 0, 0)) }, "items/egg_parrot.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(58, 70, 119)), new Overlay("item/spawn_egg_overlay.png", new Color(121, 226, 0)) }, "items/egg_phantom.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(206, 142, 139)), new Overlay("item/spawn_egg_overlay.png", new Color(194, 88, 84)) }, "items/egg_pig.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(201, 126, 126)), new Overlay("item/spawn_egg_overlay.png", new Color(67, 100, 36)) }, "items/egg_pigzombie.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(71, 40, 46)), new Overlay("item/spawn_egg_overlay.png", new Color(132, 137, 137)) }, "items/egg_pillager.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(208, 208, 208)), new Overlay("item/spawn_egg_overlay.png", new Color(132, 132, 128)) }, "items/egg_polarbear.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(211, 153, 1)), new Overlay("item/spawn_egg_overlay.png", new Color(49, 173, 214)) }, "items/egg_pufferfish.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(131, 82, 55)), new Overlay("item/spawn_egg_overlay.png", new Color(102, 64, 43)) }, "items/egg_rabbit.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(100, 100, 96)), new Overlay("item/spawn_egg_overlay.png", new Color(81, 71, 65)) }, "items/egg_ravager.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(137, 13, 14)), new Overlay("item/spawn_egg_overlay.png", new Color(12, 117, 103)) }, "items/egg_salmon.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(198, 198, 198)), new Overlay("item/spawn_egg_overlay.png", new Color(226, 160, 160)) }, "items/egg_sheep.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(127, 88, 127)), new Overlay("item/spawn_egg_overlay.png", new Color(68, 50, 73)) }, "items/egg_shulker.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(94, 94, 94)), new Overlay("item/spawn_egg_overlay.png", new Color(43, 43, 43)) }, "items/egg_silverfish.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(166, 166, 166)), new Overlay("item/spawn_egg_overlay.png", new Color(65, 65, 65)) }, "items/egg_skeleton.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(89, 89, 89)), new Overlay("item/spawn_egg_overlay.png", new Color(203, 203, 191)) }, "items/egg_skeletonhorse.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(70, 137, 53)), new Overlay("item/spawn_egg_overlay.png", new Color(112, 169, 97)) }, "items/egg_slime.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(45, 39, 33)), new Overlay("item/spawn_egg_overlay.png", new Color(149, 12, 12)) }, "items/egg_spider.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(29, 51, 66)), new Overlay("item/spawn_egg_overlay.png", new Color(99, 121, 136)) }, "items/egg_squid.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(82, 100, 101)), new Overlay("item/spawn_egg_overlay.png", new Color(193, 206, 205)) }, "items/egg_stray.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(198, 198, 198)), new Overlay("item/spawn_egg_overlay.png", new Color(0, 155, 155)) }, "items/egg_turtle.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(105, 124, 141)), new Overlay("item/spawn_egg_overlay.png", new Color(206, 210, 214)) }, "items/egg_vex.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(74, 52, 44)), new Overlay("item/spawn_egg_overlay.png", new Color(167, 123, 101)) }, "items/egg_villager.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(128, 133, 133)), new Overlay("item/spawn_egg_overlay.png", new Color(35, 83, 86)) }, "items/egg_vindicator.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(55, 84, 130)), new Overlay("item/spawn_egg_overlay.png", new Color(204, 142, 41)) }, "items/egg_wanderingtrader.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(45, 0, 0)), new Overlay("item/spawn_egg_overlay.png", new Color(72, 142, 55)) }, "items/egg_witch.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(17, 17, 17)), new Overlay("item/spawn_egg_overlay.png", new Color(63, 68, 68)) }, "items/egg_wither.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(185, 181, 181)), new Overlay("item/spawn_egg_overlay.png", new Color(183, 155, 133)) }, "items/egg_wolf.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(0, 150, 150)), new Overlay("item/spawn_egg_overlay.png", new Color(107, 138, 90)) }, "items/egg_zombie.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(36, 77, 47)), new Overlay("item/spawn_egg_overlay.png", new Color(117, 184, 113)) }, "items/egg_zombiehorse.png"), + new ColorizeData(new Overlay[] { new Overlay("item/spawn_egg.png", new Color(74, 52, 44)), new Overlay("item/spawn_egg_overlay.png", new Color(107, 138, 90)) }, "items/egg_zombievillager.png"), + + // Tipped arrow (Colors from px 12/3 from original bedrock textures) + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png") }, "items/tipped_arrow.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(214, 144, 54)) }, "items/tipped_arrow_fireres.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(65, 10, 9)) }, "items/tipped_arrow_harm.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(232, 34, 33)) }, "items/tipped_arrow_healing.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(123, 127, 141)) }, "items/tipped_arrow_invisibility.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(33, 247, 74)) }, "items/tipped_arrow_leaping.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(49, 148, 0)) }, "items/tipped_arrow_luck.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(30, 30, 156)) }, "items/tipped_arrow_nightvision.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(74, 138, 46)) }, "items/tipped_arrow_poison.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(192, 86, 161)) }, "items/tipped_arrow_regen.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(87, 105, 125)) }, "items/tipped_arrow_slow.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(247, 232, 202)) }, "items/tipped_arrow_slowfalling.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(142, 35, 34)) }, "items/tipped_arrow_strength.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(116, 164, 186)) }, "items/tipped_arrow_swift.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(113, 88, 96)) }, "items/tipped_arrow_turtlemaster.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(45, 79, 148)) }, "items/tipped_arrow_waterbreathing.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(70, 75, 70)) }, "items/tipped_arrow_weakness.png"), + new ColorizeData(new Overlay[] { new Overlay("item/tipped_arrow_base.png"), new Overlay("item/tipped_arrow_head.png", new Color(50, 39, 36)) }, "items/tipped_arrow_wither.png") + ); + + @Override + public void transform(@NotNull BulkTransformContext context) throws IOException { + for (ColorizeData data : COLORIZE_DATA) { + BufferedImage finalImage = null; + + for (Overlay overlay : data.overlays()) { + String overlayPath = overlay.overlayPath(); + Color color = overlay.color(); + boolean deleteOverlay = overlay.deleteOverlay(); + + Key key = Key.key(Key.MINECRAFT_NAMESPACE, overlayPath); + Texture texture = deleteOverlay ? context.poll(key) : context.peek(key); + if (texture == null) { + context.warn("Missing overlay texture: " + overlayPath); + continue; + } + + BufferedImage overlayImage = ImageIO.read(new ByteArrayInputStream(texture.data().toByteArray())); + if (finalImage == null) { + context.info(String.format("Colorizing and overlaying %s", overlay.overlayPath())); + + finalImage = new BufferedImage(overlayImage.getWidth(), overlayImage.getHeight(), BufferedImage.TYPE_INT_ARGB); + } + + overlayImage = ImageUtil.colorize(overlayImage, color); + finalImage.getGraphics().drawImage(overlayImage, 0, 0, null); + } + + if (finalImage != null) { + context.offer(UnsafeKey.key(Key.MINECRAFT_NAMESPACE, data.outputPath()), finalImage, "png"); + } + } + } + + record ColorizeData(@NotNull Overlay[] overlays, @NotNull String outputPath) { + + public ColorizeData(@NotNull Overlay overlay, @NotNull String outputPath) { + this(new Overlay[] { overlay }, outputPath); + } + } + + record Overlay(@NotNull String overlayPath, @NotNull Color color, boolean deleteOverlay) { + + public Overlay(@NotNull String overlayPath) { + this(overlayPath, Color.WHITE, false); + } + + public Overlay(@NotNull String overlayPath, @NotNull Color color) { + this(overlayPath, color, false); + } + } +} diff --git a/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/WeatherTransformer.java b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/WeatherTransformer.java new file mode 100644 index 0000000..e800f89 --- /dev/null +++ b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/WeatherTransformer.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/PackConverter + * + */ + +package org.geysermc.pack.converter.converter.texture.transformer.bulk.type; + +import com.google.auto.service.AutoService; +import net.kyori.adventure.key.Key; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTextureTransformer; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTransformContext; +import org.geysermc.pack.converter.util.ImageUtil; +import org.jetbrains.annotations.NotNull; +import team.unnamed.creative.texture.Texture; + +import javax.imageio.ImageIO; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +@AutoService(BulkTextureTransformer.class) +public class WeatherTransformer implements BulkTextureTransformer { + private static final String SNOW_INPUT = "environment/snow.png"; + private static final String RAIN_INPUT = "environment/rain.png"; + private static final String WEATHER_OUTPUT = "environment/weather.png"; + + @Override + public void transform(@NotNull BulkTransformContext context) throws IOException { + Texture snowTexture = context.poll(Key.key(Key.MINECRAFT_NAMESPACE, SNOW_INPUT)); + Texture rainTexture = context.poll(Key.key(Key.MINECRAFT_NAMESPACE, RAIN_INPUT)); + if (snowTexture == null || rainTexture == null) { + return; + } + + context.info(String.format("Converting weather texture %s", WEATHER_OUTPUT)); + + BufferedImage snowImage = ImageIO.read(new ByteArrayInputStream(snowTexture.data().toByteArray())); + BufferedImage rainImage = ImageIO.read(new ByteArrayInputStream(rainTexture.data().toByteArray())); + + int factor = snowImage.getWidth() / 64; + + BufferedImage weatherImage = new BufferedImage((32 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB); + + Graphics graphics = weatherImage.getGraphics(); + + // Snow + graphics.drawImage(ImageUtil.cover(ImageUtil.crop(snowImage, snowImage.getWidth(), (3 * factor)), weatherImage.getWidth(), (3 * factor)), 0, 0, null); + + // Rain + graphics.drawImage(ImageUtil.cover(ImageUtil.crop(rainImage, rainImage.getWidth(), (5 * factor)), weatherImage.getWidth(), (5 * factor)), 0, (5 * factor), null); + + context.offer(Key.key(Key.MINECRAFT_NAMESPACE, WEATHER_OUTPUT), weatherImage, "png"); + } +} diff --git a/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/block/LiquidConverter.java b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/block/LiquidConverter.java new file mode 100644 index 0000000..386481b --- /dev/null +++ b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/block/LiquidConverter.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/PackConverter + * + */ + +package org.geysermc.pack.converter.converter.texture.transformer.bulk.type.block; + +import com.google.auto.service.AutoService; +import net.kyori.adventure.key.Key; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTextureTransformer; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTransformContext; +import org.geysermc.pack.converter.util.ImageUtil; +import org.jetbrains.annotations.NotNull; +import team.unnamed.creative.texture.Texture; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; + +@AutoService(BulkTextureTransformer.class) +public class LiquidConverter implements BulkTextureTransformer { + private static final List LIQUID = List.of( + new LiquidData("block/lava_flow.png", "blocks/lava_flow.png", 32), + new LiquidData("block/lava_still.png", "blocks/lava_still.png", 16), + new LiquidData("block/water_flow.png", "blocks/water_flow_grey.png", 32, true), + new LiquidData("block/water_still.png", "blocks/water_still_grey.png", 16, true) + ); + + @Override + public void transform(@NotNull BulkTransformContext context) throws IOException { + for (LiquidData liquid : LIQUID) { + String javaName = liquid.javaName(); + String bedrockName = liquid.bedrockName(); + int minWidth = liquid.minWidth(); + boolean grayscale = liquid.grayscale(); + + Texture texture = context.poll(Key.key(Key.MINECRAFT_NAMESPACE, javaName)); + if (texture == null) { + continue; + } + + context.info(String.format("Converting liquid %s", bedrockName)); + + BufferedImage liquidImage = ImageIO.read(new ByteArrayInputStream(texture.data().toByteArray())); + + if (grayscale) { + liquidImage = ImageUtil.grayscale(liquidImage); + } + + liquidImage = ImageUtil.ensureMinWidth(liquidImage, minWidth); + + context.offer(Key.key(Key.MINECRAFT_NAMESPACE, bedrockName), liquidImage, "png"); + } + } + + record LiquidData(@NotNull String javaName, @NotNull String bedrockName, int minWidth, boolean grayscale) { + + public LiquidData(@NotNull String javaName, @NotNull String bedrockName, int minWidth) { + this(javaName, bedrockName, minWidth, false); + } + } +} diff --git a/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/entity/ArrowTransformer.java b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/entity/ArrowTransformer.java new file mode 100644 index 0000000..a7334dc --- /dev/null +++ b/converter/src/main/java/org/geysermc/pack/converter/converter/texture/transformer/bulk/type/entity/ArrowTransformer.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/PackConverter + * + */ + +package org.geysermc.pack.converter.converter.texture.transformer.bulk.type.entity; + +import com.google.auto.service.AutoService; +import net.kyori.adventure.key.Key; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTextureTransformer; +import org.geysermc.pack.converter.converter.texture.transformer.bulk.BulkTransformContext; +import org.geysermc.pack.converter.util.ImageUtil; +import org.jetbrains.annotations.NotNull; +import team.unnamed.creative.texture.Texture; + +import javax.imageio.ImageIO; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +@AutoService(BulkTextureTransformer.class) +public class ArrowTransformer implements BulkTextureTransformer { + private static final String INPUT = "entity/projectiles/arrow.png"; + private static final String OUTPUT = "entity/arrows.png"; + + @Override + public void transform(@NotNull BulkTransformContext context) throws IOException { + Texture texture = context.poll(Key.key(Key.MINECRAFT_NAMESPACE, INPUT)); + if (texture == null) { + return; + } + + context.info(String.format("Converting arrow texture %s", OUTPUT)); + + BufferedImage fromImage = ImageIO.read(new ByteArrayInputStream(texture.data().toByteArray())); + + int factor = fromImage.getWidth() / 32; + BufferedImage newArrowImage = new BufferedImage((32 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB); + fromImage = ImageUtil.crop(fromImage, 0, 0, fromImage.getWidth(), 10 * factor); + + Graphics graphics = newArrowImage.getGraphics(); + graphics.drawImage(fromImage, 0, 0, null); + + fromImage = ImageUtil.grayscale(fromImage); + + for (int x = 0; x < fromImage.getWidth(); x++) { + for (int y = 0; y < fromImage.getHeight(); y++) { + Color c = new Color(fromImage.getRGB(x, y), true); + if (c.getRed() < 192 || c.getGreen() < 192 || c.getBlue() < 192) { + Color newCol = new Color(c.getRed() / 255 * 186, c.getGreen() / 255 * 98, c.getBlue() / 255 * 168, c.getAlpha()); + fromImage.setRGB(x, y, newCol.getRGB()); + } + } + } + + graphics.drawImage(fromImage, 0, 10 * factor, null); + + context.offer(Key.key(Key.MINECRAFT_NAMESPACE, OUTPUT), newArrowImage, "png"); + } +} diff --git a/converter/src/main/java/org/geysermc/pack/converter/util/UnsafeKey.java b/converter/src/main/java/org/geysermc/pack/converter/util/UnsafeKey.java new file mode 100644 index 0000000..a893716 --- /dev/null +++ b/converter/src/main/java/org/geysermc/pack/converter/util/UnsafeKey.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/PackConverter + * + */ + +package org.geysermc.pack.converter.util; + +import net.kyori.adventure.key.Key; +import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.Comparator; +import java.util.Objects; +import java.util.stream.Stream; + +import static java.util.Objects.requireNonNull; + +/** + * A {@link Key} implementation that allows for unsafe characters in the namespace and value. + *

+ * Because Bedrock does not conform to standards, this hack exists. + */ +public class UnsafeKey implements Key { + static final Comparator COMPARATOR = Comparator.comparing(Key::value).thenComparing(Key::namespace); + + static final String NAMESPACE_PATTERN = "[a-z0-9_\\-.]+"; + static final String VALUE_PATTERN = "[a-z0-9_\\-./]+"; + + private final String namespace; + private final String value; + + UnsafeKey(final @NotNull String namespace, final @NotNull String value) { + // if (!Key.parseableNamespace(namespace)) throw new InvalidKeyException(namespace, value, String.format("Non [a-z0-9_.-] character in namespace of Key[%s]", asString(namespace, value))); + // if (!Key.parseableValue(value)) throw new InvalidKeyException(namespace, value, String.format("Non [a-z0-9/._-] character in value of Key[%s]", asString(namespace, value))); + this.namespace = requireNonNull(namespace, "namespace"); + this.value = requireNonNull(value, "value"); + } + + static boolean allowedInNamespace(final char character) { + return character == '_' || character == '-' || (character >= 'a' && character <= 'z') || (character >= '0' && character <= '9') || character == '.'; + } + + static boolean allowedInValue(final char character) { + return character == '_' || character == '-' || (character >= 'a' && character <= 'z') || (character >= '0' && character <= '9') || character == '.' || character == '/'; + } + + @Override + public @NotNull String namespace() { + return this.namespace; + } + + @Override + public @NotNull String value() { + return this.value; + } + + @Override + public @NotNull String asString() { + return asString(this.namespace, this.value); + } + + private static @NotNull String asString(final @NotNull String namespace, final @NotNull String value) { + return namespace + ':' + value; + } + + @Override + public @NotNull String toString() { + return this.asString(); + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of( + ExaminableProperty.of("namespace", this.namespace), + ExaminableProperty.of("value", this.value) + ); + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof final Key that)) return false; + return Objects.equals(this.namespace, that.namespace()) && Objects.equals(this.value, that.value()); + } + + @Override + public int hashCode() { + int result = this.namespace.hashCode(); + result = (31 * result) + this.value.hashCode(); + return result; + } + + @Override + public int compareTo(final @NotNull Key that) { + return Key.super.compareTo(that); + } + + public static @NotNull Key key(final @NotNull String namespace, final @NotNull String value) { + return new UnsafeKey(namespace, value); + } +} diff --git a/legacy/ArrowConverter.java b/legacy/ArrowConverter.java deleted file mode 100644 index 3b57868..0000000 --- a/legacy/ArrowConverter.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/PackConverter - * - */ - -package org.geysermc.packconverter.converters; - -import lombok.Getter; -import org.geysermc.packconverter.PackConversionContext; -import org.geysermc.packconverter.PackConverter; -import org.geysermc.packconverter.utils.ImageUtils; -import org.jetbrains.annotations.NotNull; - -import javax.imageio.ImageIO; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -// @AutoService(Converter.class) -public class ArrowConverter extends AbstractConverter { - - @Getter - public static final List defaultData = new ArrayList<>(); - - static { - defaultData.add(new Object[] {"textures/entity/projectiles/arrow.png", "textures/entity/arrows.png"}); - } - - @Override - public void convert(@NotNull PackConversionContext context) { - try { - String from = (String) context.data()[0]; - String to = (String) context.data()[1]; - - File fromFile = context.storage().resolve(from).toFile(); - - if (!fromFile.exists()) { - return; - } - - context.log(String.format("Convert arrow %s", to)); - - BufferedImage fromImage = ImageIO.read(fromFile); - - int factor = fromImage.getWidth() / 32; - - BufferedImage newArrowImage = new BufferedImage((32 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB); - - fromImage = ImageUtils.crop(fromImage, 0, 0, fromImage.getWidth(), 10 * factor); - - Graphics g = newArrowImage.getGraphics(); - - g.drawImage(fromImage, 0, 0, null); - - fromImage = ImageUtils.grayscale(fromImage); - - for (int x = 0; x < fromImage.getWidth(); x++) { - for (int y = 0; y < fromImage.getHeight(); y++) { - Color c = new Color(fromImage.getRGB(x, y), true); - if (c.getRed() < 192 || c.getGreen() < 192 || c.getBlue() < 192) { - Color newCol = new Color(c.getRed() / 255 * 186, c.getGreen() / 255 * 98, c.getBlue() / 255 * 168, c.getAlpha()); - - fromImage.setRGB(x, y, newCol.getRGB()); - } - } - } - - g.drawImage(fromImage, 0, 10 * factor, null); - - ImageUtils.write(newArrowImage, "png", context.storage().resolve(to).toFile()); - } catch (IOException e) { } - } -} diff --git a/legacy/ColorizeOverlayConverter.java b/legacy/ColorizeOverlayConverter.java deleted file mode 100644 index 38ef531..0000000 --- a/legacy/ColorizeOverlayConverter.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/PackConverter - * - */ - -package org.geysermc.packconverter.converters; - -import com.google.auto.service.AutoService; -import lombok.Getter; -import org.geysermc.packconverter.PackConversionContext; -import org.geysermc.packconverter.PackConverter; -import org.geysermc.packconverter.utils.ImageUtils; -import org.jetbrains.annotations.NotNull; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -@AutoService(Converter.class) -public class ColorizeOverlayConverter extends AbstractConverter { - - @Getter - public static final List defaultData = new ArrayList<>(); - - static { - // Armor (Colors from px 9/1 from original cloth_1.png bedrock texture) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/models/armor/leather_1.png", new Color(167, 105, 67)}}, "textures/models/armor/cloth_1.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/models/armor/leather_2.png", new Color(167, 105, 67)}}, "textures/models/armor/cloth_2.png"}); - - // Grass, fern, water & co. - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/double_plant_fern_top.png", new Color(80, 121, 43)}}, "textures/blocks/double_plant_fern_carried.png"}); // 3/5 (double_plant_fern_carried.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/double_plant_grass_top.png", new Color(80, 121, 43)}}, "textures/blocks/double_plant_grass_carried.png"}); // 3/5 (double_plant_fern_carried.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/fern.png", new Color(50, 81, 44)}}, "textures/blocks/fern_carried.png"}); // 7/0 (fern_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/grass_top.png", new Color(78, 119, 42)}}, "textures/blocks/grass_carried.png"}); // 0/0 (grass_carried.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/leaves_acacia.png", new Color(42, 106, 9)}}, "textures/blocks/leaves_acacia_carried.png"}); // 0/0 (leaves_acacia_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/leaves_big_oak.png", new Color(34, 90, 9)}}, "textures/blocks/leaves_big_oak_carried.png"}); // 0/0 (leaves_big_oak_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/leaves_birch.png", new Color(71, 92, 46)}}, "textures/blocks/leaves_birch_carried.png"}); // 0/0 (leaves_birch_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/leaves_jungle.png", new Color(42, 107, 9)}}, "textures/blocks/leaves_jungle_carried.png"}); // 0/1 (leaves_jungle_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/leaves_oak.png", new Color(23, 63, 3)}}, "textures/blocks/leaves_oak_carried.png"}); // 0/0 (leaves_oak_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/leaves_spruce.png", new Color(58, 92, 58)}}, "textures/blocks/leaves_spruce_carried.png"}); // 0/0 (leaves_spruce_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/tallgrass.png", new Color(81, 123, 44)}}, "textures/blocks/tallgrass_carried.png"}); // 1/5 (tallgrass_carried.tga) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/waterlily.png", new Color(67, 102, 36)}}, "textures/blocks/carried_waterlily.png"}); // 4/2 (carried_waterlily.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/water_flow_grey.png", new Color(86, 132, 254)}}, "textures/blocks/water_flow.png"}); // 0/0 (water_flow.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/water_still_grey.png", new Color(215, 215, 215)}}, "textures/blocks/cauldron_water.png"}); // 0/0 (cauldron_water.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/water_still_grey.png", new Color(86, 132, 254)}}, "textures/blocks/water_still.png"}); // 0/0 (water_flow.png) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/vine.png", new Color(80, 121, 43)}}, "textures/blocks/vine_carried.png"}); // 1/1 (vine_carried.png) - - // Lingering potion (Colors from px 7/9 from original bedrock textures) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(88, 148, 255)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(232, 58, 56)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_damageBoost.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 244, 92)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_fireResistance.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(106, 16, 14)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_harm.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 58, 56)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_heal.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(202, 208, 232)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_invisibility.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(54, 255, 120)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_jump.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(242, 255, 202)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_luck.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(142, 172, 204)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_moveSlowdown.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(196, 255, 255)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_moveSpeed.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(50, 50, 255)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_nightVision.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(124, 232, 78)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_poison.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 146, 255)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_regeneration.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 255, 255)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_slowFall.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(186, 144, 156)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_turtleMaster.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(72, 130, 242)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_waterBreathing.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(114, 122, 114)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_weakness.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(84, 66, 62)}, new Object[] {"textures/items/potion_bottle_lingering_empty.png"}}, "textures/items/potion_bottle_lingering_wither.png"}); - - // Map (Colors from px 6/7 from original bedrock textures) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/map_filled.png"}, new Object[] {"textures/items/map_filled_markings.png", new Color(82, 76, 68)}}, "textures/items/map_mansion.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/map_filled.png"}, new Object[] {"textures/items/map_filled_markings.png", new Color(67, 124, 111)}}, "textures/items/map_monument.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/map_filled.png"}, new Object[] {"textures/items/map_filled_markings.png", new Color(103, 90, 173)}}, "textures/items/map_nautilus.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/map_filled.png"}, new Object[] {"textures/items/map_filled_markings.png", new Color(131, 131, 131)}}, "textures/items/map_filled.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/map_filled.png"}, new Object[] {"textures/items/map_filled_markings.png", new Color(131, 131, 131), true}}, "textures/items/map_locked.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/ui/cartography_table_map.png"}, new Object[] {"textures/ui/cartography_table_glass.png"}}, "textures/ui/cartography_table_glass.png"}); - - // Potion (Colors from px 7/9 from original bedrock textures) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(58, 130, 255)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_absorption.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(50, 50, 56)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_blindness.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(134, 46, 118)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_confusion.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(232, 58, 56)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_damageBoost.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(118, 104, 36)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_digSlowdown.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 255, 106)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_digSpeed.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(88, 148, 255)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_drinkable.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 244, 92)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_fireResistance.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(106, 16, 14)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_harm.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 58, 56)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_heal.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 198, 56)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_healthBoost.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(140, 186, 132)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_hunger.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(202, 208, 232)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_invisibility.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(54, 255, 120)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_jump.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(54, 255, 120)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_levitation.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(142, 172, 204)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_moveSlowdown.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(196, 255, 255)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_moveSpeed.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(50, 50, 255)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_nightVision.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(124, 232, 78)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_poison.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 146, 255)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_regeneration.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(242, 110, 92)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_resistance.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 58, 56)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_saturation.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 255, 255)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_slowFall.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(186, 144, 156)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_turtleMaster.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(72, 130, 242)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_waterBreathing.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(114, 112, 114)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_weakness.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(84, 66, 62)}, new Object[] {"textures/items/potion_bottle_empty.png"}}, "textures/items/potion_bottle_wither.png"}); - - // Redstone dust - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/redstone_dust_cross.png"}, new Object[] {"textures/blocks/redstone_dust_overlay.png"}}, "textures/blocks/redstone_dust_cross.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/blocks/redstone_dust_line.png"}, new Object[] {"textures/blocks/redstone_dust_overlay.png", null, true}}, "textures/blocks/redstone_dust_line.png"}); - - // Saddle - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/entity/pig/pig.png"}, new Object[] {"textures/entity/saddle.png"}}, "textures/entity/pig/pig_saddle.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/entity/strider/strider.png"}, new Object[] {"textures/entity/strider_saddle.png"}}, "textures/entity/strider/strider_saddled.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/entity/strider/strider_suffocated.png"}, new Object[] {"textures/entity/strider_saddle.png", null, true}}, "textures/entity/strider/strider_suffocated_saddled.png"}); - - // Splash potion (Colors from px 7/9 from original bedrock textures) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(88, 184, 255)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(58, 130, 255)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_absorption.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(50, 50, 56)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_blindness.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(134, 46, 118)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_confusion.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(232, 58, 56)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_damageBoost.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(118, 104, 36)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_digSlowdown.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 255, 106)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_digSpeed.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 255, 184)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_fireResistance.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(212, 32, 28)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_harm.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 116, 112)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_heal.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 198, 56)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_healthBoost.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(140, 186, 132)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_hunger.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(202, 208, 232)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_invisibility.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(54, 255, 120)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_jump.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(54, 255, 120)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_levitation.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(142, 172, 204)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_moveSlowdown.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(196, 255, 255)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_moveSpeed.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(50, 50, 255)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_nightVision.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(124, 232, 78)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_poison.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 146, 255)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_regeneration.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(242, 110, 92)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_resistance.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 58, 56)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_saturation.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(255, 255, 255)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_slowFall.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(186, 144, 156)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_turtleMaster.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(72, 130, 242)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_waterBreathing.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(114, 122, 114)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_weakness.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/potion_overlay.png", new Color(84, 66, 62)}, new Object[] {"textures/items/potion_bottle_splash_empty.png"}}, "textures/items/potion_bottle_splash_wither.png"}); - - // Spawn egg (Colors from px 8/9 and 5/9 from original bedrock textures) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(65, 53, 41)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(13, 13, 13)}}, "textures/items/egg_bat.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(204, 167, 58)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(59, 32, 24)}}, "textures/items/egg_bee.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(211, 153, 1)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(226, 220, 112)}}, "textures/items/egg_blaze.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(239, 200, 142)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(135, 101, 74)}}, "textures/items/egg_cat.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(10, 57, 67)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(149, 12, 12)}}, "textures/items/egg_cave_spider.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(138, 138, 138)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(226, 0, 0)}}, "textures/items/egg_chicken.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(205, 90, 18)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(226, 221, 212)}}, "textures/items/egg_clownfish.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(166, 143, 91)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(203, 174, 123)}}, "textures/items/egg_cod.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(58, 46, 33)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(143, 143, 143)}}, "textures/items/egg_cow.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(11, 143, 9)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(0, 0, 0)}}, "textures/items/egg_creeper.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(29, 51, 66)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(221, 221, 221)}}, "textures/items/egg_dolphin.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(71, 59, 49)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(119, 104, 90)}}, "textures/items/egg_donkey.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(123, 207, 185)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(107, 138, 90)}}, "textures/items/egg_drowned.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(177, 175, 160)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(103, 105, 130)}}, "textures/items/egg_elderguardian.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(19, 19, 19)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(19, 19, 19)}}, "textures/items/egg_enderman.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(19, 19, 19)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(97, 97, 97)}}, "textures/items/egg_endermite.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(128, 133, 133)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(27, 25, 23)}}, "textures/items/egg_evoker.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(166, 143, 91)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(203, 174, 123)}}, "textures/items/egg_fish.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(183, 156, 137)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(181, 93, 28)}}, "textures/items/egg_fox.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(214, 214, 214)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(167, 167, 167)}}, "textures/items/egg_ghast.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(77, 112, 98)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(214, 111, 43)}}, "textures/items/egg_guardian.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(165, 136, 107)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(211, 203, 0)}}, "textures/items/egg_horse.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(102, 99, 83)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(197, 191, 127)}}, "textures/items/egg_husk.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(45, 0, 0)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(223, 223, 0)}}, "textures/items/egg_lava_slime.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(165, 136, 107)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(136, 84, 57)}}, "textures/items/egg_llama.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(219, 0, 0)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(240, 226, 0)}}, "textures/items/egg_mask.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(23, 2, 0)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(72, 45, 26)}}, "textures/items/egg_mule.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(137, 13, 14)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(162, 162, 162)}}, "textures/items/egg_mushroomcow.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png"}, new Object[] {"textures/items/spawn_egg_overlay.png"}}, "textures/items/egg_null.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(205, 191, 107)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(76, 60, 46)}}, "textures/items/egg_ocelot.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(217, 217, 215)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(19, 19, 25)}}, "textures/items/egg_panda.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(11, 143, 9)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(226, 0, 0)}}, "textures/items/egg_parrot.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(58, 70, 119)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(121, 226, 0)}}, "textures/items/egg_phantom.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(206, 142, 139)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(194, 88, 84)}}, "textures/items/egg_pig.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(201, 126, 126)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(67, 100, 36)}}, "textures/items/egg_pigzombie.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(71, 40, 46)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(132, 137, 137)}}, "textures/items/egg_pillager.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(208, 208, 208)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(132, 132, 128)}}, "textures/items/egg_polarbear.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(211, 153, 1)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(49, 173, 214)}}, "textures/items/egg_pufferfish.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(131, 82, 55)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(102, 64, 43)}}, "textures/items/egg_rabbit.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(100, 100, 96)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(81, 71, 65)}}, "textures/items/egg_ravager.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(137, 13, 14)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(12, 117, 103)}}, "textures/items/egg_salmon.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(198, 198, 198)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(226, 160, 160)}}, "textures/items/egg_sheep.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(127, 88, 127)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(68, 50, 73)}}, "textures/items/egg_shulker.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(94, 94, 94)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(43, 43, 43)}}, "textures/items/egg_silverfish.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(166, 166, 166)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(65, 65, 65)}}, "textures/items/egg_skeleton.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(89, 89, 89)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(203, 203, 191)}}, "textures/items/egg_skeletonhorse.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(70, 137, 53)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(112, 169, 97)}}, "textures/items/egg_slime.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(45, 39, 33)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(149, 12, 12)}}, "textures/items/egg_spider.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(29, 51, 66)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(99, 121, 136)}}, "textures/items/egg_squid.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(82, 100, 101)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(193, 206, 205)}}, "textures/items/egg_stray.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(198, 198, 198)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(0, 155, 155)}}, "textures/items/egg_turtle.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(105, 124, 141)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(206, 210, 214)}}, "textures/items/egg_vex.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(74, 52, 44)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(167, 123, 101)}}, "textures/items/egg_villager.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(128, 133, 133)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(35, 83, 86)}}, "textures/items/egg_vindicator.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(55, 84, 130)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(204, 142, 41)}}, "textures/items/egg_wanderingtrader.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(45, 0, 0)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(72, 142, 55)}}, "textures/items/egg_witch.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(17, 17, 17)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(63, 68, 68)}}, "textures/items/egg_wither.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(185, 181, 181)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(183, 155, 133)}}, "textures/items/egg_wolf.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(0, 150, 150)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(107, 138, 90)}}, "textures/items/egg_zombie.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(36, 77, 47)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(117, 184, 113)}}, "textures/items/egg_zombiehorse.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/spawn_egg.png", new Color(74, 52, 44)}, new Object[] {"textures/items/spawn_egg_overlay.png", new Color(107, 138, 90)}}, "textures/items/egg_zombievillager.png"}); - - // Tipped arrow (Colors from px 12/3 from original bedrock textures) - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png"}}, "textures/items/tipped_arrow.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(214, 144, 54)}}, "textures/items/tipped_arrow_fireres.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(65, 10, 9)}}, "textures/items/tipped_arrow_harm.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(232, 34, 33)}}, "textures/items/tipped_arrow_healing.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(123, 127, 141)}}, "textures/items/tipped_arrow_invisibility.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(33, 247, 74)}}, "textures/items/tipped_arrow_leaping.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(49, 148, 0)}}, "textures/items/tipped_arrow_luck.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(30, 30, 156)}}, "textures/items/tipped_arrow_nightvision.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(74, 138, 46)}}, "textures/items/tipped_arrow_poison.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(192, 86, 161)}}, "textures/items/tipped_arrow_regen.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(87, 105, 125)}}, "textures/items/tipped_arrow_slow.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(247, 232, 202)}}, "textures/items/tipped_arrow_slowfalling.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(142, 35, 34)}}, "textures/items/tipped_arrow_strength.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(116, 164, 186)}}, "textures/items/tipped_arrow_swift.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(113, 88, 96)}}, "textures/items/tipped_arrow_turtlemaster.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(45, 79, 148)}}, "textures/items/tipped_arrow_waterbreathing.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(70, 75, 70)}}, "textures/items/tipped_arrow_weakness.png"}); - defaultData.add(new Object[] {new Object[] {new Object[] {"textures/items/tipped_arrow_base.png"}, new Object[] {"textures/items/tipped_arrow_head.png", new Color(50, 39, 36)}}, "textures/items/tipped_arrow_wither.png"}); - } - - public ColorizeOverlayConverter(PackConverter packConverter, Path storage, Object[] data) { - super(packConverter, storage, data); - } - - @Override - public List convert(@NotNull PackConversionContext context) { - List delete = new ArrayList<>(); - - try { - Object[] overlays = (Object[]) context.data()[0]; - String to = (String) context.data()[1]; - - BufferedImage finalImage = null; - - for (Object overlay : overlays) { - Object[] overlayArr = (Object[]) overlay; - String overlayPath = (String) overlayArr[0]; - Color color = overlayArr.length > 1 && overlayArr[1] != null ? (Color) overlayArr[1] : Color.white; - boolean deleteOverlay = overlayArr.length > 2 ? (boolean) overlayArr[2] : false; - - File overlayFile = storage.resolve(overlayPath).toFile(); - if (!overlayFile.exists()) { - continue; - } - - BufferedImage overlayImage = ImageIO.read(overlayFile); - - if (finalImage == null) { - context.log(String.format("Colorize and overlay %s", to)); - - finalImage = new BufferedImage(overlayImage.getWidth(), overlayImage.getHeight(), BufferedImage.TYPE_INT_ARGB); - } - - overlayImage = ImageUtils.colorize(overlayImage, color); - - finalImage.getGraphics().drawImage(overlayImage, 0, 0, null); - - if (deleteOverlay) { - delete.add(new DeleteConverter(packConverter, storage, new Object[] {overlayPath})); - } - } - - if (finalImage != null) { - ImageUtils.write(finalImage, "png", storage.resolve(to).toFile()); - } - } catch (IOException e) { } - - return delete; - } -} diff --git a/legacy/WaterConverter.java b/legacy/WaterConverter.java deleted file mode 100644 index 0ab6d0a..0000000 --- a/legacy/WaterConverter.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/PackConverter - * - */ - -package org.geysermc.packconverter.converters; - -import com.google.auto.service.AutoService; -import lombok.Getter; -import org.geysermc.packconverter.PackConversionContext; -import org.geysermc.packconverter.PackConverter; -import org.geysermc.packconverter.utils.ImageUtils; -import org.jetbrains.annotations.NotNull; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -@AutoService(Converter.class) -public class WaterConverter extends AbstractConverter { - - @Getter - public static final List defaultData = new ArrayList<>(); - - static { - defaultData.add(new Object[] {"textures/blocks/lava_flow.png", "textures/blocks/lava_flow.png", 32}); - defaultData.add(new Object[] {"textures/blocks/lava_still.png", "textures/blocks/lava_still.png", 16}); - defaultData.add(new Object[] {"textures/blocks/water_flow_grey.png", "textures/blocks/water_flow_grey.png", 32, true}); - defaultData.add(new Object[] {"textures/blocks/water_still_grey.png", "textures/blocks/water_still_grey.png", 16, true}); - } - - public WaterConverter(PackConverter packConverter, Path storage, Object[] data) { - super(packConverter, storage, data); - } - - @Override - public List convert(@NotNull PackConversionContext context) { - List delete = new ArrayList<>(); - - try { - String from = (String) context.data()[0]; - String to = (String) context.data()[1]; - int minWidth = (int) context.data()[2]; - boolean grayscale = context.data().length > 3 ? (boolean) context.data()[3] : false; - - File waterFile = storage.resolve(from).toFile(); - - if (!waterFile.exists()) { - return delete; - } - - context.log(String.format("Convert water %s", from)); - - BufferedImage waterImage = ImageIO.read(waterFile); - - if (grayscale) { - waterImage = ImageUtils.grayscale(waterImage); - } - - waterImage = ImageUtils.ensureMinWidth(waterImage, minWidth); - - ImageUtils.write(waterImage, "png", storage.resolve(to).toFile()); - } catch (IOException e) { } - - return new ArrayList<>(); - } -} diff --git a/legacy/WeatherConverter.java b/legacy/WeatherConverter.java deleted file mode 100644 index f95c364..0000000 --- a/legacy/WeatherConverter.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2019-2023 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/PackConverter - * - */ - -package org.geysermc.packconverter.converters; - -import com.google.auto.service.AutoService; -import lombok.Getter; -import org.geysermc.packconverter.PackConversionContext; -import org.geysermc.packconverter.PackConverter; -import org.geysermc.packconverter.utils.ImageUtils; -import org.jetbrains.annotations.NotNull; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -@AutoService(Converter.class) -public class WeatherConverter extends AbstractConverter { - - @Getter - public static final List defaultData = new ArrayList<>(); - - static { - // Bed - defaultData.add(new Object[] {"textures/environment/snow.png", "textures/environment/rain.png", "textures/environment/weather.png"}); - } - - public WeatherConverter(PackConverter packConverter, Path storage, Object[] data) { - super(packConverter, storage, data); - } - - @Override - public List convert(@NotNull PackConversionContext context) { - List delete = new ArrayList<>(); - - try { - String snow = (String) context.data()[0]; - String rain = (String) context.data()[1]; - String to = (String) context.data()[2]; - - File snowFile = storage.resolve(snow).toFile(); - File rainFile = storage.resolve(rain).toFile(); - - if (!snowFile.exists() || !rainFile.exists()) { - return delete; - } - - context.log("Convert weather"); - - BufferedImage snowImage = ImageIO.read(snowFile); - BufferedImage rainImage = ImageIO.read(rainFile); - - int factor = snowImage.getWidth() / 64; - - BufferedImage weatherImage = new BufferedImage((32 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB); - - Graphics g = weatherImage.getGraphics(); - - // Snow - g.drawImage(ImageUtils.cover(ImageUtils.crop(snowImage, snowImage.getWidth(), (3 * factor)), weatherImage.getWidth(), (3 * factor)), 0, 0, null); - - delete.add(new DeleteConverter(packConverter, storage, new Object[] {snow})); - - // Rain - g.drawImage(ImageUtils.cover(ImageUtils.crop(rainImage, rainImage.getWidth(), (5 * factor)), weatherImage.getWidth(), (5 * factor)), 0, (5 * factor), null); - - delete.add(new DeleteConverter(packConverter, storage, new Object[] {rain})); - - ImageUtils.write(weatherImage, "png", storage.resolve(to).toFile()); - } catch (IOException e) { } - - return new ArrayList<>(); - } -}