1
0
mirror of https://github.com/GeyserMC/PackConverter.git synced 2025-12-19 14:59:21 +00:00

Remove legacy code and fix temporary folder deletion

This commit is contained in:
rtm516
2024-03-12 22:29:34 +00:00
parent 0013416820
commit 0a1114b22f
33 changed files with 2 additions and 5340 deletions

View File

@@ -26,6 +26,7 @@
package org.geysermc.pack.converter;
import org.apache.commons.io.file.PathUtils;
import org.geysermc.pack.bedrock.resource.BedrockResourcePack;
import org.geysermc.pack.converter.converter.ActionListener;
import org.geysermc.pack.converter.converter.Converter;
@@ -310,7 +311,7 @@ public final class PackConverter {
*/
private void cleanup() {
try {
Files.delete(tmpDir);
PathUtils.delete(tmpDir);
} catch (IOException ignored) {
}
}

View File

@@ -1,125 +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 BannerPatternBlackConverter extends AbstractConverter {
@Getter
private static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/banner/border.png"});
defaultData.add(new Object[] {"textures/entity/banner/bricks.png"});
defaultData.add(new Object[] {"textures/entity/banner/circle.png"});
defaultData.add(new Object[] {"textures/entity/banner/creeper.png"});
defaultData.add(new Object[] {"textures/entity/banner/cross.png"});
defaultData.add(new Object[] {"textures/entity/banner/curly_border.png"});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_left.png"});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_right.png"});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_up_left.png"});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_up_right.png"});
defaultData.add(new Object[] {"textures/entity/banner/flower.png"});
defaultData.add(new Object[] {"textures/entity/banner/gradient.png"});
defaultData.add(new Object[] {"textures/entity/banner/gradient_up.png"});
defaultData.add(new Object[] {"textures/entity/banner/half_horizontal.png"});
defaultData.add(new Object[] {"textures/entity/banner/half_horizontal_bottom.png"});
defaultData.add(new Object[] {"textures/entity/banner/half_vertical.png"});
defaultData.add(new Object[] {"textures/entity/banner/half_vertical_right.png"});
defaultData.add(new Object[] {"textures/entity/banner/mojang.png"});
defaultData.add(new Object[] {"textures/entity/banner/piglin.png"});
defaultData.add(new Object[] {"textures/entity/banner/rhombus.png"});
defaultData.add(new Object[] {"textures/entity/banner/skull.png"});
defaultData.add(new Object[] {"textures/entity/banner/small_stripes.png"});
defaultData.add(new Object[] {"textures/entity/banner/square_bottom_left.png"});
defaultData.add(new Object[] {"textures/entity/banner/square_bottom_right.png"});
defaultData.add(new Object[] {"textures/entity/banner/square_top_left.png"});
defaultData.add(new Object[] {"textures/entity/banner/square_top_right.png"});
defaultData.add(new Object[] {"textures/entity/banner/straight_cross.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_bottom.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_center.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_downleft.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_downright.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_left.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_middle.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_right.png"});
defaultData.add(new Object[] {"textures/entity/banner/stripe_top.png"});
defaultData.add(new Object[] {"textures/entity/banner/triangle_bottom.png"});
defaultData.add(new Object[] {"textures/entity/banner/triangle_top.png"});
defaultData.add(new Object[] {"textures/entity/banner/triangles_bottom.png"});
defaultData.add(new Object[] {"textures/entity/banner/triangles_top.png"});
}
public BannerPatternBlackConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File patternFile = storage.resolve(from).toFile();
if (!patternFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Fix banner pattern black %s", from));
BufferedImage patternImage = ImageIO.read(patternFile);
for (int x = 0; x < patternImage.getWidth(); x++) {
for (int y = 0; y < patternImage.getHeight(); y++) {
Color c = new Color(patternImage.getRGB(x, y), true);
if (c.getRGB() == 0 && c.getRed() == 0 && c.getGreen() == 0 && c.getBlue() == 0 && c.getAlpha() == 255) {
patternImage.setRGB(x, y, Color.TRANSLUCENT);
}
}
}
ImageUtils.write(patternImage, "png", patternFile);
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,120 +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 BannerPatternConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/banner_base.png", new Object[]{
// https://www.planetminecraft.com/banner/pillager-banner-199281/
// Colors from original bedrock texture
new Object[] {"textures/entity/banner/base.png", new Color(255, 255, 255)},
new Object[] {"textures/entity/banner/rhombus.png", new Color(76, 127, 153)},
new Object[] {"textures/entity/banner/stripe_bottom.png", new Color(146, 146, 146)},
new Object[] {"textures/entity/banner/stripe_center.png", new Color(79, 79, 79)},
new Object[] {"textures/entity/banner/stripe_middle.png", new Color(0, 0, 0)},
new Object[] {"textures/entity/banner/half_horizontal.png", new Color(146, 146, 146)},
new Object[] {"textures/entity/banner/circle.png", new Color(146, 146, 146)},
new Object[] {"textures/entity/banner/border.png", new Color(0, 0, 0)}
}, "textures/entity/banner/banner_pattern_illager.png"});
}
public BannerPatternConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String base = (String) context.data()[0];
Object[] patterns = (Object[]) context.data()[1];
String to = (String) context.data()[2];
BufferedImage bannerImage = null;
for (Object pattern : patterns) {
Object[] patternArr = (Object[]) pattern;
String path = (String) patternArr[0];
Color color = (Color) patternArr[1];
File patternFile = storage.resolve(path).toFile();
if (!patternFile.exists()) {
continue;
}
BufferedImage patternImage = ImageIO.read(patternFile);
if (bannerImage == null) {
context.log(String.format("Convert pattern banner %s", to));
bannerImage = ImageIO.read(storage.resolve(base).toFile());
int factor = bannerImage.getWidth() / 64;
Graphics g = bannerImage.getGraphics();
g.drawImage(ImageUtils.crop(bannerImage, (44 * factor), 0, (8 * factor), (44 * factor)), (52 * factor), 0, null);
g.drawImage(ImageUtils.crop(bannerImage, (44 * factor), (5 * factor), (8 * factor), (20 * factor)), (52 * factor), (44 * factor), null);
}
for (int x = 0; x < bannerImage.getWidth(); x++) {
for (int y = 0; y < bannerImage.getHeight(); y++) {
Color c = new Color(patternImage.getRGB(x, y), true);
if (c.getRed() > 0 && c.getAlpha() > 0) {
bannerImage.setRGB(x, y, color.getRGB());
}
}
}
}
if (bannerImage != null) {
ImageUtils.write(bannerImage, "png", storage.resolve(to).toFile());
}
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,119 +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 BannerPatternPreviewMaxSizeConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/banner_base.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/border.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/bricks.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/circle.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/creeper.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/cross.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/curly_border.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_left.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_right.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_up_left.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/diagonal_up_right.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/flower.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/gradient.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/gradient_up.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/half_horizontal.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/half_horizontal_bottom.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/half_vertical.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/half_vertical_right.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/mojang.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/piglin.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/rhombus.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/skull.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/small_stripes.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/square_bottom_left.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/square_bottom_right.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/square_top_left.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/square_top_right.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/straight_cross.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_bottom.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_center.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_downleft.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_downright.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_left.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_middle.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_right.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/stripe_top.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/triangle_bottom.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/triangle_top.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/triangles_bottom.png", 64});
defaultData.add(new Object[] {"textures/entity/banner/triangles_top.png", 64});
}
public BannerPatternPreviewMaxSizeConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
Integer max_width = (Integer) context.data()[1];
File patternFile = storage.resolve(from).toFile();
if (!patternFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Fix banner pattern preview max size %s", from));
BufferedImage patternImage = ImageIO.read(patternFile);
patternImage = ImageUtils.ensureMaxWidth(patternImage, max_width);
ImageUtils.write(patternImage, "png", patternFile);
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,143 +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.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
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 BarConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {
"textures/gui/icons.png",
256,
new Object[] {
new Object[] {64, new Object[] {
new Object[] {"textures/gui/achievements/hotdogempty"},
new Object[] {"textures/ui/empty_progress_bar"},
new Object[] {"textures/ui/experiencebarempty"},
new Object[] {"textures/ui/experience_bar_empty_blue"}
}},
new Object[] {69, new Object[] {
new Object[] {"textures/gui/achievements/hotdogfull"},
new Object[] {"textures/ui/experiencebarfull"}
}},
new Object[] {69, new Object[] {
new Object[] {"textures/ui/experience_bar_full_blue", new Color(112, 215, 225)},
new Object[] {"textures/ui/experience_bar_full_white", new Color(236, 236, 236)},
new Object[] {"textures/ui/filled_progress_bar", new Color(236, 236, 236)}
}},
new Object[] {89, new Object[] {
new Object[] {"textures/ui/horse_jump_full"}
}}
},
new String[] {
"textures/gui/achievements/nub.png",
"textures/ui/experiencenub.png",
"textures/ui/experience_bar_nub_blue.png"
}
});
}
public BarConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
int factorDetect = (int) context.data()[1];
Object[] bars = (Object[]) context.data()[2];
String[] nubs = (String[]) context.data()[3];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.ensureMinWidth(fromImage, factorDetect);
int factor = (fromImage.getWidth() / factorDetect);
ObjectMapper mapper = new ObjectMapper().enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
JsonNode metadata = mapper.readTree("{nineslice_size: [1, 0, 1, 0], base_size: [182, 5]}");
for (Object bar : bars) {
Object[] barArr = (Object[]) bar;
int y = (int) barArr[0];
Object[] tos = (Object[]) barArr[1];
BufferedImage toImage = ImageUtils.crop(fromImage, 0, (y * factor), (182 * factor), (5 * factor));
for (Object to : tos) {
Object[] toArr = (Object[]) to;
String toPath = (String) toArr[0];
Color color = toArr.length > 1 && toArr[1] != null ? (Color) toArr[1] : Color.white;
context.log(String.format("Convert bar %s", toPath));
ImageUtils.write(ImageUtils.colorize(toImage, color), "png", storage.resolve(toPath + ".png").toFile());
mapper.writeValue(storage.resolve(toPath + ".json").toFile(), metadata);
}
}
BufferedImage transparentImage = new BufferedImage(factor, (5 * factor), BufferedImage.TYPE_INT_ARGB);
for (String nub : nubs) {
context.log(String.format("Convert bar %s", nub));
ImageUtils.write(transparentImage, "png", storage.resolve(nub).toFile());
}
} catch (IOException e) { e.printStackTrace(); }
return new ArrayList<>();
}
}

View File

@@ -1,90 +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 BeeConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/bee/bee.png"});
defaultData.add(new Object[] {"textures/entity/bee/bee_angry.png"});
defaultData.add(new Object[] {"textures/entity/bee/bee_angry_nectar.png"});
defaultData.add(new Object[] {"textures/entity/bee/bee_nectar.png"});
}
public BeeConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert bee %s", from));
BufferedImage fromImage = ImageIO.read(fromFile);
int factor = fromImage.getWidth() / 64;
if (ImageUtils.isEmptyArea(fromImage, (15 * factor), (24 * factor), (7 * factor), (6 * factor))) {
Graphics g = fromImage.getGraphics();
g.drawImage(ImageUtils.flip(ImageUtils.crop(fromImage, (8 * factor), (18 * factor), (7 * factor), (6 * factor)), true, false), (15 * factor), (24 * factor), null);
ImageUtils.write(fromImage, "png", fromFile);
}
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,135 +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.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@AutoService(Converter.class)
public class CopyConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
// Battern
defaultData.add(new String[] {"textures/entity/banner/banner_pattern_illager.tga", "textures/entity/banner/banner_illager.tga"});
// Beef
defaultData.add(new String[] {"textures/items/beef_cooked.png", "textures/items/hoglin_meat_cooked.png"});
defaultData.add(new String[] {"textures/items/beef_raw.png", "textures/items/hoglin_meat_raw.png"});
// Cat
defaultData.add(new String[] {"textures/entity/cat/redtabby.png","textures/entity/cat/red.png"});
defaultData.add(new String[] {"textures/entity/cat/siamesecat.png", "textures/entity/cat/siamese.png"});
defaultData.add(new String[] {"textures/entity/cat/tuxedo.png", "textures/entity/cat/blackcat.png"});
// Cartography table
defaultData.add(new String[] {"textures/blocks/cartography_table_top.png", "textures/ui/cartography_table_empty.png"});
// Command block
defaultData.add(new String[] {"textures/blocks/command_block_back_mipmap.png", "textures/blocks/command_block.png"});
// Compass & clock
defaultData.add(new String[] {"textures/items/compass_atlas.png", "textures/items/lodestonecompass_atlas.png"});
defaultData.add(new String[] {"textures/items/compass_item.png", "textures/items/lodestonecompass_item.png"});
// Fire
defaultData.add(new String[] {"textures/blocks/fire_0.png", "textures/flame_atlas.png"});
// Kelp
defaultData.add(new String[] {"textures/blocks/kelp_a.tga", "textures/blocks/kelp_b.tga"});
defaultData.add(new String[] {"textures/blocks/kelp_a.tga", "textures/blocks/kelp_c.tga"});
defaultData.add(new String[] {"textures/blocks/kelp_a.tga", "textures/blocks/kelp_d.tga"});
defaultData.add(new String[] {"textures/blocks/kelp_top.tga", "textures/blocks/kelp_top_bulb.tga"});
// Lever
defaultData.add(new String[] {"textures/blocks/lever.png", "textures/items/lever.png"});
// Llama
defaultData.add(new String[] {"textures/entity/llama/llama_creamy.png", "textures/entity/llama/llama.png"});
// Pattern
defaultData.add(new String[] {"textures/items/skull_banner_pattern.png", "textures/items/banner_pattern.png"});
// Skull
defaultData.add(new String[] {"textures/entity/creeper/creeper.png", "textures/entity/skulls/creeper.png"});
defaultData.add(new String[] {"textures/entity/skeleton/skeleton.png", "textures/entity/skulls/skeleton.png"});
defaultData.add(new String[] {"textures/entity/skeleton/wither_skeleton.png", "textures/entity/skulls/wither_skeleton.png"});
defaultData.add(new String[] {"textures/entity/zombie/zombie.png", "textures/entity/skulls/zombie.png"});
// UI
defaultData.add(new String[] {"textures/blocks/brick.png", "textures/ui/icon_recipe_construction.png"});
defaultData.add(new String[] {"textures/blocks/chest_front.png", "textures/ui/inventory_icon.png"});
defaultData.add(new String[] {"textures/blocks/grass_side_carried.png", "textures/ui/icon_recipe_nature.png"});
defaultData.add(new String[] {"textures/items/book_normal.png", "textures/ui/creative_icon.png"});
defaultData.add(new String[] {"textures/items/bed_red.png", "textures/ui/icon_recipe_item.png"});
defaultData.add(new String[] {"textures/items/compass_item.png", "textures/ui/magnifyingGlass.png"});
defaultData.add(new String[] {"textures/items/diamond_sword.png", "textures/ui/icon_recipe_equipment.png"});
defaultData.add(new String[] {"textures/items/empty_armor_slot_boots.png", "textures/ui/empty_armor_slot_boots.png"});
defaultData.add(new String[] {"textures/items/empty_armor_slot_chestplate.png", "textures/ui/empty_armor_slot_chestplate.png"});
defaultData.add(new String[] {"textures/items/empty_armor_slot_helmet.png", "textures/ui/empty_armor_slot_helmet.png"});
defaultData.add(new String[] {"textures/items/empty_armor_slot_leggings.png", "textures/ui/empty_armor_slot_leggings.png"});
defaultData.add(new String[] {"textures/items/empty_armor_slot_shield.png", "textures/ui/empty_armor_slot_shield.png"});
// Wither
defaultData.add(new String[] {"textures/entity/creeper/creeper_armor.png", "textures/entity/wither_boss/wither_armor_blue.png"});
defaultData.add(new String[] {"bedrock_textures/", "textures/"});
}
public CopyConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
if (!storage.resolve(from).toFile().exists()) {
return new ArrayList<>();
}
context.log(String.format("Copy %s to %s", from, to));
Files.copy(storage.resolve(from), storage.resolve(to));
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,95 +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.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@AutoService(Converter.class)
public class DeleteConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"assets/"});
defaultData.add(new Object[] {"textures/blocks/conduit.png"});
defaultData.add(new Object[] {"textures/entity/conduit/break_particle.png"});
defaultData.add(new Object[] {"textures/blocks/dried_kelp_bottom.png"});
defaultData.add(new Object[] {"textures/blocks/water_overlay.png"});
defaultData.add(new Object[] {"textures/entity/cat/cat_collar.png"});
defaultData.add(new Object[] {"textures/entity/wolf/wolf_collar.png"});
defaultData.add(new Object[] {"bedrock_textures/"});
}
public DeleteConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Delete %s", from));
if (fromFile.isDirectory()) {
deleteDirectory(fromFile);
} else {
Files.delete(fromFile.toPath());
}
} catch (IOException e) { }
return new ArrayList<>();
}
private void deleteDirectory(File directoryToBeDeleted) {
File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) {
for (File file : allContents) {
deleteDirectory(file);
}
}
directoryToBeDeleted.delete();
}
}

