aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits
diff options
context:
space:
mode:
authorSHsuperCM <shsupercm@gmail.com>2022-01-21 14:21:23 +0200
committerSHsuperCM <shsupercm@gmail.com>2022-01-21 14:21:23 +0200
commit897172bde9128da47181a6db6c1ff4885081ba8d (patch)
tree462e0c45eddaf727596a77b6a17d41560fa4796e /src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits
parentc3c547c6f950ebbc047cd31672f6a794483a9d0e (diff)
downloadCITResewn-897172bde9128da47181a6db6c1ff4885081ba8d.tar.gz
CITResewn-897172bde9128da47181a6db6c1ff4885081ba8d.tar.bz2
CITResewn-897172bde9128da47181a6db6c1ff4885081ba8d.zip
Re(moved) most of the old sources
Diffstat (limited to 'src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits')
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CIT.java435
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java42
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITElytra.java28
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITEnchantment.java371
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITItem.java463
5 files changed, 0 insertions, 1339 deletions
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CIT.java b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CIT.java
deleted file mode 100644
index a58c946..0000000
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CIT.java
+++ /dev/null
@@ -1,435 +0,0 @@
-package shcm.shsupercm.fabric.citresewn.pack.cits;
-
-import net.minecraft.enchantment.EnchantmentHelper;
-import net.minecraft.entity.LivingEntity;
-import net.minecraft.item.EnchantedBookItem;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-import net.minecraft.nbt.*;
-import net.minecraft.text.Text;
-import net.minecraft.util.Hand;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.Pair;
-import net.minecraft.util.registry.Registry;
-import net.minecraft.world.World;
-import shcm.shsupercm.fabric.citresewn.CITResewn;
-import shcm.shsupercm.fabric.citresewn.ex.CITParseException;
-import shcm.shsupercm.fabric.citresewn.mixin.core.NbtCompoundAccessor;
-import shcm.shsupercm.fabric.citresewn.pack.CITPack;
-
-import java.util.*;
-import java.util.function.Predicate;
-import java.util.regex.Pattern;
-
-public abstract class CIT {
- public final CITPack pack;
- public final Identifier propertiesIdentifier;
-
- public final Set<Item> items = new HashSet<>();
-
- public final int damageMin, damageMax;
- public final boolean damageAny, damageRange, damagePercentage;
- public final Integer damageMask;
-
- public final int stackMin, stackMax;
- public final boolean stackAny, stackRange;
-
- public final Set<Identifier> enchantments = new HashSet<>();
- public final List<Pair<Integer, Integer>> enchantmentLevels = new ArrayList<>();
- public final boolean enchantmentsAny, enchantmentLevelsAny;
-
- public final Hand hand;
-
- public final Predicate<NbtCompound> nbt;
-
- public final int weight;
-
- public CIT(CITPack pack, Identifier identifier, Properties properties) throws CITParseException {
- this.pack = pack;
- this.propertiesIdentifier = identifier;
- try {
- for (String itemId : (properties.getProperty("items", properties.getProperty("matchItems", " "))).split(" "))
- if (!itemId.isEmpty()) {
- Identifier itemIdentifier = new Identifier(itemId);
- if (!Registry.ITEM.containsId(itemIdentifier))
- throw new Exception("Unknown item " + itemId);
- this.items.add(Registry.ITEM.get(itemIdentifier));
- }
- if (this.items.isEmpty())
- try {
- String id = propertiesIdentifier.getPath().substring(0, propertiesIdentifier.getPath().length() - 11);
- String[] split = id.split("/");
- id = split[split.length - 1];
- Identifier itemId = new Identifier(propertiesIdentifier.getNamespace(), id);
- if (Registry.ITEM.containsId(itemId))
- this.items.add(Registry.ITEM.get(itemId));
- } catch (Exception ignored) { }
-
- String damage = properties.getProperty("damage");
- if (damageAny = damage == null) {
- this.damageRange = false;
- this.damagePercentage = false;
- this.damageMin = 0;
- this.damageMax = 0;
- } else {
- if (this.damagePercentage = damage.contains("%"))
- damage = damage.replace("%", "");
-
- if (damage.contains("-")) {
- String[] split = damage.split("-");
- if (split.length > 2)
- throw new Exception("damage range must have up to 2 numbers");
-
- this.damageMin = split[0].isEmpty() ? Integer.MIN_VALUE : Integer.parseInt(split[0]);
- this.damageMax = split.length == 1 ? Integer.MAX_VALUE : Integer.parseInt(split[1]);
-
- if (this.damageMin > this.damageMax)
- throw new Exception("damage range min is higher than max");
-
- this.damageRange = this.damageMin < this.damageMax;
- } else {
- this.damageRange = false;
- this.damageMin = this.damageMax = Integer.parseInt(damage);
- }
- }
-
- this.damageMask = properties.containsKey("damageMask") ? Integer.parseInt(properties.getProperty("damageMask")) : null;
-
- String stackSize = properties.getProperty("stackSize");
- if (stackAny = stackSize == null) {
- this.stackRange = false;
- this.stackMin = 0;
- this.stackMax = 0;
- } else {
- if (stackSize.contains("-")) {
- String[] split = stackSize.split("-");
- if (split.length > 2)
- throw new Exception("stackSize range must have up to 2 numbers");
-
- this.stackMin = split[0].isEmpty() ? Integer.MIN_VALUE : Integer.parseInt(split[0]);
- this.stackMax = split.length == 1 ? Integer.MAX_VALUE : Integer.parseInt(split[1]);
-
- if (this.stackMin > this.stackMax)
- throw new Exception("stackSize range min is higher than max");
-
- this.stackRange = this.stackMin < this.stackMax;
- } else {
- this.stackRange = false;
- this.stackMin = this.stackMax = Integer.parseInt(stackSize);
- }
- }
-
- String enchantmentIDs = properties.getProperty("enchantments", properties.getProperty("enchantmentIDs"));
- if (!(this.enchantmentsAny = enchantmentIDs == null)) {
- for (String ench : enchantmentIDs.split(" ")) {
- Identifier enchIdentifier = new Identifier(ench);
- if (!Registry.ENCHANTMENT.containsId(enchIdentifier))
- CITResewn.logWarnLoading("CIT Warning: Unknown enchantment " + enchIdentifier);
- this.enchantments.add(enchIdentifier);
- }
- }
-
- String enchantmentLevelsProp = properties.getProperty("enchantmentLevels");
- if (!(this.enchantmentLevelsAny = enchantmentLevelsProp == null)) {
- for (String range : enchantmentLevelsProp.split(" ")) {
- if (range.contains("-")) {
- if (range.startsWith("-")) {
- range = range.substring(1);
- if (range.contains("-"))
- throw new Exception("enchantmentLevels ranges must have up to 2 numbers each");
- this.enchantmentLevels.add(new Pair<>(0, Integer.parseInt(range)));
- } else if (range.endsWith("-")) {
- range = range.substring(0, range.length() - 1);
- if (range.contains("-"))
- throw new Exception("enchantmentLevels ranges must have up to 2 numbers each");
- this.enchantmentLevels.add(new Pair<>(Integer.parseInt(range), Integer.MAX_VALUE));
- } else {
- String[] split = range.split("-");
- if (split.length != 2)
- throw new Exception("enchantmentLevels ranges must have up to 2 numbers each");
- Pair<Integer, Integer> minMaxPair = new Pair<>(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
- if (minMaxPair.getLeft() > minMaxPair.getRight())
- throw new Exception("enchantmentLevels range min is higher than max");
- this.enchantmentLevels.add(minMaxPair);
- }
- } else {
- int level = Integer.parseInt(range);
- this.enchantmentLevels.add(new Pair<>(level, level));
- }
- }
- }
-
- this.hand = switch (properties.getProperty("hand", "any")) {
- case "main" -> Hand.MAIN_HAND;
- case "off" -> Hand.OFF_HAND;
- default -> null;
- };
-
- List<Predicate<NbtCompound>> nbtPredicates = new ArrayList<>();
- for (Object o : properties.keySet())
- if (o instanceof String property && property.startsWith("nbt.")) {
- String matchProperty = properties.getProperty(property);
- final String[] path = property.substring(4).split("\\.");
- final Predicate<String> match;
- final boolean caseSensitive = !matchProperty.startsWith("i");
-
- if (matchProperty.startsWith(caseSensitive ? "pattern:" : "ipattern:")) {
- matchProperty = caseSensitive ? matchProperty.substring(8) : matchProperty.substring(9).toLowerCase(Locale.ENGLISH);
- final String pattern = matchProperty;
- match = s -> matchesPattern(caseSensitive ? s : s.toLowerCase(), pattern, 0, s.length(), 0, pattern.length());
- } else if (matchProperty.startsWith(caseSensitive ? "regex:" : "iregex:")) {
- matchProperty = caseSensitive ? matchProperty.substring(6) : matchProperty.substring(7).toLowerCase(Locale.ENGLISH);
- final Pattern pattern = Pattern.compile(matchProperty);
- match = s -> pattern.matcher(caseSensitive ? s : s.toLowerCase()).matches();
- } else {
- if (property.equals("nbt.display.color") && matchProperty.startsWith("#"))
- try {
- matchProperty = String.valueOf(Integer.parseInt(matchProperty.substring(1).toLowerCase(Locale.ENGLISH), 16));
- } catch (Exception ignored) { }
-
- final String pattern = matchProperty;
- match = s -> s.equals(pattern);
- }
-
- final boolean checkJson = (path[path.length - 1].equals("Name") || (path.length >= 2 && path[path.length - 2].equals("Lore"))) && !((matchProperty.startsWith("{") || matchProperty.startsWith("\\{")) && matchProperty.endsWith("}"));
-
- nbtPredicates.add(new Predicate<NbtCompound>() {
- public boolean test(NbtElement nbtElement, int index) {
- if (index >= path.length) {
- if (nbtElement instanceof NbtString nbtString) {
- String text = nbtString.asString();
- if (checkJson)
- try {
- //noinspection ConstantConditions
- text = Text.Serializer.fromJson(text).getString();
- } catch (Exception ignored) { }
-
- return match.test(text);
- } else if (nbtElement instanceof AbstractNbtNumber nbtNumber)
- return match.test(String.valueOf(nbtNumber.numberValue()));
- } else {
- String name = path[index];
- if (name.equals("*")) {
- if (nbtElement instanceof NbtCompound nbtCompound) {
- for (NbtElement subElement : ((NbtCompoundAccessor) nbtCompound).getEntries().values())
- if (test(subElement, index + 1))
- return true;
- } else if (nbtElement instanceof NbtList nbtList) {
- for (NbtElement subElement : nbtList)
- if (test(subElement, index + 1))
- return true;
- }
- } else {
- if (nbtElement instanceof NbtCompound nbtCompound) {
- NbtElement subElement = nbtCompound.get(name);
- return subElement != null && test(subElement, index + 1);
- } else if (nbtElement instanceof NbtList nbtList) {
- try {
- NbtElement subElement = nbtList.get(Integer.parseInt(name));
- return subElement != null && test(subElement, index + 1);
- } catch (Exception ignored) {
- return false;
- }
- }
- }
- }
- return false;
- }
-
- @Override
- public boolean test(NbtCompound nbtCompound) {
- return test(nbtCompound, 0);
- }
- });
- }
- this.nbt = nbtCompound -> {
- for (Predicate<NbtCompound> predicate : nbtPredicates)
- if(!predicate.test(nbtCompound))
- return false;
- return true;
- };
-
- this.weight = Integer.parseInt(properties.getProperty("weight", "0"));
- } catch (Exception e) {
- throw new CITParseException(pack.resourcePack, identifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
- }
- }
-
- public boolean test(ItemStack stack, Hand hand, World world, LivingEntity entity, boolean ignoreItemType) {
- if (!ignoreItemType && !items.isEmpty() && !items.contains(stack.getItem()))
- return false;
-
- if (!damageAny && stack.getItem().isDamageable()) {
- int damage = stack.getDamage();
- if (damageMask != null)
- damage &= damageMask;
- if (damagePercentage)
- damage = Math.round(100f * (float) stack.getDamage() / (float) stack.getMaxDamage());
- if (damageRange ? (damage < damageMin || damage > damageMax) : (damage != damageMin))
- return false;
- }
-
- if (!stackAny) {
- int count = stack.getCount();
- if (stackRange ? (count < stackMin || count > stackMax) : (count != stackMin))
- return false;
- }
-
- if (this.hand != null && this.hand != hand)
- return false;
-
- if (!enchantmentsAny) {
- Map<Identifier, Integer> stackEnchantments = new LinkedHashMap<>();
- for (NbtElement nbtElement : stack.isOf(Items.ENCHANTED_BOOK) ? EnchantedBookItem.getEnchantmentNbt(stack) : stack.getEnchantments())
- stackEnchantments.put(EnchantmentHelper.getIdFromNbt((NbtCompound) nbtElement), EnchantmentHelper.getLevelFromNbt((NbtCompound) nbtElement));
-
- boolean matches = false;
- for (Identifier enchantment : enchantments) {
- Integer level = stackEnchantments.get(enchantment);
- if (level != null)
- if (enchantmentLevelsAny) {
- if (level > 0) {
- matches = true;
- break;
- }
- } else
- for (Pair<Integer, Integer> levelRange : enchantmentLevels)
- if (level >= levelRange.getLeft() && level <= levelRange.getRight()) {
- matches = true;
- break;
- }
- }
-
- if (!matches)
- return false;
- } else if (!enchantmentLevelsAny) {
- Collection<Integer> levels = new ArrayList<>();
- levels.add(0);
- for (NbtElement nbtElement : stack.isOf(Items.ENCHANTED_BOOK) ? EnchantedBookItem.getEnchantmentNbt(stack) : stack.getEnchantments())
- levels.add(EnchantmentHelper.getLevelFromNbt((NbtCompound) nbtElement));
-
- boolean matches = false;
-
- l: for (Integer level : levels) {
- for (Pair<Integer, Integer> levelRange : enchantmentLevels) {
- if (level >= levelRange.getLeft() && level <= levelRange.getRight()) {
- matches = true;
- break l;
- }
- }
- }
-
- if (!matches)
- return false;
- }
-
- return nbt == null || nbt.test(stack.getNbt());
- }
-
- public void dispose() {
- //stub
- }
-
- /**
- * Takes a defined path and resolves it to an identifier pointing to the resourcepack's path of the specified extension(returns null if no path can be resolved).<br>
- * If definedPath is null, will try to resolve a relative file with the same name as the propertyIdentifier with the extension, otherwise: <br>
- * definedPath will be formatted to replace "\\" with "/" the extension will be appended if not there already. <br>
- * It will first try using definedPath as an absolute path, if it cant resolve(or definedPath starts with ./), definedPath will be considered relative. <br>
- * Relative paths support going to parent directories using "..".
- */
- public static Identifier resolvePath(Identifier propertyIdentifier, String path, String extension, Predicate<Identifier> packContains) {
- if (path == null) {
- path = propertyIdentifier.getPath().substring(0, propertyIdentifier.getPath().length() - 11);
- if (!path.endsWith(extension))
- path = path + extension;
- Identifier pathIdentifier = new Identifier(propertyIdentifier.getNamespace(), path);
- return packContains.test(pathIdentifier) ? pathIdentifier : null;
- }
-
- Identifier pathIdentifier = new Identifier(path);
-
- path = pathIdentifier.getPath().replace('\\', '/');
- if (!path.endsWith(extension))
- path = path + extension;
-
- if (path.startsWith("./"))
- path = path.substring(2);
- else if (!path.contains("..")) {
- pathIdentifier = new Identifier(pathIdentifier.getNamespace(), path);
- if (packContains.test(pathIdentifier))
- return pathIdentifier;
- else if (path.startsWith("assets/")) {
- path = path.substring(7);
- int sep = path.indexOf('/');
- pathIdentifier = new Identifier(path.substring(0, sep), path.substring(sep + 1));
- if (packContains.test(pathIdentifier))
- return pathIdentifier;
- }
- pathIdentifier = new Identifier(pathIdentifier.getNamespace(), switch (extension) {
- case ".png" -> "textures/";
- case ".json" -> "models/";
-
- /* UNREACHABLE FAILSAFE */
- default -> "";
- } + path);
- if (packContains.test(pathIdentifier))
- return pathIdentifier;
- }
-
- LinkedList<String> pathParts = new LinkedList<>(Arrays.asList(propertyIdentifier.getPath().split("/")));
- pathParts.removeLast();
-
- if (path.contains("/")) {
- for (String part : path.split("/")) {
- if (part.equals("..")) {
- if (pathParts.size() == 0)
- return null;
- pathParts.removeLast();
- } else
- pathParts.addLast(part);
- }
- } else
- pathParts.addLast(path);
- path = String.join("/", pathParts);
-
- pathIdentifier = new Identifier(propertyIdentifier.getNamespace(), path);
-
- return packContains.test(pathIdentifier) ? pathIdentifier : null;
- }
-
- /**
- * Author: Paul "prupe" Rupe<br>
- * Taken from MCPatcher under public domain licensing.<br>
- * https://bitbucket.org/prupe/mcpatcher/src/1aa45839b2cd029143809edfa60ec59e5ef75f80/newcode/src/com/prupe/mcpatcher/mal/nbt/NBTRule.java#lines-269:301
- */
- public static boolean matchesPattern(String value, String pattern, int curV, int maxV, int curG, int maxG) {
- for (; curG < maxG; curG++, curV++) {
- char g = pattern.charAt(curG);
- if (g == '*') {
- while (true) {
- if (matchesPattern(value, pattern, curV, maxV, curG + 1, maxG)) {
- return true;
- }
- if (curV >= maxV) {
- break;
- }
- curV++;
- }
- return false;
- } else if (curV >= maxV) {
- break;
- } else if (g == '?') {
- continue;
- }
- if (g == '\\' && curG + 1 < maxG) {
- curG++;
- g = pattern.charAt(curG);
- }
-
- if (g != value.charAt(curV))
- return false;
- }
- return curG == maxG && curV == maxV;
- }
-}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java
deleted file mode 100644
index e919a86..0000000
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package shcm.shsupercm.fabric.citresewn.pack.cits;
-
-import net.minecraft.item.ArmorItem;
-import net.minecraft.item.Item;
-import net.minecraft.resource.ResourceType;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.registry.Registry;
-import shcm.shsupercm.fabric.citresewn.ex.CITParseException;
-import shcm.shsupercm.fabric.citresewn.pack.CITPack;
-
-import java.util.*;
-import java.util.function.Supplier;
-
-public class CITArmor extends CIT {
- public final Map<String, Identifier> textures = new HashMap<>();
-
- public CITArmor(CITPack pack, Identifier identifier, Properties properties) throws CITParseException {
- super(pack, identifier, properties);
- try {
- if (this.items.size() == 0)
- throw new Exception("CIT must target at least one item type");
- for (Item item : this.items)
- if (!(item instanceof ArmorItem))
- throw new Exception("Armor CIT must target armor items only(" + Registry.ITEM.getId(item) + " is not armor)");
-
- for (Object o : properties.keySet())
- if (o instanceof String property && property.startsWith("texture.")) {
- Identifier textureIdentifier = resolvePath(identifier, properties.getProperty(property), ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (textureIdentifier == null)
- throw new Exception("Cannot resolve path for " + property);
-
- this.textures.put(property.substring(8), textureIdentifier);
- }
- } catch (Exception e) {
- throw new CITParseException(pack.resourcePack, identifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
- }
- }
-
- public interface Cached {
- CITArmor citresewn_getCachedCITArmor(Supplier<CITArmor> realtime);
- }
-}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITElytra.java b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITElytra.java
deleted file mode 100644
index 5c9aa1a..0000000
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITElytra.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package shcm.shsupercm.fabric.citresewn.pack.cits;
-
-import net.minecraft.resource.ResourceType;
-import net.minecraft.util.Identifier;
-import shcm.shsupercm.fabric.citresewn.ex.CITParseException;
-import shcm.shsupercm.fabric.citresewn.pack.CITPack;
-
-import java.util.Properties;
-import java.util.function.Supplier;
-
-public class CITElytra extends CIT {
- public final Identifier textureIdentifier;
-
- public CITElytra(CITPack pack, Identifier identifier, Properties properties) throws CITParseException {
- super(pack, identifier, properties);
- try {
- textureIdentifier = resolvePath(identifier, properties.getProperty("texture"), ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (textureIdentifier == null)
- throw new Exception("Cannot resolve texture");
- } catch (Exception e) {
- throw new CITParseException(pack.resourcePack, identifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
- }
- }
-
- public interface Cached {
- CITElytra citresewn_getCachedCITElytra(Supplier<CITElytra> realtime);
- }
-}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITEnchantment.java b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITEnchantment.java
deleted file mode 100644
index 7c4fa94..0000000
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITEnchantment.java
+++ /dev/null
@@ -1,371 +0,0 @@
-package shcm.shsupercm.fabric.citresewn.pack.cits;
-
-import com.mojang.blaze3d.systems.RenderSystem;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.*;
-import net.minecraft.enchantment.EnchantmentHelper;
-import net.minecraft.item.EnchantedBookItem;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.nbt.NbtElement;
-import net.minecraft.resource.ResourceType;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.Util;
-import net.minecraft.util.math.Matrix4f;
-import net.minecraft.util.math.Vec3f;
-import org.lwjgl.opengl.GL11;
-import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig;
-import shcm.shsupercm.fabric.citresewn.ex.CITParseException;
-import shcm.shsupercm.fabric.citresewn.mixin.citenchantment.BufferBuilderStorageAccessor;
-import shcm.shsupercm.fabric.citresewn.mixin.citenchantment.RenderPhaseAccessor;
-import shcm.shsupercm.fabric.citresewn.pack.CITPack;
-
-import java.util.*;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-import static org.lwjgl.opengl.GL11.*;
-import static com.mojang.blaze3d.systems.RenderSystem.*;
-import static shcm.shsupercm.util.logic.Loops.statelessFadingLoop;
-
-public class CITEnchantment extends CIT {
- public static List<CITEnchantment> appliedContext = null;
- public static boolean shouldApply = false;
-
- public final Identifier textureIdentifier;
- public final float speed, rotation, duration, r, g, b, a;
- public final int layer;
- public final boolean useGlint, blur;
- public final Blend blend;
-
- private final WrappedMethodIntensity methodIntensity = new WrappedMethodIntensity();
-
- public final Map<GlintRenderLayer, RenderLayer> renderLayers = new EnumMap<>(GlintRenderLayer.class);
-
- public CITEnchantment(CITPack pack, Identifier identifier, Properties properties) throws CITParseException {
- super(pack, identifier, properties);
- try {
- textureIdentifier = resolvePath(identifier, properties.getProperty("texture"), ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (textureIdentifier == null)
- throw new Exception("Cannot resolve texture");
-
- speed = Float.parseFloat(properties.getProperty("speed", "1"));
-
- rotation = Float.parseFloat(properties.getProperty("rotation", "0"));
-
- duration = Float.max(0f, Float.parseFloat(properties.getProperty("duration", "0")));
-
- layer = Integer.parseInt(properties.getProperty("layer", "0"));
-
- r = Math.max(0f, Float.parseFloat(properties.getProperty("r", "1")));
- g = Math.max(0f, Float.parseFloat(properties.getProperty("g", "1")));
- b = Math.max(0f, Float.parseFloat(properties.getProperty("b", "1")));
- a = Math.max(0f, Float.parseFloat(properties.getProperty("a", "1")));
-
- useGlint = switch (properties.getProperty("useGlint", "false").toLowerCase(Locale.ENGLISH)) {
- case "true" -> true;
- case "false" -> false;
- default -> throw new Exception("useGlint is not a boolean");
- };
-
- blur = switch (properties.getProperty("blur", "true").toLowerCase(Locale.ENGLISH)) {
- case "true" -> true;
- case "false" -> false;
- default -> throw new Exception("blur is not a boolean");
- };
-
- blend = Blend.getBlend(properties.getProperty("blend", "add"));
- } catch (Exception e) {
- throw new CITParseException(pack.resourcePack, identifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
- }
- }
-
- public void activate() {
- for (GlintRenderLayer glintLayer : GlintRenderLayer.values()) {
- RenderLayer renderLayer = glintLayer.build(this);
-
- renderLayers.put(glintLayer, renderLayer);
- ((BufferBuilderStorageAccessor) MinecraftClient.getInstance().getBufferBuilders()).entityBuilders().put(renderLayer, new BufferBuilder(renderLayer.getExpectedBufferSize()));
- }
- }
-
- @Override
- public void dispose() {
- appliedContext = null;
- for (RenderLayer renderLayer : renderLayers.values())
- ((BufferBuilderStorageAccessor) MinecraftClient.getInstance().getBufferBuilders()).entityBuilders().remove(renderLayer);
- }
-
- public enum GlintRenderLayer {
- ARMOR_GLINT("armor_glint", 8f, layer -> layer
- .shader(RenderPhaseAccessor.ARMOR_GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST())
- .layering(RenderPhaseAccessor.VIEW_OFFSET_Z_LAYERING())),
- ARMOR_ENTITY_GLINT("armor_entity_glint", 0.16f, layer -> layer
- .shader(RenderPhaseAccessor.ARMOR_ENTITY_GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST())
- .layering(RenderPhaseAccessor.VIEW_OFFSET_Z_LAYERING())),
- GLINT_TRANSLUCENT("glint_translucent", 8f, layer -> layer
- .shader(RenderPhaseAccessor.TRANSLUCENT_GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST())
- .target(RenderPhaseAccessor.ITEM_TARGET())),
- GLINT("glint", 8f, layer -> layer
- .shader(RenderPhaseAccessor.GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST())),
- DIRECT_GLINT("glint_direct", 8f, layer -> layer
- .shader(RenderPhaseAccessor.DIRECT_GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST())),
- ENTITY_GLINT("entity_glint", 0.16f, layer -> layer
- .shader(RenderPhaseAccessor.ENTITY_GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST())
- .target(RenderPhaseAccessor.ITEM_TARGET())),
- DIRECT_ENTITY_GLINT("entity_glint_direct", 0.16f, layer -> layer
- .shader(RenderPhaseAccessor.DIRECT_ENTITY_GLINT_SHADER())
- .writeMaskState(RenderPhaseAccessor.COLOR_MASK())
- .cull(RenderPhaseAccessor.DISABLE_CULLING())
- .depthTest(RenderPhaseAccessor.EQUAL_DEPTH_TEST()));
-
- public final String name;
- private final Consumer<RenderLayer.MultiPhaseParameters.Builder> setup;
- private final float scale;
-
- GlintRenderLayer(String name, float scale, Consumer<RenderLayer.MultiPhaseParameters.Builder> setup) {
- this.name = name;
- this.scale = scale;
- this.setup = setup;
- }
-
- public RenderLayer build(CITEnchantment enchantment) {
- final float speed = enchantment.speed, rotation = enchantment.rotation, r = enchantment.r, g = enchantment.g, b = enchantment.b, a = enchantment.a;
- final WrappedMethodIntensity methodIntensity = enchantment.methodIntensity;
- //noinspection ConstantConditions
- RenderLayer.MultiPhaseParameters.Builder layer = RenderLayer.MultiPhaseParameters.builder()
- .texture(new RenderPhase.Texture(enchantment.textureIdentifier, enchantment.blur, false))
- .texturing(new RenderPhase.Texturing("citresewn_glint_texturing", () -> {
- float l = Util.getMeasuringTimeMs() * CITResewnConfig.INSTANCE().citenchantment_scroll_multiplier * speed;
- float x = (l % 110000f) / 110000f;
- float y = (l % 30000f) / 30000f;
- Matrix4f matrix4f = Matrix4f.translate(-x, y, 0.0f);
- matrix4f.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(rotation + 10f));
- matrix4f.multiply(Matrix4f.scale(scale, scale, scale));
- setTextureMatrix(matrix4f);
-
- setShaderColor(r, g, b, a * methodIntensity.intensity);
- }, () -> {
- RenderSystem.resetTextureMatrix();
-
- setShaderColor(1f, 1f, 1f, 1f);
- }))
- .transparency(enchantment.blend);
-
- this.setup.accept(layer);
-
- return RenderLayer.of("citresewn:enchantment_" + this.name + ":" + enchantment.propertiesIdentifier.toString(),
- VertexFormats.POSITION_TEXTURE,
- VertexFormat.DrawMode.QUADS,
- 256,
- layer.build(false));
- }
-
- public VertexConsumer tryApply(VertexConsumer base, RenderLayer baseLayer, VertexConsumerProvider provider) {
- if (!shouldApply || appliedContext == null || appliedContext.size() == 0)
- return null;
-
- VertexConsumer[] layers = new VertexConsumer[Math.min(appliedContext.size(), appliedContext.get(0).pack.cap)];
-
- for (int i = 0; i < layers.length; i++)
- layers[i] = provider.getBuffer(appliedContext.get(i).renderLayers.get(GlintRenderLayer.this));
-
- provider.getBuffer(baseLayer); // refresh base layer for armor consumer
-
- return base == null ? VertexConsumers.union(layers) : VertexConsumers.union(VertexConsumers.union(layers), base);
- }
- }
-
- public static class Blend extends RenderPhase.Transparency {
- private final int src, dst, srcAlpha, dstAlpha;
-
- private Blend(String name, int src, int dst, int srcAlpha, int dstAlpha) {
- super(name + "_glint_transparency", null, null);
- this.src = src;
- this.dst = dst;
- this.srcAlpha = srcAlpha;
- this.dstAlpha = dstAlpha;
- }
-
- private Blend(String name, int src, int dst) {
- this(name, src, dst, GL_ZERO, GL_ONE);
- }
-
- @Override
- public void startDrawing() {
- enableBlend();
- blendFuncSeparate(src, dst, srcAlpha, dstAlpha);
- }
-
- @Override
- public void endDrawing() {
- defaultBlendFunc();
- disableBlend();
- }
-
- public static Blend getBlend(String blendString) throws BlendFormatException {
- try { //check named blending function
- return Named.valueOf(blendString.toUpperCase(Locale.ENGLISH)).blend;
- } catch (IllegalArgumentException ignored) { // create custom blending function
- try {
- String[] split = blendString.split(" ");
- int src, dst, srcAlpha, dstAlpha;
- if (split.length == 2) {
- src = parseGLConstant(split[0]);
- dst = parseGLConstant(split[1]);
- srcAlpha = GL_ZERO;
- dstAlpha = GL_ONE;
- } else if (split.length == 4) {
- src = parseGLConstant(split[0]);
- dst = parseGLConstant(split[1]);
- srcAlpha = parseGLConstant(split[2]);
- dstAlpha = parseGLConstant(split[3]);
- } else
- throw new Exception();
-
- return new Blend("custom_" + src + "_" + dst + "_" + srcAlpha + "_" + dstAlpha, src, dst, srcAlpha, dstAlpha);
- } catch (Exception e) {
- throw new BlendFormatException();
- }
- }
- }
-
- private enum Named {
- REPLACE(new Blend("replace", 0, 0) {
- @Override
- public void startDrawing() {
- disableBlend();
- }
- }),
- GLINT(new Blend("glint", GL_SRC_COLOR, GL_ONE)),
- ALPHA(new Blend("alpha", GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)),
- ADD(new Blend("add", GL_SRC_ALPHA, GL_ONE)),
- SUBTRACT(new Blend("subtract", GL_ONE_MINUS_DST_COLOR, GL_ZERO)),
- MULTIPLY(new Blend("multiply", GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)),
- DODGE(new Blend("dodge", GL_ONE, GL_ONE)),
- BURN(new Blend("burn", GL_ZERO, GL_ONE_MINUS_SRC_COLOR)),
- SCREEN(new Blend("screen", GL_ONE, GL_ONE_MINUS_SRC_COLOR)),
- OVERLAY(new Blend("overlay", GL_DST_COLOR, GL_SRC_COLOR));
-
- public final Blend blend;
-
- Named(Blend blend) {
- this.blend = blend;
- }
- }
-
- private static int parseGLConstant(String s) throws Exception {
- try {
- return GL11.class.getDeclaredField(s).getInt(null);
- } catch (NoSuchFieldException ignored) { }
-
- return s.startsWith("0x") ? Integer.parseInt(s.substring(2), 16) : Integer.parseInt(s);
- }
-
- public static class BlendFormatException extends Exception {
- public BlendFormatException() {
- super("Not a valid blending method");
- }
- }
- }
-
- public enum MergeMethod {
- AVERAGE {
- @Override
- public void applyIntensity(Map<Identifier, Integer> stackEnchantments, CITEnchantment cit) {
- Identifier enchantment = null;
- for (Identifier enchantmentMatch : cit.enchantments)
- if (stackEnchantments.containsKey(enchantmentMatch)) {
- enchantment = enchantmentMatch;
- break;
- }
-
- if (enchantment == null) {
- cit.methodIntensity.intensity = 0f;
- } else {
- float sum = 0f;
- for (Integer value : stackEnchantments.values())
- sum += value;
-
- cit.methodIntensity.intensity = (float) stackEnchantments.get(enchantment) / sum;
- }
- }
- },
- LAYERED {
- @Override
- public void applyIntensity(Map<Identifier, Integer> stackEnchantments, CITEnchantment cit) {
- Identifier enchantment = null;
- for (Identifier enchantmentMatch : cit.enchantments)
- if (stackEnchantments.containsKey(enchantmentMatch)) {
- enchantment = enchantmentMatch;
- break;
- }
- if (enchantment == null) {
- cit.methodIntensity.intensity = 0f;
- return;
- }
-
- float max = 0f;
- for (Integer value : stackEnchantments.values())
- if (value > max)
- max = value;
-
- cit.methodIntensity.intensity = (float) stackEnchantments.get(enchantment) / max;
- }
- },
- CYCLE {
- @Override
- public void applyMethod(List<CITEnchantment> citEnchantments, ItemStack stack) {
- List<Map.Entry<CITEnchantment, Float>> durations = new ArrayList<>();
- for (CITEnchantment cit : citEnchantments)
- durations.add(new HashMap.SimpleEntry<>(cit, cit.duration));
-
- for (Map.Entry<CITEnchantment, Float> intensity : statelessFadingLoop(durations, citEnchantments.get(0).pack.fade, ticks, 20).entrySet())
- intensity.getKey().methodIntensity.intensity = intensity.getValue();
- }
- };
-
- public static int ticks = 0;
-
- public void applyIntensity(Map<Identifier, Integer> stackEnchantments, CITEnchantment cit) {
- cit.methodIntensity.intensity = 1f;
- }
-
- public void applyMethod(List<CITEnchantment> citEnchantments, ItemStack stack) {
- Map<Identifier, Integer> stackEnchantments = new LinkedHashMap<>();
- for (NbtElement nbtElement : stack.isOf(Items.ENCHANTED_BOOK) ? EnchantedBookItem.getEnchantmentNbt(stack) : stack.getEnchantments())
- stackEnchantments.put(EnchantmentHelper.getIdFromNbt((NbtCompound) nbtElement), EnchantmentHelper.getLevelFromNbt((NbtCompound) nbtElement));
-
- for (CITEnchantment cit : citEnchantments)
- if (!cit.enchantmentsAny)
- applyIntensity(stackEnchantments, cit);
- }
- }
-
- private static class WrappedMethodIntensity {
- public float intensity = 1f;
- }
-
- public interface Cached {
- List<CITEnchantment> citresewn_getCachedCITEnchantment(Supplier<List<CITEnchantment>> realtime);
- }
-} \ No newline at end of file
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITItem.java b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITItem.java
deleted file mode 100644
index 2300f88..0000000
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITItem.java
+++ /dev/null
@@ -1,463 +0,0 @@
-package shcm.shsupercm.fabric.citresewn.pack.cits;
-
-import com.google.common.collect.ImmutableMap;
-import com.mojang.datafixers.util.Either;
-import it.unimi.dsi.fastutil.objects.Object2IntMap;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
-import net.minecraft.client.render.model.BakedModel;
-import net.minecraft.client.render.model.json.JsonUnbakedModel;
-import net.minecraft.client.render.model.json.ModelOverride;
-import net.minecraft.client.render.model.json.ModelOverrideList;
-import net.minecraft.client.render.model.json.ModelTransformation;
-import net.minecraft.client.texture.SpriteAtlasTexture;
-import net.minecraft.client.util.SpriteIdentifier;
-import net.minecraft.client.world.ClientWorld;
-import net.minecraft.entity.LivingEntity;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.resource.Resource;
-import net.minecraft.resource.ResourceManager;
-import net.minecraft.resource.ResourceType;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.registry.Registry;
-import org.apache.commons.io.IOUtils;
-import shcm.shsupercm.fabric.citresewn.CITResewn;
-import shcm.shsupercm.fabric.citresewn.ex.CITLoadException;
-import shcm.shsupercm.fabric.citresewn.ex.CITParseException;
-import shcm.shsupercm.fabric.citresewn.mixin.cititem.JsonUnbakedModelAccessor;
-import shcm.shsupercm.fabric.citresewn.pack.CITPack;
-import shcm.shsupercm.fabric.citresewn.pack.ResewnItemModelIdentifier;
-import shcm.shsupercm.fabric.citresewn.pack.ResewnTextureIdentifier;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-@SuppressWarnings("deprecation")
-public class CITItem extends CIT {
- private static final String GENERATED_SUB_CITS_PREFIX = "sub_cititem_generated_";
- public static final Set<Identifier> GENERATED_SUB_CITS_SEEN = new HashSet<>();
-
- public Map<Identifier, Identifier> assetIdentifiers = new LinkedHashMap<>();
- public Map<List<ModelOverride.Condition>, JsonUnbakedModel> unbakedAssets = new LinkedHashMap<>();
- private Map<String, Either<SpriteIdentifier, String>> textureOverrideMap = new HashMap<>();
- private boolean isTexture = false;
-
- public BakedModel bakedModel = null;
- public CITOverrideList bakedSubModels = new CITOverrideList();
-
- public CITItem(CITPack pack, Identifier identifier, Properties properties) throws CITParseException {
- super(pack, identifier, properties);
- try {
- if (this.items.size() == 0)
- throw new Exception("CIT must target at least one item type");
-
- Identifier assetIdentifier;
- boolean containsTexture = false;
- String modelProp = properties.getProperty("model");
- if (modelProp == null)
- for (Object o : properties.keySet())
- if (o instanceof String property && (property.startsWith("texture") || property.startsWith("tile"))) {
- containsTexture = true;
- break;
- }
- if (!containsTexture) {
- assetIdentifier = resolvePath(identifier, modelProp, ".json", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (assetIdentifier != null)
- assetIdentifiers.put(null, assetIdentifier);
- else if (modelProp != null) {
- assetIdentifier = resolvePath(identifier, modelProp, ".json", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (assetIdentifier != null)
- assetIdentifiers.put(null, assetIdentifier);
- }
- }
-
- for (Object o : properties.keySet())
- if (o instanceof String property && property.startsWith("model.")) {
- Identifier subIdentifier = resolvePath(identifier, properties.getProperty(property), ".json", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (subIdentifier == null)
- throw new Exception("Cannot resolve path for " + property);
-
- String subItem = property.substring(6);
- Identifier subItemIdentifier = fixDeprecatedSubItem(subItem);
- assetIdentifiers.put(subItemIdentifier == null ? new Identifier("minecraft", "item/" + subItem) : subItemIdentifier, subIdentifier);
- }
-
- if (assetIdentifiers.size() == 0) { // attempt to load texture
- isTexture = true;
- String textureProp = properties.getProperty("texture");
- if (textureProp == null)
- textureProp = properties.getProperty("tile");
- assetIdentifier = resolvePath(identifier, textureProp, ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (assetIdentifier != null)
- assetIdentifiers.put(null, assetIdentifier);
-
- for (Object o : properties.keySet())
- if (o instanceof String property && property.startsWith("texture.")) {
- Identifier subIdentifier = resolvePath(identifier, properties.getProperty(property), ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (subIdentifier == null)
- throw new Exception("Cannot resolve path for " + property);
-
- String subItem = property.substring(8);
- Identifier subItemIdentifier = fixDeprecatedSubItem(subItem);
- assetIdentifiers.put(subItemIdentifier == null ? new Identifier("minecraft", "item/" + subItem) : subItemIdentifier, subIdentifier);
- }
- } else { // attempt to load textureOverrideMap from textures
- String textureProp = properties.getProperty("texture");
- if (textureProp == null)
- textureProp = properties.getProperty("tile");
- if (textureProp != null) {
- assetIdentifier = resolvePath(identifier, textureProp, ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (assetIdentifier != null)
- textureOverrideMap.put(null, Either.left(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new ResewnTextureIdentifier(assetIdentifier))));
- else
- throw new Exception("Cannot resolve path for texture");
- }
-
- for (Object o : properties.keySet())
- if (o instanceof String property && property.startsWith("texture.")) {
- textureProp = properties.getProperty(property);
- Identifier subIdentifier = resolvePath(identifier, textureProp, ".png", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (subIdentifier == null)
- throw new Exception("Cannot resolve path for " + property);
-
- textureOverrideMap.put(property.substring(8), Either.left(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new ResewnTextureIdentifier(subIdentifier))));
- }
- }
-
- if (assetIdentifiers.size() == 0)
- throw new Exception("Cannot resolve path for model/texture");
- } catch (Exception e) {
- throw new CITParseException(pack.resourcePack, identifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
- }
- }
-
- public void loadUnbakedAssets(ResourceManager resourceManager) throws CITLoadException {
- try {
- if (isTexture) {
- JsonUnbakedModel itemJson = getModelForFirstItemType(resourceManager);
- if (((JsonUnbakedModelAccessor) itemJson).getTextureMap().size() > 1) { // use(some/all of) the asset identifiers to build texture override in layered models
- textureOverrideMap = ((JsonUnbakedModelAccessor) itemJson).getTextureMap();
- Identifier defaultAsset = assetIdentifiers.get(null);
- textureOverrideMap.replaceAll((layerName, originalTextureEither) -> {
- Identifier textureIdentifier = assetIdentifiers.remove(originalTextureEither.map(SpriteIdentifier::getTextureId, Identifier::new));
- if (textureIdentifier != null)
- return Either.left(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new ResewnTextureIdentifier(textureIdentifier)));
- if (defaultAsset != null)
- return Either.left(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new ResewnTextureIdentifier(defaultAsset)));
- return null;
- });
-
- if (assetIdentifiers.size() == 0 || (assetIdentifiers.size() == 1 && assetIdentifiers.containsKey(null))) {
- unbakedAssets.put(null, itemJson);
- return;
- }
- }
-
- Identifier baseIdentifier = assetIdentifiers.remove(null);
-
- if (baseIdentifier != null)
- unbakedAssets.put(null, loadUnbakedAsset(resourceManager, baseIdentifier));
-
- if (!assetIdentifiers.isEmpty()) { // contains sub models
- LinkedHashMap<Identifier, List<ModelOverride.Condition>> overrideConditions = new LinkedHashMap<>();
- for (Item item : this.items) {
- Identifier itemIdentifier = Registry.ITEM.getId(item);
- overrideConditions.put(new Identifier(itemIdentifier.getNamespace(), "item/" + itemIdentifier.getPath()), Collections.emptyList());
-
- Identifier itemModelIdentifier = new Identifier(itemIdentifier.getNamespace(), "models/item/" + itemIdentifier.getPath() + ".json");
- try (Resource itemModelResource = resourceManager.getResource(itemModelIdentifier); Reader resourceReader = new InputStreamReader(itemModelResource.getInputStream())) {
- JsonUnbakedModel itemModelJson = JsonUnbakedModel.deserialize(resourceReader);
-
- if (itemModelJson.getOverrides() != null && !itemModelJson.getOverrides().isEmpty())
- for (ModelOverride override : itemModelJson.getOverrides())
- overrideConditions.put(override.getModelId(), override.streamConditions().toList());
- }
- }
-
- ArrayList<Identifier> overrideModels = new ArrayList<>(overrideConditions.keySet());
- Collections.reverse(overrideModels);
-
- for (Identifier overrideModel : overrideModels) {
- Identifier replacement = assetIdentifiers.remove(overrideModel);
- if (replacement == null)
- continue;
-
- List<ModelOverride.Condition> conditions = overrideConditions.get(overrideModel);
- unbakedAssets.put(conditions, loadUnbakedAsset(resourceManager, replacement));
- }
- }
- } else { // isModel
- Identifier baseIdentifier = assetIdentifiers.remove(null);
-
- if (baseIdentifier != null) {
- if (!GENERATED_SUB_CITS_SEEN.add(baseIdentifier)) // cit generated duplicate
- baseIdentifier = new Identifier(baseIdentifier.getNamespace(), GENERATED_SUB_CITS_PREFIX + GENERATED_SUB_CITS_SEEN.size() + "_" + baseIdentifier.getPath());
- GENERATED_SUB_CITS_SEEN.add(baseIdentifier);
-
- JsonUnbakedModel model = loadUnbakedAsset(resourceManager, baseIdentifier);
- unbakedAssets.put(null, model);
-
- if (model.getOverrides().size() > 0 && textureOverrideMap.size() > 0) {
- LinkedHashMap<Identifier, List<ModelOverride.Condition>> overrideConditions = new LinkedHashMap<>();
-
- for (ModelOverride override : model.getOverrides())
- overrideConditions.put(override.getModelId(), override.streamConditions().toList());
-
- ArrayList<Identifier> overrideModels = new ArrayList<>(overrideConditions.keySet());
- Collections.reverse(overrideModels);
-
- for (Identifier overrideModel : overrideModels) {
- Identifier replacement = resolvePath(baseIdentifier, overrideModel.toString(), ".json", resourceManager::containsResource);
- if (replacement != null) {
- String subTexturePath = replacement.toString().substring(0, replacement.toString().lastIndexOf('.'));
- final String subTextureName = subTexturePath.substring(subTexturePath.lastIndexOf('/') + 1);
-
- replacement = baseIdentifier;
- if (!GENERATED_SUB_CITS_SEEN.add(replacement)) // cit generated duplicate
- replacement = new Identifier(replacement.getNamespace(), GENERATED_SUB_CITS_PREFIX + GENERATED_SUB_CITS_SEEN.size() + "_" + replacement.getPath());
- GENERATED_SUB_CITS_SEEN.add(replacement);
-
- JsonUnbakedModel jsonModel = loadUnbakedAsset(resourceManager, replacement);
- jsonModel.getOverrides().clear();
-
- ((JsonUnbakedModelAccessor) jsonModel).getTextureMap().replaceAll((layerName, texture) -> {
- if (layerName != null)
- try {
- for (String subTexture : textureOverrideMap.keySet())
- if (subTextureName.equals(subTexture))
- return textureOverrideMap.get(subTexture);
- } catch (Exception ignored) { }
- return texture;
- });
-
- unbakedAssets.put(overrideConditions.get(overrideModel), jsonModel);
- }
- }
- }
- }
-
- if (!assetIdentifiers.isEmpty()) { // contains sub models
- LinkedHashMap<Identifier, List<ModelOverride.Condition>> overrideConditions = new LinkedHashMap<>();
- for (Item item : this.items) {
- Identifier itemIdentifier = Registry.ITEM.getId(item);
- overrideConditions.put(new Identifier(itemIdentifier.getNamespace(), "item/" + itemIdentifier.getPath()), Collections.emptyList());
-
- Identifier itemModelIdentifier = new Identifier(itemIdentifier.getNamespace(), "models/item/" + itemIdentifier.getPath() + ".json");
- try (Resource itemModelResource = resourceManager.getResource(itemModelIdentifier); Reader resourceReader = new InputStreamReader(itemModelResource.getInputStream())) {
- JsonUnbakedModel itemModelJson = JsonUnbakedModel.deserialize(resourceReader);
-
- if (itemModelJson.getOverrides() != null && !itemModelJson.getOverrides().isEmpty())
- for (ModelOverride override : itemModelJson.getOverrides())
- overrideConditions.put(override.getModelId(), override.streamConditions().toList());
- }
- }
-
- ArrayList<Identifier> overrideModels = new ArrayList<>(overrideConditions.keySet());
- Collections.reverse(overrideModels);
-
- for (Identifier overrideModel : overrideModels) {
- Identifier replacement = assetIdentifiers.remove(overrideModel);
- if (replacement == null)
- continue;
-
- if (!GENERATED_SUB_CITS_SEEN.add(replacement)) // cit generated duplicate
- replacement = new Identifier(replacement.getNamespace(), GENERATED_SUB_CITS_PREFIX + GENERATED_SUB_CITS_SEEN.size() + "_" + replacement.getPath());
- GENERATED_SUB_CITS_SEEN.add(replacement);
-
- List<ModelOverride.Condition> conditions = overrideConditions.get(overrideModel);
- unbakedAssets.put(conditions, loadUnbakedAsset(resourceManager, replacement));
- }
- }
- }
- } catch (Exception e) {
- throw new CITLoadException(pack.resourcePack, propertiesIdentifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
- } finally {
- assetIdentifiers = null;
- textureOverrideMap = null;
- }
- }
-
- private JsonUnbakedModel loadUnbakedAsset(ResourceManager resourceManager, Identifier assetIdentifier) throws Exception {
- final Identifier identifier;
- {
- Identifier possibleIdentifier = assetIdentifier;
- while (possibleIdentifier.getPath().startsWith(GENERATED_SUB_CITS_PREFIX))
- possibleIdentifier = new Identifier(possibleIdentifier.getNamespace(), possibleIdentifier.getPath().substring(possibleIdentifier.getPath().substring(GENERATED_SUB_CITS_PREFIX.length()).indexOf('_') + GENERATED_SUB_CITS_PREFIX.length() + 1));
- identifier = possibleIdentifier;
- }
- JsonUnbakedModel json;
- if (identifier.getPath().endsWith(".json")) {
- InputStream is = null;
- Resource resource = null;
- try {
- json = JsonUnbakedModel.deserialize(IOUtils.toString(is = (resource = resourceManager.getResource(identifier)).getInputStream(), StandardCharsets.UTF_8));
- json.id = assetIdentifier.toString();
- json.id = json.id.substring(0, json.id.length() - 5);
-
- ((JsonUnbakedModelAccessor) json).getTextureMap().replaceAll((layer, original) -> {
- Optional<SpriteIdentifier> left = original.left();
- if (left.isPresent()) {
- Identifier resolvedIdentifier = resolvePath(identifier, left.get().getTextureId().getPath(), ".png", resourceManager::containsResource);
- if (resolvedIdentifier != null)
- return Either.left(new SpriteIdentifier(left.get().getAtlasId(), new ResewnTextureIdentifier(resolvedIdentifier)));
- }
- return original;
- });
-
- if (textureOverrideMap.size() > 0) {
- Map<String, Either<SpriteIdentifier, String>> jsonTextureMap = ((JsonUnbakedModelAccessor) json).getTextureMap();
- if (jsonTextureMap.size() == 0)
- jsonTextureMap.put("layer0", null);
-
- final Either<SpriteIdentifier, String> defaultTextureOverride = textureOverrideMap.get(null);
- if (defaultTextureOverride != null)
- jsonTextureMap.replaceAll((layerName, spriteIdentifierStringEither) -> defaultTextureOverride);
-
- //jsonTextureMap.putAll(textureOverrideMap);
- jsonTextureMap.replaceAll((layerName, texture) -> {
- if (layerName != null)
- try {
- String[] split = texture.map(id -> id.getTextureId().getPath(), s -> s).split("/");
- String textureName = split[split.length - 1];
- if (textureName.endsWith(".png"))
- textureName = textureName.substring(0, textureName.length() - 4);
- return Objects.requireNonNull(textureOverrideMap.get(textureName));
- } catch (Exception ignored) { }
- return texture;
- });
- jsonTextureMap.values().removeIf(Objects::isNull);
- }
-
- Identifier parentId = ((JsonUnbakedModelAccessor) json).getParentId();
- if (parentId != null) {
- String[] parentIdPathSplit = parentId.getPath().split("/");
- if (parentId.getPath().startsWith("./") || (parentIdPathSplit.length > 2 && parentIdPathSplit[1].equals("cit"))) {
- parentId = resolvePath(identifier, parentId.getPath(), ".json", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (parentId != null)
- ((JsonUnbakedModelAccessor) json).setParentId(new ResewnItemModelIdentifier(parentId));
- }
- }
-
- json.getOverrides().replaceAll(override -> {
- String[] modelIdPathSplit = override.getModelId().getPath().split("/");
- if (override.getModelId().getPath().startsWith("./") || (modelIdPathSplit.length > 2 && modelIdPathSplit[1].equals("cit"))) {
- Identifier resolvedOverridePath = resolvePath(identifier, override.getModelId().getPath(), ".json", id -> pack.resourcePack.contains(ResourceType.CLIENT_RESOURCES, id));
- if (resolvedOverridePath != null)
- return new ModelOverride(new ResewnItemModelIdentifier(resolvedOverridePath), override.streamConditions().collect(Collectors.toList()));
- }
-
- return override;
- });
-
- return json;
- } finally {
- IOUtils.closeQuietly(is, resource);
- }
- } else if (identifier.getPath().endsWith(".png")) {
- json = getModelForFirstItemType(resourceManager);
- if (json == null)
- json = new JsonUnbakedModel(new Identifier("minecraft", "item/generated"), new ArrayList<>(), ImmutableMap.of("layer0", Either.left(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new ResewnTextureIdentifier(identifier)))), true, JsonUnbakedModel.GuiLight.ITEM, ModelTransformation.NONE, new ArrayList<>());
- json.getOverrides().clear();
- json.id = identifier.toString();
- json.id = json.id.substring(0, json.id.length() - 4);
-
- ((JsonUnbakedModelAccessor) json).getTextureMap().replaceAll((layerName, originalTextureEither) -> {
- if (textureOverrideMap.size() > 0) {
- Either<SpriteIdentifier, String> textureOverride = textureOverrideMap.get(layerName);
- if (textureOverride == null)
- textureOverride = textureOverrideMap.get(null);
- return textureOverride == null ? originalTextureEither : textureOverride;
- } else
- return Either.left(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, new ResewnTextureIdentifier(identifier)));
- });
- return json;
- }
-
- throw new Exception("Unknown asset type");
- }
-
- public Identifier fixDeprecatedSubItem(String subItem) {
- String replacement = switch (subItem) {
- case "bow_pulling_standby" -> "bow";
- case "crossbow_standby" -> "crossbow";
- case "potion_bottle_drinkable" -> "potion";
- case "potion_bottle_splash" -> "splash_potion";
- case "potion_bottle_lingering" -> "lingering_potion";
-
-
- default -> null;
- };
-
- if (replacement != null) {
- CITResewn.logWarnLoading("CIT Warning: Using deprecated sub item id \"" + subItem + "\" instead of \"" + replacement + "\" in " + pack.resourcePack.getName() + " -> " + propertiesIdentifier.toString());
-
- return new Identifier("minecraft", "item/" + replacement);
- }
-
- return null;
- }
-
- private JsonUnbakedModel getModelForFirstItemType(ResourceManager resourceManager) {
- Identifier firstItemIdentifier = Registry.ITEM.getId(this.items.iterator().next()), firstItemModelIdentifier = new Identifier(firstItemIdentifier.getNamespace(), "models/item/" + firstItemIdentifier.getPath() + ".json");
- Resource itemModelResource = null;
- try {
- JsonUnbakedModel json = JsonUnbakedModel.deserialize(IOUtils.toString((itemModelResource = resourceManager.getResource(firstItemModelIdentifier)).getInputStream(), StandardCharsets.UTF_8));
-
- if (!GENERATED_SUB_CITS_SEEN.add(firstItemModelIdentifier)) // cit generated duplicate
- firstItemModelIdentifier = new Identifier(firstItemModelIdentifier.getNamespace(), GENERATED_SUB_CITS_PREFIX + GENERATED_SUB_CITS_SEEN.size() + "_" + firstItemModelIdentifier.getPath());
- GENERATED_SUB_CITS_SEEN.add(firstItemModelIdentifier);
-
- json.id = firstItemModelIdentifier.toString();
- json.id = json.id.substring(0, json.id.length() - 5);
- return json;
- } catch (Exception e) {
- return null;
- } finally {
- IOUtils.closeQuietly(itemModelResource);
- }
- }
-
- public BakedModel getItemModel(ItemStack stack, ClientWorld world, LivingEntity entity, int seed) {
- // get sub items or bakedModel if no sub item matches @Nullable
- BakedModel bakedModel = bakedSubModels.apply(this.bakedModel, stack, world, entity, seed);
-
- // apply model overrides
- if (bakedModel != null && bakedModel.getOverrides() != null)
- bakedModel = bakedModel.getOverrides().apply(bakedModel, stack, world, entity, seed);
-
- return bakedModel;
- }
-
- public static class CITOverrideList extends ModelOverrideList {
- public void override(List<ModelOverride.Condition> key, BakedModel bakedModel) {
- Set<Identifier> conditionTypes = new LinkedHashSet<>(Arrays.asList(this.conditionTypes));
- for (ModelOverride.Condition condition : key)
- conditionTypes.add(condition.getType());
- this.conditionTypes = conditionTypes.toArray(new Identifier[0]);
-
- this.overrides = Arrays.copyOf(this.overrides, this.overrides.length + 1);
-
- Object2IntMap<Identifier> object2IntMap = new Object2IntOpenHashMap<>();
- for(int i = 0; i < this.conditionTypes.length; ++i)
- object2IntMap.put(this.conditionTypes[i], i);
-
- this.overrides[this.overrides.length - 1] = new BakedOverride(
- key.stream()
- .map((condition) -> new InlinedCondition(object2IntMap.getInt(condition.getType()), condition.getThreshold()))
- .toArray(InlinedCondition[]::new)
- , bakedModel);
- }
- }
-
- public interface Cached {
- CITItem citresewn_getCachedCITItem(Supplier<CITItem> realtime);
-
- boolean citresewn_isMojankCIT();
- void citresewn_setMojankCIT(boolean mojankCIT);
- }
-}