View File

@@ -1,142 +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 DespriteConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {
"textures/gui/recipe_button.png",
256,
new Object[] {
new Object[] {0, 0, 20, 18, "textures/ui/recipe_book_icon.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/widgets.png",
256,
new Object[] {
new Object[] {0, 0, 1, 22, "textures/ui/hotbar_start_cap.png"},
new Object[] {1, 0, 20, 22, "textures/ui/hotbar_0.png"},
new Object[] {21, 0, 20, 22, "textures/ui/hotbar_1.png"},
new Object[] {41, 0, 20, 22, "textures/ui/hotbar_2.png"},
new Object[] {61, 0, 20, 22, "textures/ui/hotbar_3.png"},
new Object[] {81, 0, 20, 22, "textures/ui/hotbar_4.png"},
new Object[] {101, 0, 20, 22, "textures/ui/hotbar_5.png"},
new Object[] {121, 0, 20, 22, "textures/ui/hotbar_6.png"},
new Object[] {141, 0, 20, 22, "textures/ui/hotbar_7.png"},
new Object[] {161, 0, 20, 22, "textures/ui/hotbar_8.png"},
new Object[] {181, 0, 1, 22, "textures/ui/hotbar_end_cap.png"},
new Object[] {0, 22, 24, 24, "textures/ui/selected_hotbar_slot.png", new int[] {4, 4, 16, 16}}
}
});
defaultData.add(new Object[] {
"textures/gui/container/cartography_table.png",
256,
new Object[] {
new Object[] {176, 0, 66, 66, "textures/ui/cartography_table_map.png"},
new Object[] {176, 66, 66, 66, "textures/ui/cartography_table_zoom.png"},
new Object[] {176, 132, 50, 50, "textures/ui/cartography_table_copy.png"},
new Object[] {0, 166, 66, 66, "textures/ui/cartography_table_glass.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/inventory.png",
256,
new Object[] {
new Object[] {141, 166, 24, 24, "textures/ui/hud_mob_effect_background.png"}
}
});
}
public DespriteConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
int factorDetect = (int) context.data()[1];
Object[] sprites = (Object[]) context.data()[2];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.ensureMinWidth(fromImage, factorDetect);
int factor = (fromImage.getWidth() / factorDetect);
for (Object sprite : sprites) {
Object[] spriteArr = (Object[]) sprite;
int x = (int) spriteArr[0];
int y = (int) spriteArr[1];
int width = (int) spriteArr[2];
int height = (int) spriteArr[3];
String to = (String) spriteArr[4];
int[] emptyOverlay = spriteArr.length > 5 ? (int[]) spriteArr[5] : null;
context.log(String.format("Desprite %s", to));
BufferedImage spriteImage = ImageUtils.crop(fromImage, (x * factor), (y * factor), (width * factor), (height * factor));
if (emptyOverlay != null) {
Graphics g = spriteImage.getGraphics();
g.setColor(new Color(Color.TRANSLUCENT, true));
g.fillRect((emptyOverlay[0] * factor), (emptyOverlay[1] * factor), (emptyOverlay[2] * factor), (emptyOverlay[3] * factor));
}
ImageUtils.write(spriteImage, "png", storage.resolve(to).toFile());
}
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,229 +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 DespriteExperimentalConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {
"textures/gui/recipe_book.png",
256,
new Object[] {
new Object[] {152, 41, 26, 16, "textures/ui/craft_toggle_off.png"},
new Object[] {152, 59, 26, 16, "textures/ui/craft_toggle_off_hover.png"},
new Object[] {180, 41, 26, 16, "textures/ui/craft_toggle_on.png"},
new Object[] {180, 59, 26, 16, "textures/ui/craft_toggle_on_hover.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/widgets.png",
256,
new Object[] {
new Object[] {0, 22, 24, 24, "textures/ui/pocket_ui_highlight_selected_slot.png", null, new int[] {4, 4, 16, 16}},
new Object[] {0, 22, 24, 24, "textures/ui/pocket_ui_highlight_slot.png", null, new int[] {4, 4, 16, 16}}
}
});
defaultData.add(new Object[] {
"textures/gui/container/anvil.png",
256,
new Object[] {
new Object[] {99, 45, 22, 15, "textures/ui/arrow_large.png"},
new Object[] {17, 7, 30, 30, "textures/ui/anvil_icon.png"},
new Object[] {53, 49, 13, 13, "textures/ui/anvil-plus.png"},
new Object[] {176, 0, 28, 21, "textures/ui/crossout.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/beacon.png",
256,
new Object[] {
new Object[] {58, 108, 5, 18, "textures/ui/beacon_item_seperator_pocket.png"},
new Object[] {58, 108, 5, 18, "textures/ui/item_seperator.png"},
new Object[] {18, 22, 19, 22, "textures/ui/pyramid_level_1.png"},
new Object[] {18, 47, 19, 22, "textures/ui/pyramid_level_2.png"},
new Object[] {18, 72, 19, 22, "textures/ui/pyramid_level_3.png"},
new Object[] {158, 22, 19, 22, "textures/ui/pyramid_level_4.png"},
new Object[] {88, 219, 22, 22, "textures/ui/confirm.png"},
new Object[] {110, 219, 22, 22, "textures/ui/cancel.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/brewing_stand.png",
256,
new Object[] {
new Object[] {17, 17, 16, 16, "textures/ui/brewing_fuel_empty.png"},
new Object[] {56, 51, 16, 16, "textures/ui/bottle_empty.png"},
new Object[] {60, 43, 19, 6, "textures/ui/brewing_fuel_bar_empty.png"},
new Object[] {176, 29, 18, 4, "textures/ui/brewing_fuel_bar_full.png"},
new Object[] {63, 14, 12, 29, "textures/ui/bubbles_empty.png"},
new Object[] {185, 0, 12, 29, "textures/ui/bubbles_full.png"},
new Object[] {34, 28, 26, 20, "textures/ui/brewing_fuel_pipes.png"},
new Object[] {73, 34, 28, 23, "textures/ui/brewing_pipes.png"},
new Object[] {73, 34, 28, 23, "textures/ui/brewing_pipes_large.png"},
new Object[] {97, 16, 9, 28, "textures/ui/brewing_arrow_empty.png"},
new Object[] {97, 16, 9, 28, "textures/ui/brewing_arrow_large_empty.png"},
new Object[] {176, 0, 9, 28, "textures/ui/brewing_arrow_full.png"},
new Object[] {176, 0, 9, 28, "textures/ui/brewing_arrow_large_full.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/enchanting_table.png",
256,
new Object[] {
new Object[] {35, 47, 16, 16, "textures/ui/lapis.png"},
new Object[] {35, 47, 16, 16, "textures/ui/lapis_image.png"},
new Object[] {3, 225, 13, 11, "textures/ui/dust_selectable_1.png"},
new Object[] {19, 225, 13, 11, "textures/ui/dust_selectable_2.png"},
new Object[] {34, 225, 13, 11, "textures/ui/dust_selectable_3.png"},
new Object[] {3, 241, 13, 11, "textures/ui/dust_unselectable_1.png"},
new Object[] {19, 241, 13, 11, "textures/ui/dust_unselectable_2.png"},
new Object[] {34, 241, 13, 11, "textures/ui/dust_unselectable_3.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/furnace.png",
256,
new Object[] {
new Object[] {79, 35, 24, 17, "textures/ui/arrow_inactive.png"},
new Object[] {176, 14, 24, 17, "textures/ui/arrow_active.png"},
new Object[] {56, 36, 14, 14, "textures/ui/flame_empty_image.png"},
new Object[] {176, 0, 14, 14, "textures/ui/flame_full_image.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/horse.png",
256,
new Object[] {
new Object[] {1, 221, 16, 16, "textures/ui/empty_horse_slot_armor.png"},
new Object[] {19, 221, 16, 16, "textures/ui/empty_horse_slot_saddle.png"},
new Object[] {37, 221, 16, 16, "textures/ui/empty_llama_slot_carpet.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/inventory.png",
256,
new Object[] {
new Object[] {135, 29, 16, 13, "textures/ui/arrow.png"}
}
});
defaultData.add(new Object[] {
"textures/gui/container/loom.png",
256,
new Object[] {
new Object[] {176, 0, 16, 16, "textures/ui/loom_banner_empty.png", new int[] {13, 26, 16, 16}},
new Object[] {192, 0, 16, 16, "textures/ui/loom_dye_empty.png", new int[] {33, 26, 16, 16}},
new Object[] {208, 0, 16, 16, "textures/ui/loom_pattern_item_empty.png", new int[] {23, 45, 16, 16}}
}
});
defaultData.add(new Object[] {
"textures/gui/container/smithing.png",
256,
new Object[] {
new Object[] {17, 7, 30, 30, "textures/ui/smithing_icon.png"},
new Object[] {53, 49, 13, 13, "textures/ui/smithing-table-plus.png"},
new Object[] {76, 47, 16, 16, "textures/ui/ingot_image.png"}
}
});
}
public DespriteExperimentalConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
int factorDetect = (int) context.data()[1];
Object[] sprites = (Object[]) context.data()[2];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.ensureMinWidth(fromImage, factorDetect);
int factor = (fromImage.getWidth() / factorDetect);
for (Object sprite : sprites) {
Object[] spriteArr = (Object[]) sprite;
int x = (int) spriteArr[0];
int y = (int) spriteArr[1];
int width = (int) spriteArr[2];
int height = (int) spriteArr[3];
String to = (String) spriteArr[4];
int[] emptyOverlayAlt = spriteArr.length > 5 ? (int[]) spriteArr[5] : null;
int[] emptyOverlay = spriteArr.length > 6 ? (int[]) spriteArr[6] : null;
context.log(String.format("Desprite %s (Experimental)", to));
BufferedImage spriteImage = ImageUtils.crop(fromImage, (x * factor), (y * factor), (width * factor), (height * factor));
if (emptyOverlayAlt != null && ImageUtils.isEmptyArea(spriteImage, 0, 0, spriteImage.getWidth(), spriteImage.getHeight())) {
spriteImage = ImageUtils.crop(spriteImage, (emptyOverlayAlt[0] * factor), (emptyOverlayAlt[1] * factor), (emptyOverlayAlt[2] * factor), (emptyOverlayAlt[3] * factor));
}
if (emptyOverlay != null) {
Graphics g = spriteImage.getGraphics();
g.setColor(new Color(Color.TRANSLUCENT, true));
g.fillRect((emptyOverlay[0] * factor), (emptyOverlay[1] * factor), (emptyOverlay[2] * factor), (emptyOverlay[3] * factor));
}
ImageUtils.write(spriteImage, "png", storage.resolve(to).toFile());
}
} catch (IOException e) { }
return new ArrayList<>();
}
@Override
public boolean isExperimental() {
return true;
}
}

View File

@@ -1,98 +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 DestroyStageConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/environment/destroy_stage_0.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_1.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_2.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_3.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_4.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_5.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_6.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_7.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_8.png"});
defaultData.add(new Object[] {"textures/environment/destroy_stage_9.png"});
}
public DestroyStageConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert destroy stage %s", from));
BufferedImage fromImage = ImageIO.read(fromFile);
Color blank = new Color(255, 255, 255, 0);
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.getAlpha() == 0) {
fromImage.setRGB(x, y, blank.getRGB());
}
}
}
ImageUtils.write(fromImage, "png", fromFile);
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,145 +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.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
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.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 DialogConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {
"textures/gui/container/generic_54.png",
256,
new Object[] {
new Object[] {0, 0, 176, 222, new int[] {7, 17, 7, 7}, new Object[] {
new Object[] {"textures/ui/achievements_dialog", new int[] {6, 20, 6, 6}},
new Object[] {"textures/ui/dialog_background_hollow_1", new int[] {8, 23, 8, 76}},
new Object[] {"textures/ui/dialog_background_hollow_2", new int[] {8, 23, 8, 42}},
new Object[] {"textures/ui/dialog_background_hollow_3", new int[] {8, 23, 8, 8}},
new Object[] {"textures/ui/dialog_background_hollow_4", new int[] {8, 8, 8, 8}},
new Object[] {"textures/ui/dialog_background_hollow_4_thin", new int[] {6, 6, 6, 6}},
new Object[] {"textures/ui/dialog_background_hollow_5", new int[] {8, 17, 8, 42}},
new Object[] {"textures/ui/dialog_background_hollow_6", new int[] {8, 23, 8, 104}},
new Object[] {"textures/ui/dialog_background_hollow_7", new int[] {8, 66, 8, 8}},
new Object[] {"textures/ui/dialog_background_hollow_8", new int[] {8, 8, 33, 33}},
new Object[] {"textures/ui/dialog_background_opaque", new int[] {4, 4, 4, 4}},
new Object[] {"textures/ui/dialog_background_opaque_overlap_bottom", new int[] {4, 4, 4, 4}},
new Object[] {"textures/ui/menubackground", new int[] {4, 4, 4, 4}},
new Object[] {"textures/ui/thin_dialog", new int[] {5, 5, 5, 5}}
}}
}
});
}
public DialogConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
int factorDetect = (int) context.data()[1];
Object[] dialogs = (Object[]) context.data()[2];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.ensureMinWidth(fromImage, factorDetect);
int factor = (fromImage.getWidth() / factorDetect);
ObjectMapper mapper = new ObjectMapper().enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
for (Object dialog : dialogs) {
Object[] dialogArr = (Object[]) dialog;
int x = (int) dialogArr[0];
int y = (int) dialogArr[1];
int width = (int) dialogArr[2];
int height = (int) dialogArr[3];
int[] sizes = (int[]) dialogArr[4];
Object[] tos = (Object[]) dialogArr[5];
for (int i = 0; i < sizes.length; i++) {
sizes[i] = sizes[i] * factor;
}
BufferedImage dialogImage = ImageUtils.crop(fromImage, (x * factor), (y * factor), (width * factor), (height * factor));
for (Object to : tos) {
Object[] toArr = (Object[]) to;
String toPath = (String) toArr[0];
int[] toSizes = (int[]) toArr[1];
for (int i = 0; i < toSizes.length; i++) {
toSizes[i] = toSizes[i] * factor;
}
BufferedImage toImage = new BufferedImage((toSizes[0] + toSizes[2] + (6 * factor)), (toSizes[1] + toSizes[3] + (6 * factor)), BufferedImage.TYPE_INT_ARGB);
Graphics g = toImage.getGraphics();
// TODO: Fix and finish this
g.drawImage(ImageUtils.borderImage(ImageUtils.crop(dialogImage, sizes[0], sizes[1]), (2 * factor), (2 * factor), (2 * factor), (2 * factor), toSizes[0], toSizes[1]), 0, 0, null);
JsonNode metadata = mapper.readTree("{nineslice_size: " + mapper.writeValueAsString(toSizes) + ", base_size: [" + (toImage.getWidth() / factor) + ", " + (toImage.getHeight() / factor) + "]}");
context.log(String.format("Convert dialog %s (Experimental)", toPath));
ImageUtils.write(toImage, "png", storage.resolve(toPath + ".png").toFile());
mapper.writeValue(storage.resolve(toPath + ".json").toFile(), metadata);
}
}
} catch (IOException e) { e.printStackTrace(); }
return new ArrayList<>();
}
}

View File

@@ -1,129 +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 DolphinConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/dolphin.png"});
}
public DolphinConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String from = (String) context.data()[0];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return delete;
}
context.log("Convert dolphin");
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.ensureMinWidth(fromImage, 64);
int factor = fromImage.getWidth() / 64;
BufferedImage newImage = new BufferedImage((64 * factor), (64 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
// Nose
g.drawImage(ImageUtils.crop(fromImage, 0, (13 * factor), (12 * factor), (6 * factor)), 0, (13 * factor), null);
// Head
g.drawImage(ImageUtils.crop(fromImage, 0, 0, (28 * factor), (13 * factor)), 0, 0, null);
// Body
g.drawImage(ImageUtils.crop(fromImage, (35 * factor), 0, (16 * factor), (13 * factor)), (13 * factor), (13 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (22 * factor), (13 * factor), (42 * factor), (7 * factor)), 0, (26 * factor), null);
// Tail 1
g.drawImage(ImageUtils.crop(fromImage, (11 * factor), (19 * factor), (8 * factor), (11 * factor)), (11 * factor), (33 * factor), null);
g.drawImage(ImageUtils.crop(fromImage,0, (30 * factor), (30 * factor), (5 * factor)), 0, (44 * factor), null);
// Tail 2
g.drawImage(ImageUtils.crop(fromImage, (19 * factor), (20 * factor), (32 * factor), (7 * factor)), 0, (49 * factor), null);
// Top
g.drawImage(ImageUtils.crop(fromImage, (62 * factor), (5 * factor), factor, (4 * factor)), (33 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (56 * factor), (5 * factor), factor, (4 * factor)), (34 * factor), 0, null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (51 * factor), (5 * factor), (5 * factor), (4 * factor)),-90), (29 * factor), (4 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (56 * factor), 0, factor, (5 * factor)), (33 * factor), (4 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (57 * factor), (5 * factor), (5 * factor), (4 * factor)),90), (34 * factor), (4 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (57 * factor), 0, factor, (5 * factor)), (38 * factor), (4 * factor), null);
// Right
g.drawImage(ImageUtils.crop(fromImage, (56 * factor), (27 * factor), (8 * factor), (4 * factor)), (44 * factor), 0, null);
g.drawImage(ImageUtils.flip(ImageUtils.crop(fromImage, (48 * factor), (27 * factor), (8 * factor), (4 * factor)), true, false), (52 * factor), 0, null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (55 * factor), (20 * factor), factor, (7 * factor)),90), (40 * factor), (4 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (55 * factor), (20 * factor), factor, (5 * factor)),90), (47 * factor), (4 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (56 * factor), (20 * factor), factor, (7 * factor)),90), (52 * factor), (4 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (56 * factor), (20 * factor), factor, (5 * factor)),90), (59 * factor), (4 * factor), null);
// Left
g.drawImage(ImageUtils.flip(ImageUtils.crop(fromImage, (56 * factor), (27 * factor), (8 * factor), (4 * factor)), true, false), (44 * factor), (6 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (27 * factor), (8 * factor), (4 * factor)), (52 * factor), (6 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (55 * factor), (20 * factor), factor, (7 * factor)),90), (40 * factor), (10 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (55 * factor), (20 * factor), factor, (5 * factor)),90), (47 * factor), (10 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (56 * factor), (20 * factor), factor, (7 * factor)),90), (52 * factor), (10 * factor), null);
g.drawImage(ImageUtils.rotate(ImageUtils.crop(fromImage, (56 * factor), (20 * factor), factor, (5 * factor)),90), (59 * factor), (10 * factor), null);
ImageUtils.write(newImage, "png", fromFile);
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,81 +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 EnchantedItemGlintConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/misc/enchanted_item_glint.png"});
}
public EnchantedItemGlintConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert enchanted item glint %s", from));
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.saturate(fromImage, -100);
fromImage = ImageUtils.rotate(fromImage, -90);
ImageUtils.write(fromImage, "png", fromFile);
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,89 +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 FireworksConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/items/fireworks.png", "textures/entity/fireworks.png"});
}
public FireworksConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return delete;
}
context.log("Convert fireworks");
BufferedImage fromImage = ImageIO.read(fromFile);
int factor = fromImage.getWidth() / 16;
BufferedImage newImage = new BufferedImage((32 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(ImageUtils.rotate(fromImage, -90), 0, 0, null);
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,115 +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 FishHookConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/fishhook.png", "textures/entity/fishhook.png"});
}
public FishHookConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return delete;
}
context.log("Convert fishhook");
BufferedImage fromImage = ImageIO.read(fromFile);
int factor = fromImage.getWidth() / 8;
BufferedImage newImage = new BufferedImage((24 * factor), (3 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, factor, factor), 0, 0, null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, factor, factor), (2 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, factor, factor), (2 * factor), (2 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, factor, factor), 0, (2 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), factor, factor, factor), factor, 0, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), factor, factor, factor), (2 * factor), factor, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), factor, factor, factor), factor, (2 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), factor, factor, factor), 0, factor, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (4 * factor), factor, factor), factor, factor, null);
g.drawImage(ImageUtils.crop(fromImage, (5 * factor), (3 * factor), factor, factor), (3 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (5 * factor), (3 * factor), factor, factor), (5 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (5 * factor), (3 * factor), factor, factor), (5 * factor), (2 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (5 * factor), (3 * factor), factor, factor), (3 * factor), (2 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (3 * factor), factor, factor), (4 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (3 * factor), factor, factor), (5 * factor), factor, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (3 * factor), factor, factor), (4 * factor), (2 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (3 * factor), factor, factor), (3 * factor), factor, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (4 * factor), factor, factor), (4 * factor), factor, null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, (3 * factor), (3 * factor)), (6 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, (3 * factor), (3 * factor)), (9 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, (3 * factor), (3 * factor)), (12 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (3 * factor), factor, (3 * factor), (3 * factor)), (15 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (2 * factor), (5 * factor), (3 * factor), (3 * factor)), (18 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (4 * factor), factor, factor), (22 * factor), (2 * factor), null);
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,96 +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.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
@AutoService(Converter.class)
public class FixWrongRootFolderConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"pack.mcmeta", new String[] {"pack.png", "assets/", "bedrock_textures/", "bedrock_uuid_header", "bedrock_uuid_module"}});
}
public FixWrongRootFolderConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String packMcmeta = (String) context.data()[0];
String[] moveFiles = (String[]) context.data()[1];
if (storage.resolve(packMcmeta).toFile().exists()) {
return new ArrayList<>();
}
context.log(String.format("%s not found in root folder (But are needed in the root folder, even in the Java version) - Try to lookup in sub folders ...", packMcmeta));
Path rootPath = null;
for (Path filePath : Files.walk(storage).filter(Files::isRegularFile).collect(Collectors.toList())) {
if (filePath.getFileName().toString().equals(packMcmeta)) {
rootPath = filePath.getParent();
break;
}
}
if (rootPath == null) {
throw new AssertionError(String.format("%s not found! Is this really a Java texture pack?", packMcmeta));
}
context.log(String.format("Root folder found in sub folder %s", rootPath.relativize(storage).toString()));
List<String> moveFilesList = new ArrayList<>();
moveFilesList.add(packMcmeta);
moveFilesList.addAll(Arrays.asList(moveFiles));
for (String fileName : moveFilesList) {
if (rootPath.resolve(fileName).toFile().exists()) {
Files.move(rootPath.resolve(fileName), storage.resolve(fileName));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return new ArrayList<>();
}
}

View File

@@ -1,115 +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 FoxConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/fox/fox.png", "textures/entity/fox/fox_sleep.png", "textures/entity/fox/fox.png"});
defaultData.add(new Object[] {"textures/entity/fox/arctic_fox.png", "textures/entity/fox/arctic_fox_sleep.png", "textures/entity/fox/arctic_fox.png"});
}
public FoxConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String from = (String) context.data()[0];
String fromSleep = (String) context.data()[1];
String to = (String) context.data()[2];
File fromFile = storage.resolve(from).toFile();
File fromSleepFile = storage.resolve(fromSleep).toFile();
if (!fromFile.exists() || !fromSleepFile.exists()) {
return delete;
}
context.log(String.format("Convert fox %s", to));
BufferedImage fromImage = ImageIO.read(fromFile);
BufferedImage fromSleepImage = ImageIO.read(fromSleepFile);
int factor = fromImage.getWidth() / 48;
BufferedImage newImage = new BufferedImage((64 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
// Ears
g.drawImage(ImageUtils.crop(fromImage, (8 * factor), factor, (6 * factor), (3 * factor)), 0, 0, null);
g.drawImage(ImageUtils.crop(fromImage, (15 * factor), factor, (6 * factor), (3 * factor)), (22 * factor), 0, null);
// Head normal
g.drawImage(ImageUtils.crop(fromImage, factor, (5 * factor), (28 * factor), (12 * factor)), 0, 0, null);
// Head sleep
g.drawImage(ImageUtils.crop(fromSleepImage, factor, (5 * factor), (28 * factor), (12 * factor)), 0, (12 * factor), null);
// Mount
g.drawImage(ImageUtils.crop(fromImage, (6 * factor), (18 * factor), (14 * factor), (5 * factor)), 0, (24 * factor), null);
// Body
g.drawImage(ImageUtils.crop(fromImage, (24 * factor), (21 * factor), (6 * factor), (11 * factor)), (30 * factor), (21 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (30 * factor), (15 * factor), (18 * factor), (17 * factor)), (36 * factor), (15 * factor), null);
// Tail
g.drawImage(ImageUtils.crop(fromImage, (30 * factor), 0, (18 * factor), (14 * factor)), (28 * factor), 0, null);
// Legs
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (24 * factor), (8 * factor), (8 * factor)), (14 * factor), (24 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (4 * factor), (24 * factor), (8 * factor), (8 * factor)), (22 * factor), (24 * factor), null);
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,265 +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 HorseConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/horse2/donkey.png", "textures/entity/horse/donkey.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_black.png", "textures/entity/horse/horse_black.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_brown.png", "textures/entity/horse/horse_brown.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_chestnut.png", "textures/entity/horse/horse_chestnut.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_creamy.png", "textures/entity/horse/horse_creamy.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_darkbrown.png", "textures/entity/horse/horse_darkbrown.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_gray.png", "textures/entity/horse/horse_gray.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_skeleton.png", "textures/entity/horse/horse_skeleton.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_white.png", "textures/entity/horse/horse_white.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_zombie.png", "textures/entity/horse/horse_zombie.png"});
defaultData.add(new Object[] {"textures/entity/horse2/mule.png", "textures/entity/horse/mule.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_markings_blackdots.png", "textures/entity/horse/horse_markings_blackdots.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_markings_white.png", "textures/entity/horse/horse_markings_white.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_markings_whitedots.png", "textures/entity/horse/horse_markings_whitedots.png"});
defaultData.add(new Object[] {"textures/entity/horse2/horse_markings_whitefield.png", "textures/entity/horse/horse_markings_whitefield.png"});
defaultData.add(new Object[] {"textures/entity/horse2/armor/horse_armor_diamond.png", "textures/entity/horse/armor/horse_armor_diamond.png"});
defaultData.add(new Object[] {"textures/entity/horse2/armor/horse_armor_gold.png", "textures/entity/horse/armor/horse_armor_gold.png"});
defaultData.add(new Object[] {"textures/entity/horse2/armor/horse_armor_iron.png", "textures/entity/horse/armor/horse_armor_iron.png"});
defaultData.add(new Object[] {"textures/entity/horse2/armor/horse_armor_leather.png", "textures/entity/horse/armor/horse_armor_leather.png"});
}
public HorseConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return delete;
}
context.log(String.format("Convert horse %s", to));
BufferedImage fromImage = ImageIO.read(fromFile);
int factor = fromImage.getWidth() / 64;
BufferedImage newImage = new BufferedImage((fromImage.getWidth() * 2), (fromImage.getWidth() * 2), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
// Chest
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (21 * factor), (22 * factor), (11 * factor)), 0, (34 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (21 * factor), (22 * factor), (11 * factor)), 0, (47 * factor), null);
// Saddle (Gray part)
g.drawImage(ImageUtils.crop(fromImage, (29 * factor), (5 * factor), (6 * factor), (4 * factor)), (74 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (29 * factor), (5 * factor), (6 * factor), (4 * factor)), (74 * factor), (4 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (29 * factor), (5 * factor), (6 * factor), (4 * factor)), (74 * factor), (13 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (31 * factor), (5 * factor), factor, factor), (81 * factor), (26 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (31 * factor), (5 * factor), factor, factor), (87 * factor), (26 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (31 * factor), (5 * factor), factor, factor), (101 * factor), (26 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (31 * factor), (5 * factor), factor, factor), (107 * factor), (26 * factor), null);
// Saddle (Color part)
g.drawImage(ImageUtils.crop(fromImage, (35 * factor), 0, (10 * factor), (9 * factor)), (88 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (35 * factor), 0, (10 * factor), (9 * factor)), (98 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (9 * factor), (2 * factor)), (82 * factor), (9 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (7 * factor), (2 * factor)), (91 * factor), (9 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (6 * factor), (2 * factor)), (108 * factor), (9 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (8 * factor), factor), (80 * factor), (8 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (8 * factor), factor), (108 * factor), (8 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (9 * factor), factor), (80 * factor), (11 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (9 * factor), factor), (89 * factor), (11 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (2 * factor), factor), (98 * factor), (11 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (9 * factor), factor), (106 * factor), (11 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, factor), (115 * factor), (11 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (9 * factor), factor), (92 * factor), (13 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, factor), (101 * factor), (13 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (9 * factor), factor), (92 * factor), (19 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, factor), (101 * factor), (19 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (2 * factor), factor), (71 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (35 * factor), 0, (4 * factor), (6 * factor)), (70 * factor), factor, null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (2 * factor), factor), (81 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, (35 * factor), 0, (4 * factor), (6 * factor)), (80 * factor), factor, null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (3 * factor), factor), (60 * factor), (22 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (8 * factor), factor), (63 * factor), (23 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (3 * factor), factor), (71 * factor), (22 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (2 * factor), factor), (74 * factor), (21 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (3 * factor), factor), (60 * factor), (27 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (8 * factor), factor), (63 * factor), (28 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (3 * factor), factor), (71 * factor), (27 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (2 * factor), factor), (74 * factor), (26 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (81 * factor), (24 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (81 * factor), (27 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (5 * factor), factor), (82 * factor), (26 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (87 * factor), (24 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (87 * factor), (27 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (101 * factor), (24 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (101 * factor), (27 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), (5 * factor), factor), (102 * factor), (26 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (107 * factor), (24 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (26 * factor), (9 * factor), factor, (2 * factor)), (107 * factor), (27 * factor), null);
// Horse
g.drawImage(ImageUtils.crop(fromImage, 0, (54 * factor), factor, (10 * factor)), 0, (58 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (54 * factor), factor, (10 * factor)), factor, (58 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (54 * factor), (64 * factor), (10 * factor)), (2 * factor), (58 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (62 * factor), (54 * factor), factor, (10 * factor)), (66 * factor), (58 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (62 * factor), (54 * factor), factor, (10 * factor)), (67 * factor), (58 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (22 * factor), (32 * factor), (20 * factor), factor), (24 * factor), (34 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (22 * factor), (32 * factor), (20 * factor), (22 * factor)), (24 * factor), (35 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (22 * factor), (53 * factor), (20 * factor), factor), (24 * factor), (57 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (35 * factor), (22 * factor), factor), factor, (12 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (35 * factor), (22 * factor), factor), factor, (13 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (35 * factor), (22 * factor), (19 * factor)), factor, (14 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (15 * factor), (42 * factor), (7 * factor), factor), (16 * factor), (20 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (42 * factor), (7 * factor), factor), factor, (20 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (53 * factor), (22 * factor), factor), factor, (33 * factor), null);
g.drawImage(ImageUtils.crop(newImage, factor, (20 * factor), factor, (14 * factor)), 0, (20 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (22 * factor), (20 * factor), factor, (14 * factor)), (23 * factor), (20 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (14 * factor), (8 * factor)), (44 * factor), (33 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (14 * factor), (8 * factor)), (60 * factor), (33 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (16 * factor), (8 * factor)), (79 * factor), (34 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (32 * factor), (16 * factor), factor), (79 * factor), (42 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (79 * factor), (34 * factor), factor, (9 * factor)), (78 * factor), (34 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (94 * factor), (34 * factor), factor, (9 * factor)), (95 * factor), (34 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (78 * factor), (34 * factor), (18 * factor), (9 * factor)), (96 * factor), (34 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (52 * factor), (21 * factor), (8 * factor), (4 * factor)), (48 * factor), (51 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (52 * factor), (21 * factor), (8 * factor), (4 * factor)), (64 * factor), (51 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (52 * factor), (21 * factor), (8 * factor), (4 * factor)), (82 * factor), (51 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (52 * factor), (21 * factor), (8 * factor), (4 * factor)), (100 * factor), (51 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (33 * factor), (16 * factor), (3 * factor)), (44 * factor), (55 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (33 * factor), (16 * factor), (3 * factor)), (60 * factor), (55 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (33 * factor), (16 * factor), (3 * factor)), (78 * factor), (55 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (33 * factor), (16 * factor), (3 * factor)), (96 * factor), (55 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (12 * factor), (6 * factor), (8 * factor)), 0, (12 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (7 * factor), (13 * factor), (10 * factor), (8 * factor)), (7 * factor), 0, null);
g.drawImage(ImageUtils.crop(fromImage, 0, (20 * factor), (9 * factor), (5 * factor)), 0, (7 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (10 * factor), (20 * factor), (14 * factor), (5 * factor)), (9 * factor), (7 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (25 * factor), (20 * factor), factor, (5 * factor)), (23 * factor), (7 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (25 * factor), (18 * factor), factor), (25 * factor), (18 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (25 * factor), (18 * factor), (8 * factor)), (25 * factor), (19 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (25 * factor), factor, (8 * factor)), (24 * factor), (19 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (25 * factor), factor, (8 * factor)), (43 * factor), (19 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (25 * factor), (18 * factor), (5 * factor)), (24 * factor), (27 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, 0, (33 * factor), (18 * factor), (2 * factor)), (24 * factor), (32 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (4 * factor)), (48 * factor), (29 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (4 * factor)), (64 * factor), (29 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (78 * factor), (34 * factor), (8 * factor), (5 * factor)), (83 * factor), (29 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (78 * factor), (34 * factor), (8 * factor), (5 * factor)), (101 * factor), (29 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (3 * factor)), (47 * factor), (41 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (3 * factor)), (63 * factor), (41 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (3 * factor)), (81 * factor), (43 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (3 * factor)), (99 * factor), (43 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (44 * factor), (44 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (50 * factor), (44 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (60 * factor), (44 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (66 * factor), (44 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (78 * factor), (46 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (84 * factor), (46 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (96 * factor), (46 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (6 * factor), (5 * factor)), (102 * factor), (46 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (48 * factor), (25 * factor), (4 * factor), (3 * factor)), (47 * factor), 0, null);
g.drawImage(ImageUtils.crop(newImage, (78 * factor), (34 * factor), factor, (2 * factor)), (44 * factor), (3 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (78 * factor), (34 * factor), (8 * factor), (2 * factor)), (45 * factor), (3 * factor), null);
g.drawImage(ImageUtils.crop(newImage, (85 * factor), (34 * factor), factor, (2 * factor)), (53 * factor), (3 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (42 * factor), (40 * factor), (6 * factor), (7 * factor)), (45 * factor), (7 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (42 * factor), (40 * factor), (10 * factor), (4 * factor)), (38 * factor), (14 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (42 * factor), (40 * factor), (10 * factor), (4 * factor)), (48 * factor), (14 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (42 * factor), (40 * factor), (6 * factor), (5 * factor)), (31 * factor), (5 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (42 * factor), (40 * factor), (13 * factor), (4 * factor)), (26 * factor), (10 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (43 * factor), (52 * factor), (2 * factor), (2 * factor)), (39 * factor), (11 * factor), null);
g.drawImage(ImageUtils.flip(ImageUtils.crop(fromImage, (43 * factor), (52 * factor), (2 * factor), (2 * factor)), true, false), (24 * factor), (11 * factor), null);
g.drawImage(ImageUtils.flip(ImageUtils.flip(ImageUtils.crop(fromImage, (43 * factor), (52 * factor), (2 * factor), (2 * factor)), true, false), false, true), (31 * factor), (3 * factor), null);
g.drawImage(ImageUtils.flip(ImageUtils.flip(ImageUtils.crop(fromImage, (43 * factor), (52 * factor), (2 * factor), (2 * factor)), true, false), false, true), (34 * factor), (3 * factor), null);
g.drawImage(ImageUtils.crop(fromImage, (19 * factor), (16 * factor), (6 * factor), (4 * factor)), 0, 0, null);
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,88 +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 IconsConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/gui/icons.png"});
}
public IconsConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File iconsFile = storage.resolve(from).toFile();
if (!iconsFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert icons %s", from));
BufferedImage iconsImage = ImageIO.read(iconsFile);
for (int x = 0; x < iconsImage.getWidth(); x++) {
for (int y = 0; y < iconsImage.getHeight(); y++) {
Color c = new Color(iconsImage.getRGB(x, y), true);
if (c.getAlpha() == 0) {
iconsImage.setRGB(x, y, Color.TRANSLUCENT);
}
}
}
ImageUtils.write(iconsImage, "png", iconsFile);
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,105 +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 MapIconsConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/map/map_icons.png", "textures/map/map_icons.png"});
}
public MapIconsConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File iconsFile = storage.resolve(from).toFile();
if (!iconsFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert map icons %s", to));
BufferedImage iconsImage = ImageIO.read(iconsFile);
int factor = iconsImage.getWidth() / 128;
BufferedImage newIconsImage = new BufferedImage((64 * factor), (64 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newIconsImage.getGraphics();
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, 0, 0, (8 * factor), (8 * factor)), 2f), -factor, factor, null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (8 * factor), 0, (8 * factor), (8 * factor)), 2f), (15 * factor), factor, null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (16 * factor), 0, (8 * factor), (8 * factor)), 2f), (31 * factor), factor, null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (24 * factor), 0, (8 * factor), (8 * factor)), 2f), (47 * factor), factor, null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (80 * factor), (8 * factor), (8 * factor), (8 * factor)), 2f), 0, (16 * factor), null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (40 * factor), 0, (8 * factor), (8 * factor)), 2f), (15 * factor), (16 * factor), null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (48 * factor), 0, (8 * factor), (8 * factor)), 2f), (32 * factor), (16 * factor), null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (48 * factor), (8 * factor), (8 * factor), (8 * factor)), 2f), (48 * factor), (16 * factor), null); // Alternative icon
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (96 * factor), 0, (8 * factor), (8 * factor)), 2f), 0, (32 * factor), null); // Alternative icon
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (88 * factor), 0, (8 * factor), (8 * factor)), 2f), (16 * factor), (32 * factor), null); // Alternative icon
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (112 * factor), 0, (8 * factor), (8 * factor)), 2f), (32 * factor), (32 * factor), null); // Alternative icon
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (24 * factor), (8 * factor), (8 * factor), (8 * factor)), 2f), (48 * factor), (32 * factor), null); // Alternative icon
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (120 * factor), 0, (8 * factor), (8 * factor)), 2f), 0, (48 * factor), null); // Alternative icon
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (56 * factor), 0, (8 * factor), (8 * factor)), 2f), (15 * factor), (48 * factor), null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (64 * factor), 0, (8 * factor), (8 * factor)), 2f), (32 * factor), (48 * factor), null);
g.drawImage(ImageUtils.scale(ImageUtils.crop(iconsImage, (72 * factor), 0, (8 * factor), (8 * factor)), 2f), (48 * factor), (48 * factor), null);
ImageUtils.write(newIconsImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,309 +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.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
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 NineSliceConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {
"textures/gui/recipe_book.png",
256,
new Object[] {
new Object[] {54, 206, 24, 24, 5, new String[] {
"textures/ui/cell_image_red",
"textures/ui/recipe_book_red_button",
"textures/ui/recipe_book_red_button_pressed",
"textures/ui/button_trade_red",
"textures/ui/button_trade_red_pressed"
}}
},
new String[0]
});
defaultData.add(new Object[] {
"textures/gui/widgets.png",
256,
new Object[] {
new Object[] {0, 46, 200, 20, 5, new String[] {
"textures/ui/button_borderless_darkpressednohover",
"textures/ui/button_borderless_lightpressednohover",
"textures/ui/disabledButtonNoBorder",
"textures/ui/recipe_book_button_borderless_lightpressednohover"
}},
new Object[] {0, 66, 200, 20, 5, new String[] {
"textures/ui/button_borderless_dark",
"textures/ui/button_borderless_light",
"textures/ui/pocket_button_default",
"textures/ui/recipe_book_button_borderless_light",
"textures/ui/recipe_book_dark_button",
"textures/ui/recipe_book_light_button"
}},
new Object[] {0, 86, 200, 20, 5, new String[] {
"textures/ui/button_borderless_darkhover",
"textures/ui/button_borderless_darkpressed",
"textures/ui/button_borderless_lighthover",
"textures/ui/button_borderless_lightpressed",
"textures/ui/pocket_button_hover",
"textures/ui/pocket_button_pressed",
"textures/ui/recipe_book_button_borderless_lighthover",
"textures/ui/recipe_book_button_borderless_lightpressed",
"textures/ui/recipe_book_dark_button_pressed",
"textures/ui/recipe_book_light_button_pressed"
}},
new Object[] {0, 22, 24, 24, 5, new String[] {
"textures/ui/cell_image_invert"
}}
},
new String[] {
"textures/ui/focus_border_selected",
"textures/ui/focus_border_white",
"textures/ui/pack_borders",
"textures/ui/pause_screen_border",
"textures/ui/square_image_border_white",
"textures/ui/world_screenshot_focus_border"
}
});
defaultData.add(new Object[] {
"textures/gui/container/beacon.png",
256,
new Object[] {
new Object[] {0, 219, 22, 22, 5, new String[] {
"textures/ui/beacon_button_default"
}},
new Object[] {22, 219, 22, 22, 5, new String[] {
"textures/ui/beacon_button_pressed"
}},
new Object[] {44, 219, 22, 22, 5, new String[] {
"textures/ui/beacon_button_locked"
}},
new Object[] {66, 219, 22, 22, 5, new String[] {
"textures/ui/beacon_button_hover"
}}
},
new String[0]
});
defaultData.add(new Object[] {
"textures/gui/container/enchanting_table.png",
256,
new Object[] {
new Object[] {0, 166, 108, 19, 5, new String[] {
"textures/ui/enchanting_active_background"
}},
new Object[] {0, 185, 108, 19, 5, new String[] {
"textures/ui/enchanting_dark_background"
}},
new Object[] {0, 204, 108, 19, 5, new String[] {
"textures/ui/enchanting_active_background_with_hover_text"
}}
},
new String[0]
});
defaultData.add(new Object[] {
"textures/gui/container/generic_54.png",
256,
new Object[] {
new Object[] {7, 17, 18, 18, 5, new String[] {
"textures/ui/cell_image",
"textures/ui/cell_image_normal",
"textures/ui/item_cell",
"textures/ui/recipe_book_item_bg"
}},
new Object[] {2, 2, 1, 1, 0, new String[] {
"textures/ui/dialog_divider",
"textures/ui/divider",
"textures/ui/divider2",
"textures/ui/divider3",
"textures/ui/HowToPlayDivider",
"textures/ui/lightgreybars",
"textures/ui/list_item_divider_line_light",
"textures/ui/StoreTopBar",
"textures/ui/StoreTopBarFiller"
}}
},
new String[] {
"textures/ui/recipe_book_pane_bg",
"textures/ui/recipe_book_touch_cell_selected"
}
});
defaultData.add(new Object[] {
"textures/gui/container/inventory.png",
256,
new Object[] {
new Object[] {25, 7, 51, 72, 5, new String[] {
"textures/ui/player_preview_border"
}}
},
new String[0]
});
defaultData.add(new Object[] {
"textures/gui/container/creative_inventory/tab_item_search.png",
256,
new Object[] {
new Object[] {80, 4, 90, 12, 5, new String[] {
"textures/ui/edit_box_indent",
"textures/ui/edit_box_indent_hover"
}}
},
new String[0]
});
defaultData.add(new Object[] {
"textures/gui/container/creative_inventory/tabs.png",
256,
new Object[] {
new Object[] {0, 0, 28, 32, 5, new String[] {
"textures/ui/pocket_tab_left_side",
"textures/ui/recipe_book_side_toggle_dark",
"textures/ui/TabLeftBack",
"textures/ui/TabLeftBackBottomMost",
"textures/ui/TabLeftBackTopMost",
"textures/ui/TabTopBackLeftMost"
}},
new Object[] {28, 0, 28, 32, 5, new String[] {
"textures/ui/recipe_back_panel",
"textures/ui/TabTopBack",
"textures/ui/toolbar_background"
}},
new Object[] {140, 0, 28, 32, 5, new String[] {
"textures/ui/pocket_tab_right_side",
"textures/ui/TabRightBack",
"textures/ui/TabRightBackBottomMost",
"textures/ui/TabRightBackTopMost",
"textures/ui/TabTopBackRightMost",
"textures/ui/TabTopBackRightMostDark",
"textures/ui/XTab"
}},
new Object[] {0, 32, 28, 32, 5, new String[] {
"textures/ui/recipe_book_side_toggle_dark_hover",
"textures/ui/TabLeftFront",
"textures/ui/TabLeftFrontBottomMost",
"textures/ui/TabLeftFrontTopMost",
"textures/ui/TabTopFrontLeftMost"
}},
new Object[] {28, 32, 28, 32, 5, new String[] {
"textures/ui/TabTopFront"
}},
new Object[] {140, 32, 28, 32, 5, new String[] {
"textures/ui/TabRightFront",
"textures/ui/TabRightFrontBottomMost",
"textures/ui/TabRightFrontTopMost",
"textures/ui/TabTopFrontRightMost",
"textures/ui/TabTopFrontRightMostDark"
}}
},
new String[0]
});
}
public NineSliceConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
int factorDetect = (int) context.data()[1];
Object[] buttons = (Object[]) context.data()[2];
String[] borders = (String[]) context.data()[3];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.ensureMinWidth(fromImage, factorDetect);
int factor = (fromImage.getWidth() / factorDetect);
ObjectMapper mapper = new ObjectMapper().enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
for (Object button : buttons) {
Object[] buttonArr = (Object[]) button;
int x = (int) buttonArr[0];
int y = (int) buttonArr[1];
int width = (int) buttonArr[2];
int height = (int) buttonArr[3];
int size = (int) buttonArr[4];
String[] tos = (String[]) buttonArr[5];
BufferedImage toImage = ImageUtils.crop(fromImage, (x * factor), (y * factor), (width * factor), (height * factor));
// image.autoCropTransparent();
JsonNode metadata = mapper.readTree("{nineslice_size: " + size + ", base_size: [" + width + ", " + height + "]}");
for (String toPath : tos) {
context.log(String.format("Convert button %s (Experimental)", toPath));
ImageUtils.write(toImage, "png", storage.resolve(toPath + ".png").toFile());
mapper.writeValue(storage.resolve(toPath + ".json").toFile(), metadata);
}
}
BufferedImage transparentImage = new BufferedImage(factor, factor, BufferedImage.TYPE_INT_ARGB);
JsonNode metadata = mapper.readTree("{nineslice_size: 0, base_size: [1, 1]}");
for (String border : borders) {
context.log(String.format("Convert button %s (Experimental)", border));
ImageUtils.write(transparentImage, "png", storage.resolve(border + ".png").toFile());
mapper.writeValue(storage.resolve(border + ".json").toFile(), metadata);
}
} catch (IOException e) { e.printStackTrace(); }
return new ArrayList<>();
}
@Override
public boolean isExperimental() {
return true;
}
}

View File

@@ -1,95 +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 OpaqueConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
// Leaves
defaultData.add(new Object[] {"textures/blocks/leaves_acacia.png", "textures/blocks/leaves_acacia_opaque.png"});
defaultData.add(new Object[] {"textures/blocks/leaves_big_oak.png", "textures/blocks/leaves_big_oak_opaque.png"});
defaultData.add(new Object[] {"textures/blocks/leaves_birch.png", "textures/blocks/leaves_birch_opaque.png"});
defaultData.add(new Object[] {"textures/blocks/leaves_jungle.png", "textures/blocks/leaves_jungle_opaque.png"});
defaultData.add(new Object[] {"textures/blocks/leaves_oak.png", "textures/blocks/leaves_oak_opaque.png"});
defaultData.add(new Object[] {"textures/blocks/leaves_spruce.png", "textures/blocks/leaves_spruce_opaque.png"});
}
public OpaqueConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Create opaque %s", to));
BufferedImage fromImage = ImageIO.read(fromFile);
BufferedImage toImage = new BufferedImage(fromImage.getWidth(), fromImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = toImage.getGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, toImage.getWidth(), toImage.getHeight());
g.drawImage(fromImage, 0, 0, null);
ImageUtils.write(toImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,167 +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 PistonArmConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/blocks/piston_top_normal.png", "textures/blocks/piston_top_normal.png", "textures/blocks/piston_side.png", "textures/entity/pistonarm/pistonArm.png"});
defaultData.add(new Object[] {"textures/blocks/piston_top_sticky.png", "textures/blocks/piston_top_normal.png", "textures/blocks/piston_side.png", "textures/entity/pistonarm/pistonArmSticky.png"});
}
public PistonArmConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String top1 = (String) context.data()[0];
String top2 = (String) context.data()[1];
String side = (String) context.data()[2];
String to = (String) context.data()[3];
File top1File = storage.resolve(top1).toFile();
File top2File = storage.resolve(top2).toFile();
File sideFile = storage.resolve(side).toFile();
if (!top1File.exists() || !top2File.exists() || !sideFile.exists()) {
return delete;
}
context.log(String.format("Create piston arm %s", to));
BufferedImage top1Image = ImageIO.read(top1File);
BufferedImage top2Image = ImageIO.read(top2File);
BufferedImage sideImage = ImageIO.read(sideFile);
top1Image = ImageUtils.ensureMinWidth(top1Image, 16);
top2Image = ImageUtils.ensureMinWidth(top2Image, 16);
sideImage = ImageUtils.ensureMinWidth(sideImage, 16);
int factor = top1Image.getWidth() / 16;
BufferedImage newImage = new BufferedImage((128 * factor), (32 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(top1Image, (16 * factor), 0, null);
g.drawImage(top2Image, (32 * factor), 0, null);
sideImage = ImageUtils.crop(sideImage, 0, 0, sideImage.getWidth(), (4 * factor));
g.drawImage(sideImage, 0, (16 * factor), null);
g.drawImage(sideImage, (16 * factor), (16 * factor), null);
g.drawImage(sideImage, (32 * factor), (16 * factor), null);
g.drawImage(sideImage, (48 * factor), (16 * factor), null);
// Arm top
BufferedImage side2Image = ImageUtils.rotate(ImageUtils.crop(sideImage, 0, 0, (8 * factor), (4 * factor)), -90);
g.drawImage(side2Image, (64 * factor), (4 * factor), null);
g.drawImage(side2Image, (68 * factor), (4 * factor), null);
g.drawImage(side2Image, (72 * factor), (4 * factor), null);
g.drawImage(side2Image, (76 * factor), (4 * factor), null);
// Arm bottom top
BufferedImage side3Image = ImageUtils.crop(side2Image, 0, (side2Image.getHeight() - factor), side2Image.getWidth(), factor);
BufferedImage side4Image = ImageUtils.crop(sideImage, (7 * factor), 0, factor, sideImage.getHeight());
BufferedImage side5Image = ImageUtils.crop(side2Image, 0, (2 * factor), side2Image.getWidth(), (4 * factor));
g.drawImage(side3Image, (70 * factor), (18 * factor), null);
g.drawImage(side3Image, (74 * factor), (18 * factor), null);
g.drawImage(side3Image, (78 * factor), (18 * factor), null);
g.drawImage(side4Image, (70 * factor), (19 * factor), null);
g.drawImage(side4Image, (75 * factor), (19 * factor), null);
g.drawImage(side4Image, (76 * factor), (19 * factor), null);
g.drawImage(side4Image, (81 * factor), (19 * factor), null);
g.drawImage(side3Image, (70 * factor), (23 * factor), null);
g.drawImage(side3Image, (74 * factor), (23 * factor), null);
g.drawImage(side3Image, (78 * factor), (23 * factor), null);
// Arm bottom
g.drawImage(side3Image, (64 * factor), (24 * factor), null);
g.drawImage(side3Image, (68 * factor), (24 * factor), null);
g.drawImage(side3Image, (72 * factor), (24 * factor), null);
g.drawImage(side3Image, (76 * factor), (24 * factor), null);
g.drawImage(side3Image, (80 * factor), (24 * factor), null);
g.drawImage(side3Image, (84 * factor), (24 * factor), null);
g.drawImage(side4Image, (64 * factor), (25 * factor), null);
g.drawImage(side4Image, (64 * factor), (29 * factor), null);
g.drawImage(side4Image, (69 * factor), (25 * factor), null);
g.drawImage(side4Image, (69 * factor), (29 * factor), null);
g.drawImage(side4Image, (70 * factor), (25 * factor), null);
g.drawImage(side4Image, (70 * factor), (29 * factor), null);
g.drawImage(side4Image, (75 * factor), (25 * factor), null);
g.drawImage(side4Image, (75 * factor), (29 * factor), null);
g.drawImage(side4Image, (76 * factor), (25 * factor), null);
g.drawImage(side4Image, (76 * factor), (29 * factor), null);
g.drawImage(side4Image, (81 * factor), (25 * factor), null);
g.drawImage(side4Image, (81 * factor), (29 * factor), null);
g.drawImage(side4Image, (82 * factor), (25 * factor), null);
g.drawImage(side4Image, (82 * factor), (29 * factor), null);
g.drawImage(side4Image, (87 * factor), (25 * factor), null);
g.drawImage(side4Image, (87 * factor), (29 * factor), null);
g.drawImage(side5Image, (65 * factor), (25 * factor), null);
g.drawImage(side5Image, (65 * factor), (29 * factor), null);
g.drawImage(side5Image, (71 * factor), (25 * factor), null);
g.drawImage(side5Image, (71 * factor), (29 * factor), null);
g.drawImage(side5Image, (77 * factor), (25 * factor), null);
g.drawImage(side5Image, (77 * factor), (29 * factor), null);
g.drawImage(side5Image, (83 * factor), (25 * factor), null);
g.drawImage(side5Image, (83 * factor), (29 * factor), null);
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,200 +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 PlaceholderConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
// Bed
defaultData.add(new Object[] {"textures/entity/bed/red.png", 2, 6, 14, 14, 64, "textures/blocks/bed_head_top.png"});
defaultData.add(new Object[] {"textures/entity/bed/red.png", 0, 6, 6, 14, 64, "textures/blocks/bed_head_side.png"});
defaultData.add(new Object[] {"textures/entity/bed/red.png", 6, 0, 14, 6, 64, "textures/blocks/bed_head_end.png"});
defaultData.add(new Object[] {"textures/entity/bed/red.png", 2, 20, 14, 14, 64, "textures/blocks/bed_feet_top.png"});
defaultData.add(new Object[] {"textures/entity/bed/red.png", 22, 0, 14, 6, 64, "textures/blocks/bed_feet_end.png"});
defaultData.add(new Object[] {"textures/entity/bed/red.png", 0, 20, 6, 14, 64, "textures/blocks/bed_feet_side.png"});
// Bed item
defaultData.add(new Object[] {"textures/entity/bed/black.png", 6, 6, 16, 32, 64, "textures/items/bed_black.png"});
defaultData.add(new Object[] {"textures/entity/bed/blue.png", 6, 6, 16, 32, 64, "textures/items/bed_blue.png"});
defaultData.add(new Object[] {"textures/entity/bed/brown.png", 6, 6, 16, 32, 64, "textures/items/bed_brown.png"});
defaultData.add(new Object[] {"textures/entity/bed/cyan.png", 6, 6, 16, 32, 64, "textures/items/bed_cyan.png"});
defaultData.add(new Object[] {"textures/entity/bed/gray.png", 6, 6, 16, 32, 64, "textures/items/bed_gray.png"});
defaultData.add(new Object[] {"textures/entity/bed/green.png", 6, 6, 16, 32, 64, "textures/items/bed_green.png"});
defaultData.add(new Object[] {"textures/entity/bed/light_blue.png", 6, 6, 16, 32, 64, "textures/items/bed_light_blue.png"});
defaultData.add(new Object[] {"textures/entity/bed/lime.png", 6, 6, 16, 32, 64, "textures/items/bed_lime.png"});
defaultData.add(new Object[] {"textures/entity/bed/magenta.png", 6, 6, 16, 32, 64, "textures/items/bed_magenta.png"});
defaultData.add(new Object[] {"textures/entity/bed/orange.png", 6, 6, 16, 32, 64, "textures/items/bed_orange.png"});
defaultData.add(new Object[] {"textures/entity/bed/pink.png", 6, 6, 16, 32, 64, "textures/items/bed_pink.png"});
defaultData.add(new Object[] {"textures/entity/bed/purple.png", 6, 6, 16, 32, 64, "textures/items/bed_purple.png"});
defaultData.add(new Object[] {"textures/entity/bed/red.png", 6, 6, 16, 32, 64, "textures/items/bed_red.png"});
defaultData.add(new Object[] {"textures/entity/bed/silver.png", 6, 6, 16, 32, 64, "textures/items/bed_silver.png"});
defaultData.add(new Object[] {"textures/entity/bed/white.png", 6, 6, 16, 32, 64, "textures/items/bed_white.png"});
defaultData.add(new Object[] {"textures/entity/bed/yellow.png", 6, 6, 16, 32, 64, "textures/items/bed_yellow.png"});
// Chain
defaultData.add(new Object[] {"textures/blocks/chain.png", 3, 0, 3, 16, 16, "textures/blocks/chain1.png", 1});
defaultData.add(new Object[] {"textures/blocks/chain.png", 0, 0, 3, 16, 16, "textures/blocks/chain2.png", 1});
// Chest
defaultData.add(new Object[] {"textures/entity/chest/normal.png", 14, 0, 14, 14, 64, "textures/blocks/chest_top.png"});
defaultData.add(new Object[] {"textures/entity/chest/ender.png", 14, 0, 14, 14, 64, "textures/blocks/ender_chest_top.png"});
// Conduit
defaultData.add(new Object[] {"textures/blocks/conduit_base.png", 0, 0, 24, 12, 32, "textures/blocks/conduit_base.png", 2});
defaultData.add(new Object[] {"textures/blocks/conduit_closed.png", 0, 0, 8, 8, 16, "textures/blocks/conduit_closed.png", 2, 5});
defaultData.add(new Object[] {"textures/blocks/conduit_open.png", 0, 0, 8, 8, 16, "textures/blocks/conduit_open.png", 2, 5});
// Command block
defaultData.add(new Object[] {"textures/blocks/chain_command_block_back.png", 0, 0, 16, 16, 16, "textures/blocks/chain_command_block_back_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/chain_command_block_conditional.png", 0, 0, 16, 16, 16, "textures/blocks/chain_command_block_conditional_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/chain_command_block_front.png", 0, 0, 16, 16, 16, "textures/blocks/chain_command_block_front_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/chain_command_block_side.png", 0, 0, 16, 16, 16, "textures/blocks/chain_command_block_side_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/command_block_back.png", 0, 0, 16, 16, 16, "textures/blocks/command_block_back_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/command_block_conditional.png", 0, 0, 16, 16, 16, "textures/blocks/command_block_conditional_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/command_block_front.png", 0, 0, 16, 16, 16, "textures/blocks/command_block_front_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/command_block_side.png", 0, 0, 16, 16, 16, "textures/blocks/command_block_side_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/repeating_command_block_back.png", 0, 0, 16, 16, 16, "textures/blocks/repeating_command_block_back_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/repeating_command_block_conditional.png", 0, 0, 16, 16, 16, "textures/blocks/repeating_command_block_conditional_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/repeating_command_block_front.png", 0, 0, 16, 16, 16, "textures/blocks/repeating_command_block_front_mipmap.png"});
defaultData.add(new Object[] {"textures/blocks/repeating_command_block_side.png", 0, 0, 16, 16, 16, "textures/blocks/repeating_command_block_side_mipmap.png"});
// Compass & clock
defaultData.add(new Object[] {"textures/items/compass_atlas.png", 0, 0, 16, 16, 16, "textures/items/compass_item.png"});
defaultData.add(new Object[] {"textures/items/watch_atlas.png", 0, 0, 16, 16, 16, "textures/items/clock_item.png"});
// Sign
defaultData.add(new Object[] {"textures/entity/sign_acacia.png", 2, 2, 24, 12, 64, "textures/ui/sign_acacia.png", 2});
defaultData.add(new Object[] {"textures/entity/sign_birch.png", 2, 2, 24, 12, 64, "textures/ui/sign_birch.png", 2});
defaultData.add(new Object[] {"textures/entity/sign_crimson.png", 2, 2, 24, 12, 64, "textures/ui/sign_crimson.png", 2});
defaultData.add(new Object[] {"textures/entity/sign_darkoak.png", 2, 2, 24, 12, 64, "textures/ui/sign_darkoak.png", 2});
defaultData.add(new Object[] {"textures/entity/sign_jungle.png", 2, 2, 24, 12, 64, "textures/ui/sign_jungle.png", 2});
defaultData.add(new Object[] {"textures/entity/sign.png", 2, 2, 24, 12, 64, "textures/ui/sign.png", 2});
defaultData.add(new Object[] {"textures/entity/sign_spruce.png", 2, 2, 24, 12, 64, "textures/ui/sign_spruce.png", 2});
defaultData.add(new Object[] {"textures/entity/sign_warped.png", 2, 2, 24, 12, 64, "textures/ui/sign_warped.png", 2});
// Water, lava & co.
defaultData.add(new Object[] {"textures/blocks/cauldron_water.png", 0, 0, 16, 16, 16, "textures/blocks/cauldron_water_placeholder.png"});
defaultData.add(new Object[] {"textures/blocks/fire_0.png", 0, 0, 16, 16, 16, "textures/blocks/fire_0_placeholder.png"});
defaultData.add(new Object[] {"textures/blocks/fire_1.png", 0, 0, 16, 16, 16, "textures/blocks/fire_1_placeholder.png"});
defaultData.add(new Object[] {"textures/blocks/lava_still.png", 0, 0, 16, 16, 16, "textures/blocks/lava_placeholder.png"});
defaultData.add(new Object[] {"textures/blocks/portal.png", 0, 0, 16, 16, 16, "textures/blocks/portal_placeholder.png"});
defaultData.add(new Object[] {"textures/blocks/water_still.png", 0, 0, 16, 16, 16, "textures/blocks/water_placeholder.png"});
// Zombie
defaultData.add(new Object[] {"textures/entity/pig/pigzombie.png", 0, 0, 64, 32, 64, "textures/entity/pig/pigzombie.png", 2});
defaultData.add(new Object[] {"textures/entity/zombie/husk.png", 0, 0, 64, 32, 64, "textures/entity/zombie/husk.png", 2});
defaultData.add(new Object[] {"textures/entity/zombie/zombie.png", 0, 0, 64, 32, 64, "textures/entity/zombie/zombie.png", 2});
}
public PlaceholderConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
int x = (int) context.data()[1];
int y = (int) context.data()[2];
int width = (int) context.data()[3];
int height = (int) context.data()[4];
int factorDetect = (int) context.data()[5];
String to = (String) context.data()[6];
int squareMode = context.data().length > 7 ? (int) context.data()[7] : 0;
int minPackFormat = context.data().length > 8 ? (int) context.data()[8] : -1;
if (minPackFormat > -1) {
// TODO: Add support for min pack format
}
File placeholderFile = storage.resolve(from).toFile();
if (!placeholderFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Create placeholder %s", to));
BufferedImage placeholderImage = ImageUtils.ensureMinWidth(ImageIO.read(placeholderFile), factorDetect);
int factor = placeholderImage.getWidth() / factorDetect;
placeholderImage = ImageUtils.crop(placeholderImage, (x * factor), (y * factor), (width * factor), (height * factor));
int size;
BufferedImage newPlaceholderImage;
switch (squareMode) {
case 1:
// Left top
size = Math.max(width, height);
newPlaceholderImage = new BufferedImage((size * factor), (size * factor), BufferedImage.TYPE_INT_ARGB);
newPlaceholderImage.getGraphics().drawImage(placeholderImage, 0, 0, null);
placeholderImage = newPlaceholderImage;
break;
case 2:
// No
break;
case 0:
default:
// Center
size = Math.max(width, height);
newPlaceholderImage = new BufferedImage((size * factor), (size * factor), BufferedImage.TYPE_INT_ARGB);
newPlaceholderImage.getGraphics().drawImage(placeholderImage, (((size * factor) - (width * factor)) / 2), (((size * factor) - (height * factor)) / 2), null);
placeholderImage = newPlaceholderImage;
}
ImageUtils.write(placeholderImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -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.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 RedstoneDustConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/blocks/redstone_dust_dot.png", "textures/blocks/redstone_dust_line0.png", "textures/blocks/redstone_dust_line1.png", "textures/blocks/redstone_dust_cross.png", "textures/blocks/redstone_dust_line.png"});
}
public RedstoneDustConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
String dot = (String) context.data()[0];
String line0 = (String) context.data()[1];
String line1 = (String) context.data()[2];
String to_cross = (String) context.data()[3];
String to_line = (String) context.data()[4];
File dotFile = storage.resolve(dot).toFile();
File line0File = storage.resolve(line0).toFile();
File line1File = storage.resolve(line1).toFile();
if (!dotFile.exists() || !line0File.exists() || !line1File.exists()) {
return delete;
}
context.log("Convert redstone dust");
BufferedImage newImage = ImageIO.read(line0File);
newImage = ImageUtils.rotate(newImage, 90);
ImageUtils.write(newImage, "png", storage.resolve(to_line).toFile());
BufferedImage line1Image = ImageIO.read(line1File);
if (ImageUtils.isEmptyArea(line1Image, 0, 0, line1Image.getWidth(), (line1Image.getHeight() / 16))) {
line1Image = ImageUtils.rotate(line1Image, 90);
}
newImage.getGraphics().drawImage(line1Image, 0, 0, null);
BufferedImage dotImage = ImageIO.read(dotFile);
newImage.getGraphics().drawImage(dotImage, 0, 0, null);
ImageUtils.write(newImage, "png", storage.resolve(to_cross).toFile());
delete.add(new DeleteConverter(packConverter, storage, new Object[] {dot}));
delete.add(new DeleteConverter(packConverter, storage, new Object[] {line0}));
delete.add(new DeleteConverter(packConverter, storage, new Object[] {line1}));
} catch (IOException e) { }
return delete;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,83 +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 SideRotateConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/blocks/dried_kelp_side_a.png", "textures/blocks/dried_kelp_side_b.png"});
defaultData.add(new Object[] {"textures/blocks/seagrass_doubletall_top_a.png", "textures/blocks/seagrass_doubletall_top_b.png"});
defaultData.add(new Object[] {"textures/blocks/seagrass_doubletall_bottom_a.png", "textures/blocks/seagrass_doubletall_bottom_b.png"});
}
public SideRotateConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Create side rotate %s", from));
BufferedImage fromImage = ImageIO.read(fromFile);
fromImage = ImageUtils.flip(fromImage, true, false);
ImageUtils.write(fromImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,354 +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 SpriteConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
// Banner pattern
defaultData.add(new Object[] {512, 512, new Object[] {
new Object[] {"textures/entity/banner_base.png", 0, 0, 64},
new Object[] {"textures/entity/banner/border.png", 64, 0, 64},
new Object[] {"textures/entity/banner/bricks.png", 128, 0, 64},
new Object[] {"textures/entity/banner/circle.png", 192, 0, 64},
new Object[] {"textures/entity/banner/creeper.png", 256, 0, 64},
new Object[] {"textures/entity/banner/cross.png", 320, 0, 64},
new Object[] {"textures/entity/banner/curly_border.png", 384, 0, 64},
new Object[] {"textures/entity/banner/diagonal_left.png", 448, 0, 64},
new Object[] {"textures/entity/banner/diagonal_right.png", 0, 64, 64},
new Object[] {"textures/entity/banner/diagonal_up_left.png", 64, 64, 64},
new Object[] {"textures/entity/banner/diagonal_up_right.png", 128, 64, 64},
new Object[] {"textures/entity/banner/flower.png", 192, 64, 64},
new Object[] {"textures/entity/banner/gradient.png", 256, 64, 64},
new Object[] {"textures/entity/banner/gradient_up.png", 320, 64, 64},
new Object[] {"textures/entity/banner/half_horizontal.png", 384, 64, 64},
new Object[] {"textures/entity/banner/half_horizontal_bottom.png", 448, 64, 64},
new Object[] {"textures/entity/banner/half_vertical.png", 0, 128, 64},
new Object[] {"textures/entity/banner/half_vertical_right.png", 64, 128, 64},
new Object[] {"textures/entity/banner/mojang.png", 128, 128, 64},
new Object[] {"textures/entity/banner/rhombus.png", 192, 128, 64},
new Object[] {"textures/entity/banner/skull.png", 256, 128, 64},
new Object[] {"textures/entity/banner/small_stripes.png", 320, 128, 64},
new Object[] {"textures/entity/banner/square_bottom_left.png", 384, 128, 64},
new Object[] {"textures/entity/banner/square_bottom_right.png", 448, 128, 64},
new Object[] {"textures/entity/banner/square_top_left.png", 0, 192, 64},
new Object[] {"textures/entity/banner/square_top_right.png", 64, 192, 64},
new Object[] {"textures/entity/banner/straight_cross.png", 128, 192, 64},
new Object[] {"textures/entity/banner/stripe_bottom.png", 192, 192, 64},
new Object[] {"textures/entity/banner/stripe_center.png", 256, 192, 64},
new Object[] {"textures/entity/banner/stripe_downleft.png", 320, 192, 64},
new Object[] {"textures/entity/banner/stripe_downright.png", 384, 192, 64},
new Object[] {"textures/entity/banner/stripe_left.png", 448, 192, 64},
new Object[] {"textures/entity/banner/stripe_middle.png", 0, 256, 64},
new Object[] {"textures/entity/banner/stripe_right.png", 64, 256, 64},
new Object[] {"textures/entity/banner/stripe_top.png", 128, 256, 64},
new Object[] {"textures/entity/banner/triangle_bottom.png", 192, 256, 64},
new Object[] {"textures/entity/banner/triangle_top.png", 256, 256, 64},
new Object[] {"textures/entity/banner/triangles_bottom.png", 320, 256, 64},
new Object[] {"textures/entity/banner/triangles_top.png", 384, 256, 64}
}, "textures/entity/banner/banner.png"});
// Painting
defaultData.add(new Object[] {256, 256, new Object[] {
new Object[] {"textures/painting/kebab.png", 0, 0, 16},
new Object[] {"textures/painting/aztec.png", 16, 0, 16},
new Object[] {"textures/painting/alban.png", 32, 0, 16},
new Object[] {"textures/painting/bomb.png", 64, 0, 16},
new Object[] {"textures/painting/aztec2.png", 48, 0, 16},
new Object[] {"textures/painting/plant.png", 80, 0, 16},
new Object[] {"textures/painting/wasteland.png", 96, 0, 16},
new Object[] {"textures/painting/back.png", 192, 0, 16},
new Object[] {"textures/painting/back.png", 208, 0, 16},
new Object[] {"textures/painting/back.png", 224, 0, 16},
new Object[] {"textures/painting/back.png", 240, 0, 16},
new Object[] {"textures/painting/back.png", 192, 16, 16},
new Object[] {"textures/painting/back.png", 208, 16, 16},
new Object[] {"textures/painting/back.png", 224, 16, 16},
new Object[] {"textures/painting/back.png", 240, 16, 16},
new Object[] {"textures/painting/back.png", 192, 32, 16},
new Object[] {"textures/painting/back.png", 208, 32, 16},
new Object[] {"textures/painting/back.png", 224, 32, 16},
new Object[] {"textures/painting/back.png", 240, 32, 16},
new Object[] {"textures/painting/back.png", 192, 48, 16},
new Object[] {"textures/painting/back.png", 208, 48, 16},
new Object[] {"textures/painting/back.png", 224, 48, 16},
new Object[] {"textures/painting/back.png", 240, 48, 16},
new Object[] {"textures/painting/pool.png", 0, 32, 32},
new Object[] {"textures/painting/courbet.png", 32, 32, 32},
new Object[] {"textures/painting/sea.png", 64, 32, 32},
new Object[] {"textures/painting/sunset.png", 96, 32, 32},
new Object[] {"textures/painting/creebet.png", 128, 32, 32},
new Object[] {"textures/painting/wanderer.png", 0, 64, 16},
new Object[] {"textures/painting/graham.png", 16, 64, 16},
new Object[] {"textures/painting/fighters.png", 0, 96, 64},
new Object[] {"textures/painting/skeleton.png", 192, 64, 64},
new Object[] {"textures/painting/donkey_kong.png", 192, 112, 64},
new Object[] {"textures/painting/match.png", 0, 128, 32},
new Object[] {"textures/painting/bust.png", 32, 128, 32},
new Object[] {"textures/painting/stage.png", 64, 128, 32},
new Object[] {"textures/painting/void.png", 96, 128, 32},
new Object[] {"textures/painting/skull_and_roses.png", 128, 128, 32},
new Object[] {"textures/painting/wither.png", 160, 128, 32},
new Object[] {"textures/painting/pointer.png", 0, 192, 64},
new Object[] {"textures/painting/pigscene.png", 64, 192, 64},
new Object[] {"textures/painting/burning_skull.png", 128, 192, 64}
}, "textures/painting/kz.png"});
// Particles
defaultData.add(new Object[] {128, 128, new Object[] {
new Object[] {"textures/particle/generic_0.png", 0, 0, 8},
new Object[] {"textures/particle/generic_1.png", 8, 0, 8},
new Object[] {"textures/particle/generic_2.png", 16, 0, 8},
new Object[] {"textures/particle/generic_3.png", 24, 0, 8},
new Object[] {"textures/particle/generic_4.png", 32, 0, 8},
new Object[] {"textures/particle/generic_5.png", 40, 0, 8},
new Object[] {"textures/particle/generic_6.png", 48, 0, 8},
new Object[] {"textures/particle/generic_7.png", 56, 0, 8},
new Object[] {"textures/particle/splash_0.png", 0, 8, 8},
new Object[] {"textures/particle/splash_0.png", 24, 8, 8},
new Object[] {"textures/particle/splash_1.png", 32, 8, 8},
new Object[] {"textures/particle/splash_2.png", 40, 8, 8},
new Object[] {"textures/particle/splash_3.png", 48, 8, 8},
new Object[] {"textures/particle/bubble.png", 0, 16, 8},
new Object[] {"textures/particle/flame.png", 0, 24, 8},
new Object[] {"textures/particle/lava.png", 8, 24, 8},
new Object[] {"textures/particle/soul_fire_flame.png", 16, 24, 8},
new Object[] {"textures/particle/note.png", 0, 32, 8},
new Object[] {"textures/particle/critical_hit.png", 8, 32, 8},
new Object[] {"textures/particle/enchanted_hit.png", 16, 32, 8},
new Object[] {"textures/particle/heart.png", 0, 40, 8},
new Object[] {"textures/particle/angry.png", 8, 40, 8},
new Object[] {"textures/particle/glint.png", 16, 40, 8},
new Object[] {"textures/particle/flash.png", 32, 16, 32},
new Object[] {"textures/particle/drip_hang.png", 0, 56, 8},
new Object[] {"textures/particle/drip_fall.png", 8, 56, 8},
new Object[] {"textures/particle/drip_land.png", 16, 58, 8},
new Object[] {"textures/particle/effect_0.png", 0, 64, 8},
new Object[] {"textures/particle/effect_1.png", 8, 64, 8},
new Object[] {"textures/particle/effect_2.png", 16, 64, 8},
new Object[] {"textures/particle/effect_3.png", 24, 64, 8},
new Object[] {"textures/particle/effect_4.png", 32, 64, 8},
new Object[] {"textures/particle/effect_5.png", 40, 64, 8},
new Object[] {"textures/particle/effect_6.png", 48, 64, 8},
new Object[] {"textures/particle/effect_7.png", 56, 64, 8},
new Object[] {"textures/particle/spell_0.png", 0, 72, 8},
new Object[] {"textures/particle/spell_1.png", 8, 72, 8},
new Object[] {"textures/particle/spell_2.png", 16, 72, 8},
new Object[] {"textures/particle/spell_3.png", 24, 72, 8},
new Object[] {"textures/particle/spell_4.png", 32, 72, 8},
new Object[] {"textures/particle/spell_5.png", 40, 72, 8},
new Object[] {"textures/particle/spell_6.png", 48, 72, 8},
new Object[] {"textures/particle/spell_7.png", 56, 72, 8},
new Object[] {"textures/particle/explosion_0.png", 0, 80, 8},
new Object[] {"textures/particle/explosion_1.png", 8, 80, 8},
new Object[] {"textures/particle/explosion_2.png", 16, 80, 8},
new Object[] {"textures/particle/explosion_3.png", 24, 80, 8},
new Object[] {"textures/particle/explosion_4.png", 32, 80, 8},
new Object[] {"textures/particle/explosion_5.png", 40, 80, 8},
new Object[] {"textures/particle/explosion_6.png", 48, 80, 8},
new Object[] {"textures/particle/explosion_7.png", 56, 80, 8},
new Object[] {"textures/particle/explosion_8.png", 64, 80, 8},
new Object[] {"textures/particle/explosion_9.png", 72, 80, 8},
new Object[] {"textures/particle/explosion_10.png", 80, 80, 8},
new Object[] {"textures/particle/explosion_11.png", 88, 80, 8},
new Object[] {"textures/particle/explosion_12.png", 96, 80, 8},
new Object[] {"textures/particle/explosion_13.png", 104, 80, 8},
new Object[] {"textures/particle/explosion_14.png", 112, 80, 8},
new Object[] {"textures/particle/explosion_15.png", 120, 80, 8},
new Object[] {"textures/particle/glitter_0.png", 0, 88, 8},
new Object[] {"textures/particle/glitter_1.png", 8, 88, 8},
new Object[] {"textures/particle/glitter_2.png", 16, 88, 8},
new Object[] {"textures/particle/glitter_3.png", 24, 88, 8},
new Object[] {"textures/particle/glitter_4.png", 32, 88, 8},
new Object[] {"textures/particle/glitter_5.png", 40, 88, 8},
new Object[] {"textures/particle/glitter_6.png", 48, 88, 8},
new Object[] {"textures/particle/glitter_7.png", 56, 88, 8},
new Object[] {"textures/particle/spark_0.png", 0, 96, 8},
new Object[] {"textures/particle/spark_1.png", 8, 96, 8},
new Object[] {"textures/particle/spark_2.png", 16, 96, 8},
new Object[] {"textures/particle/spark_3.png", 24, 96, 8},
new Object[] {"textures/particle/spark_4.png", 32, 96, 8},
new Object[] {"textures/particle/spark_5.png", 40, 96, 8},
new Object[] {"textures/particle/spark_6.png", 48, 96, 8},
new Object[] {"textures/particle/spark_7.png", 56, 96, 8},
new Object[] {"textures/particle/sga_a.png", 8, 112, 8},
new Object[] {"textures/particle/sga_b.png", 16, 112, 8},
new Object[] {"textures/particle/sga_c.png", 24, 112, 8},
new Object[] {"textures/particle/sga_d.png", 32, 112, 8},
new Object[] {"textures/particle/sga_e.png", 40, 112, 8},
new Object[] {"textures/particle/sga_f.png", 48, 112, 8},
new Object[] {"textures/particle/sga_g.png", 56, 112, 8},
new Object[] {"textures/particle/sga_h.png", 64, 112, 8},
new Object[] {"textures/particle/sga_i.png", 72, 112, 8},
new Object[] {"textures/particle/sga_j.png", 80, 112, 8},
new Object[] {"textures/particle/sga_k.png", 88, 112, 8},
new Object[] {"textures/particle/sga_l.png", 96, 112, 8},
new Object[] {"textures/particle/sga_m.png", 104, 112, 8},
new Object[] {"textures/particle/sga_n.png", 112, 112, 8},
new Object[] {"textures/particle/sga_o.png", 120, 112, 8},
new Object[] {"textures/particle/sga_p.png", 0, 120, 8},
new Object[] {"textures/particle/sga_q.png", 8, 120, 8},
new Object[] {"textures/particle/sga_r.png", 16, 120, 8},
new Object[] {"textures/particle/sga_s.png", 24, 120, 8},
new Object[] {"textures/particle/sga_t.png", 32, 120, 8},
new Object[] {"textures/particle/sga_u.png", 40, 120, 8},
new Object[] {"textures/particle/sga_v.png", 48, 120, 8},
new Object[] {"textures/particle/sga_w.png", 56, 120, 8},
new Object[] {"textures/particle/sga_x.png", 64, 120, 8},
new Object[] {"textures/particle/sga_y.png", 72, 120, 8},
new Object[] {"textures/particle/sga_z.png", 80, 120, 8}
}, "textures/particle/particles.png", 4 /* Needs a minimal 4x factor because the explosion images are bigger than the others */});
// 1.14
defaultData.add(new Object[] {16, 192, new Object[] {
new Object[] {"textures/particle/big_smoke_0.png", 0, 0, 16},
new Object[] {"textures/particle/big_smoke_1.png", 0, 16, 16},
new Object[] {"textures/particle/big_smoke_2.png", 0, 32, 16},
new Object[] {"textures/particle/big_smoke_3.png", 0, 48, 16},
new Object[] {"textures/particle/big_smoke_4.png", 0, 64, 16},
new Object[] {"textures/particle/big_smoke_5.png", 0, 80, 16},
new Object[] {"textures/particle/big_smoke_6.png", 0, 96, 16},
new Object[] {"textures/particle/big_smoke_7.png", 0, 112, 16},
new Object[] {"textures/particle/big_smoke_8.png", 0, 128, 16},
new Object[] {"textures/particle/big_smoke_9.png", 0, 144, 16},
new Object[] {"textures/particle/big_smoke_10.png", 0, 160, 16},
new Object[] {"textures/particle/big_smoke_11.png", 0, 176, 16}
}, "textures/particle/campfire_smoke.png"});
defaultData.add(new Object[] {16, 176, new Object[]{
new Object[]{"textures/particle/soul_0.png", 0, 0, 16},
new Object[]{"textures/particle/soul_1.png", 0, 16, 16},
new Object[]{"textures/particle/soul_2.png", 0, 32, 16},
new Object[]{"textures/particle/soul_3.png", 0, 48, 16},
new Object[]{"textures/particle/soul_4.png", 0, 64, 16},
new Object[]{"textures/particle/soul_5.png", 0, 80, 16},
new Object[]{"textures/particle/soul_6.png", 0, 96, 16},
new Object[]{"textures/particle/soul_7.png", 0, 112, 16},
new Object[]{"textures/particle/soul_8.png", 0, 128, 16},
new Object[]{"textures/particle/soul_9.png", 0, 144, 16},
new Object[]{"textures/particle/soul_10.png", 0, 160, 16},
}, "textures/particle/soul.png"});
}
public SpriteConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
List<AbstractConverter> delete = new ArrayList<>();
try {
int width = (int) context.data()[0];
int height = (int) context.data()[1];
Object[] sprites = (Object[]) context.data()[2];
String to = (String) context.data()[3];
int additional_factor = context.data().length > 4 ? (int) context.data()[4] : 1;
File toFile = storage.resolve(to).toFile();
BufferedImage newImage = null;
int factor = 0;
List<String> missingSprites = new ArrayList<>();
if (toFile.exists()) {
context.log(String.format("Convert sprite %s", to));
newImage = ImageIO.read(toFile); // Load already exists sprites image - Some texture packs have may a mix with sprites (1.13) and separate images (1.14)
factor = (newImage.getWidth() / width);
}
for (Object sprite : sprites) {
Object[] spriteArr = (Object[]) sprite;
String spritePath = (String) spriteArr[0];
int x = (int) spriteArr[1];
int y = (int) spriteArr[2];
int factorDetect = (int) spriteArr[3];
File spriteFile = storage.resolve(spritePath).toFile();
if (!spriteFile.exists()) {
missingSprites.add(spritePath);
continue;
}
BufferedImage imageSprite = ImageIO.read(spriteFile);
if (factor == 0) {
factor = (imageSprite.getWidth() / factorDetect * additional_factor); // Take the factor of the first image
}
if (newImage == null) {
context.log(String.format("Create sprite %s", to));
newImage = new BufferedImage((width * factor), (height * factor), BufferedImage.TYPE_INT_ARGB);
}
BufferedImage imageSpritedScaled = ImageUtils.scale(imageSprite, ((factorDetect * factor) / imageSprite.getWidth()));
Graphics g = newImage.getGraphics();
g.setColor(new Color(Color.TRANSLUCENT, true));
g.fillRect((x * factor), (y * factor), imageSpritedScaled.getWidth(), imageSpritedScaled.getHeight()); // Delete previous area, if the sprite already exists
g.drawImage(imageSpritedScaled, (x * factor), (y * factor), null);
delete.add(new DeleteConverter(packConverter, storage, new Object[] {spritePath}));
}
if (newImage != null) {
for (String sprite : missingSprites) {
context.log(String.format("Missing texture %s - May used a transparent image", sprite));
}
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
}
} catch (IOException e) { }
return delete;
}
}

View File

@@ -1,90 +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 TitleConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/gui/title/minecraft.png", "textures/ui/title.png"});
}
public TitleConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
String to = (String) context.data()[1];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert title %s", from));
BufferedImage fromImage = ImageIO.read(fromFile);
int factor = fromImage.getWidth() / 255;
BufferedImage newImage = new BufferedImage((273 * factor), (45 * factor), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(ImageUtils.crop(fromImage, 0, 0, (155 * factor), (45 * factor)), 0, 0, null);
g.drawImage(ImageUtils.crop(fromImage, 0, (45 * factor), (119 * factor), (45 * factor)), (154 * factor), 0, null);
newImage = ImageUtils.ensureMinHeight(newImage, 360);
ImageUtils.write(newImage, "png", storage.resolve(to).toFile());
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,86 +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 TurtleConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new Object[] {"textures/entity/sea_turtle.png"});
}
public TurtleConverter(PackConverter packConverter, Path storage, Object[] data) {
super(packConverter, storage, data);
}
@Override
public List<AbstractConverter> convert(@NotNull PackConversionContext context) {
try {
String from = (String) context.data()[0];
File fromFile = storage.resolve(from).toFile();
if (!fromFile.exists()) {
return new ArrayList<>();
}
context.log(String.format("Convert turtle %s", from));
BufferedImage fromImage = ImageIO.read(fromFile);
int factor = fromImage.getWidth() / 128;
BufferedImage newImage = new BufferedImage(fromImage.getWidth(), fromImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = newImage.getGraphics();
g.drawImage(ImageUtils.crop(fromImage, factor, 0, (fromImage.getWidth() - factor), fromImage.getHeight()), 0, 0, null);
ImageUtils.write(newImage, "png", fromFile);
} catch (IOException e) { }
return new ArrayList<>();
}
}

View File

@@ -1,127 +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.custom;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
import org.geysermc.packconverter.PackConversionContext;
import org.geysermc.packconverter.PackConverter;
import org.geysermc.packconverter.converters.AbstractConverter;
import org.geysermc.packconverter.utils.CustomModelDataHandler;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
// @AutoService(Converter.class)
public class CustomModelDataConverter extends AbstractConverter {
@Getter
public static final List<Object[]> defaultData = new ArrayList<>();
static {
defaultData.add(new String[] {"assets/minecraft/models/item", "textures/item_texture.json"});
}
@Override
public void convert(@NotNull PackConversionContext context) {
context.log("Checking for custom model data");
try {
PackConverter packConverter = context.packConverter();
String from = (String) context.data()[0];
String to = (String) context.data()[1];
ObjectMapper mapper = new ObjectMapper();
// Create the texture_data file that will map all textures
ObjectNode textureData = mapper.createObjectNode();
textureData.put("resource_pack_name", "geysercmd");
textureData.put("texture_name", "atlas.items");
ObjectNode allTextures = mapper.createObjectNode();
for (File file : context.storage().resolve(from).toFile().listFiles()) {
InputStream stream = new FileInputStream(file);
JsonNode node = mapper.readTree(stream);
if (node.has("overrides")) {
for (JsonNode override : node.get("overrides")) {
JsonNode predicate = override.get("predicate");
// This is where the custom model data happens - each one is registered here under "predicate"
if (predicate.has("custom_model_data")) {
// The "ID" of the CustomModelData. If the ID is 1, then to get the custom model data
// You need to run in Java `/give @s stick{CustomModelData:1}`
int id = predicate.get("custom_model_data").asInt();
// Get the identifier that we'll register the item with on Bedrock, and create the JSON file
String identifier = CustomModelDataHandler.handleItemData(mapper, context.storage(), override.get("model").asText());
// See if we have registered the vanilla item already
Int2ObjectMap<String> data = packConverter.getCustomModelData().getOrDefault(file.getName().replace(".json", ""), null);
if (data == null) {
// Create a fresh map of Java CustomModelData IDs to Bedrock string identifiers
Int2ObjectMap<String> map = new Int2ObjectOpenHashMap<>();
map.put(id, identifier);
// Put the vanilla item (stick) and the initialized map in the custom model data table
packConverter.getCustomModelData().put(file.getName().replace(".json", ""), map);
} else {
// Map exists, add the new CustomModelData ID and Bedrock string identifier
data.put(id, identifier);
}
// Create the texture information
ObjectNode textureInfo = CustomModelDataHandler.handleItemTexture(mapper, context.storage(), override.get("model").asText());
if (textureInfo != null) {
// If texture was created, add it to the file where Bedrock will read all textures
allTextures.setAll(textureInfo);
}
}
}
}
}
textureData.set("texture_data", allTextures);
if (!packConverter.getCustomModelData().isEmpty()) {
// We have custom model data, so let's write the textures
OutputStream outputStream = Files.newOutputStream(context.storage().resolve(to), StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE);
mapper.writer(new DefaultPrettyPrinter()).writeValue(outputStream, textureData);
}
context.log(String.format("Converted models %s", from));
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -1,113 +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.pack.converter.util;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class CustomModelDataHandler {
public static String handleItemData(ObjectMapper mapper, Path storage, String filePath) {
// Start the creation of the JSON that registers the object
ObjectNode item = mapper.createObjectNode();
// Standard JSON
item.put("format_version", "1.16.0");
ObjectNode itemData = mapper.createObjectNode();
ObjectNode itemDescription = mapper.createObjectNode();
// Full identifier with geysercmd prefix (cmd for CustomModelData - just in case it clashes with something we do in the future)
String identifier = "geysercmd:" + filePath.replace("item/", "");
// Register the full identifier
itemDescription.put("identifier", identifier);
itemData.set("description", itemDescription);
ObjectNode itemComponent = mapper.createObjectNode();
// Define which texture in item_texture.json this should use. We just set it to the "clean identifier"
itemComponent.put("minecraft:icon", identifier.replace("geysercmd:", ""));
// TODO: Apply components based off the original item
// TODO: Components tell Bedrock how the item operates, how much you can stack, can you eat it, etc
// TODO: We can probably generate this from the mappings-generator as the Bedrock vanilla behavior pack doesn't define every item
itemComponent.put("minecraft:render_offsets", "tools");
itemData.set("components", itemComponent);
item.set("minecraft:item", itemData);
// Create, if necessary, the folder that stores all item information
File itemJsonFile = storage.resolve("items").toFile();
if (!itemJsonFile.exists()) {
itemJsonFile.mkdir();
}
// Write our item information
Path path = itemJsonFile.toPath().resolve(filePath.replace("item/", "") + ".json");
try (OutputStream outputStream = Files.newOutputStream(path,
StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE)) {
mapper.writer().writeValue(outputStream, item);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return identifier;
}
public static ObjectNode handleItemTexture(ObjectMapper mapper, Path storage, String filePath) {
String cleanIdentifier = filePath.replace("item/", "");
InputStream stream;
JsonNode textureFile;
try {
// Read the model information for the Java CustomModelData
stream = new FileInputStream(storage.resolve("assets/minecraft/models/" + filePath + ".json").toFile());
textureFile = mapper.readTree(stream);
} catch (IOException e) {
e.printStackTrace();
return null;
}
// TODO: This is called BSing it. It works but is it correct?
if (textureFile.has("textures")) {
if (textureFile.get("textures").has("0") || textureFile.get("textures").has("layer0")) {
String determine = textureFile.get("textures").has("0") ? "0" : "layer0";
ObjectNode textureData = mapper.createObjectNode();
ObjectNode textureName = mapper.createObjectNode();
// Make JSON data for Bedrock pointing to where texture data for this item is stored
textureName.put("textures", textureFile.get("textures").get(determine).textValue().replace("item/", "textures/items/"));
// Have the identifier point to that texture data
textureData.set(cleanIdentifier, textureName);
return textureData;
}
}
return null;
}
}