diff --git a/.gitignore b/.gitignore index a5f42e73e..89623a315 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .gradle # Eclipse +.checkstyle .classpath .metadata .settings diff --git a/build.gradle b/build.gradle index e151ab056..5786d435d 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,7 @@ def getBranch(){ } allprojects { + apply plugin: 'checkstyle' apply plugin: 'maven-publish' apply plugin: 'fabric-loom' apply plugin: 'net.minecrell.licenser' @@ -52,8 +53,6 @@ allprojects { group = "net.fabricmc.fabric-api" - - dependencies { minecraft "com.mojang:minecraft:$Globals.mcVersion" mappings "net.fabricmc:yarn:${Globals.mcVersion}${Globals.yarnVersion}" @@ -105,9 +104,14 @@ allprojects { classifier = 'sources' from sourceSets.main.allSource } - + + checkstyle { + configFile = rootProject.file("checkstyle.xml") + toolVersion = '8.25' + } } -javadoc{ + +javadoc { options.memberLevel = "PACKAGE" allprojects.each{ source( it.sourceSets.main.allJava.srcDirs) diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 000000000..3969a8e3d --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/Event.java b/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/Event.java index 4a78cb157..c3c652f6f 100644 --- a/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/Event.java +++ b/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/Event.java @@ -32,8 +32,8 @@ public abstract class Event { /** * Returns the invoker instance. - *

- * An "invoker" is an object which hides multiple registered + * + *

An "invoker" is an object which hides multiple registered * listeners of type T under one instance of type T, executing * them and leaving early as necessary. * diff --git a/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/EventFactory.java b/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/EventFactory.java index 826e62780..aab0cbbdd 100644 --- a/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/EventFactory.java +++ b/fabric-api-base/src/main/java/net/fabricmc/fabric/api/event/EventFactory.java @@ -16,19 +16,17 @@ package net.fabricmc.fabric.api.event; -import net.fabricmc.fabric.impl.event.EventFactoryImpl; - import java.util.function.Function; +import net.fabricmc.fabric.impl.event.EventFactoryImpl; + /** * Helper for creating {@link Event} classes. */ public final class EventFactory { private static boolean profilingEnabled = true; - private EventFactory() { - - } + private EventFactory() { } /** * @return True if events are supposed to be profiled. @@ -61,8 +59,8 @@ public final class EventFactory { /** * Create an "array-backed" Event instance with a custom empty invoker. - *

- * Having a custom empty invoker (of type (...) -> {}) increases performance + * + *

Having a custom empty invoker (of type (...) -> {}) increases performance * relative to iterating over an empty array; however, it only really matters * if the event is executed thousands of times a second. * diff --git a/fabric-api-base/src/main/java/net/fabricmc/fabric/api/util/NbtType.java b/fabric-api-base/src/main/java/net/fabricmc/fabric/api/util/NbtType.java index 931124495..1329371c2 100644 --- a/fabric-api-base/src/main/java/net/fabricmc/fabric/api/util/NbtType.java +++ b/fabric-api-base/src/main/java/net/fabricmc/fabric/api/util/NbtType.java @@ -22,10 +22,10 @@ import net.minecraft.nbt.Tag; /** * NBT type ID constants. Useful for filtering by value type in a few cases. * + *

For the current list of types, check with {@link Tag#TYPES}. + * * @see CompoundTag#containsKey(String, int) * @see Tag#idToString(int) - *

- * For the current list of types, check with {@link Tag#TYPES}. */ public final class NbtType { public static final int END = 0; @@ -49,7 +49,5 @@ public final class NbtType { */ public static final int NUMBER = 99; - private NbtType() { - - } + private NbtType() { } } diff --git a/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/ArrayBackedEvent.java b/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/ArrayBackedEvent.java index 8a86c8a62..8f6b376e3 100644 --- a/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/ArrayBackedEvent.java +++ b/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/ArrayBackedEvent.java @@ -16,12 +16,12 @@ package net.fabricmc.fabric.impl.event; -import net.fabricmc.fabric.api.event.Event; - import java.lang.reflect.Array; import java.util.Arrays; import java.util.function.Function; +import net.fabricmc.fabric.api.event.Event; + class ArrayBackedEvent extends Event { private final Class type; private final Function invokerFactory; diff --git a/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/EventFactoryImpl.java b/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/EventFactoryImpl.java index 91b224a39..c4419fd97 100644 --- a/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/EventFactoryImpl.java +++ b/fabric-api-base/src/main/java/net/fabricmc/fabric/impl/event/EventFactoryImpl.java @@ -16,8 +16,6 @@ package net.fabricmc.fabric.impl.event; -import net.fabricmc.fabric.api.event.Event; - import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -29,12 +27,12 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Function; +import net.fabricmc.fabric.api.event.Event; + public final class EventFactoryImpl { private static final List> ARRAY_BACKED_EVENTS = new ArrayList<>(); - private EventFactoryImpl() { - - } + private EventFactoryImpl() { } public static void invalidate() { ARRAY_BACKED_EVENTS.forEach(ArrayBackedEvent::update); diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/FabricBiomes.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/FabricBiomes.java index 20c781c62..4fc72600c 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/FabricBiomes.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/FabricBiomes.java @@ -16,24 +16,22 @@ package net.fabricmc.fabric.api.biomes.v1; -import net.fabricmc.fabric.impl.biomes.InternalBiomeData; import net.minecraft.world.biome.Biome; +import net.fabricmc.fabric.impl.biomes.InternalBiomeData; + /** - * General API that applies to all biome sources + * General API that applies to all biome sources. */ public final class FabricBiomes { - - private FabricBiomes() { - } + private FabricBiomes() { } /** - * Allows players to naturally spawn in this biome + * Allows players to naturally spawn in this biome. * * @param biome a biome the player should be able to spawn in */ public static void addSpawnBiome(Biome biome) { InternalBiomeData.addSpawnBiome(biome); } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldBiomes.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldBiomes.java index f2cbdf2d9..5c0cf5a1b 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldBiomes.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldBiomes.java @@ -16,16 +16,15 @@ package net.fabricmc.fabric.api.biomes.v1; -import net.fabricmc.fabric.impl.biomes.InternalBiomeData; import net.minecraft.world.biome.Biome; +import net.fabricmc.fabric.impl.biomes.InternalBiomeData; + /** - * API that exposes some internals of the minecraft default biome source for the overworld + * API that exposes some internals of the minecraft default biome source for the overworld. */ public final class OverworldBiomes { - - private OverworldBiomes() { - } + private OverworldBiomes() { } /** * Adds the biome to the specified climate group, with the specified weight. This is only for the biomes that make up the initial continents in generation. @@ -41,7 +40,7 @@ public final class OverworldBiomes { } /** - * Adds the biome as a hills variant of the parent biome, with the specified weight + * Adds the biome as a hills variant of the parent biome, with the specified weight. * * @param parent the biome to where the hills variant is added * @param hills the biome to be set as a hills variant @@ -54,7 +53,7 @@ public final class OverworldBiomes { } /** - * Adds the biome as a shore/beach biome for the parent biome, with the specified weight + * Adds the biome as a shore/beach biome for the parent biome, with the specified weight. * * @param parent the base biome to where the shore biome is added * @param shore the biome to be added as a shore biome @@ -67,7 +66,7 @@ public final class OverworldBiomes { } /** - * Adds the biome as an an edge biome (excluding as a beach) of the parent biome, with the specified weight + * Adds the biome as an an edge biome (excluding as a beach) of the parent biome, with the specified weight. * * @param parent the base biome to where the edge biome is added * @param edge the biome to be added as an edge biome @@ -81,7 +80,8 @@ public final class OverworldBiomes { /** * Adds a 'variant' biome which replaces another biome on occasion. - * For example, addBiomeVariant(Biomes.JUNGLE, Biomes.DESERT, 0.2) will replace 20% of jungles with deserts. + * + *

For example, addBiomeVariant(Biomes.JUNGLE, Biomes.DESERT, 0.2) will replace 20% of jungles with deserts. * This method is rather useful for replacing biomes not generated through standard methods, such as oceans, * deep oceans, jungles, mushroom islands, etc. When replacing ocean and deep ocean biomes, one must specify * the biome without temperature (Biomes.OCEAN / Biomes.DEEP_OCEAN) only, as ocean temperatures have not been @@ -107,5 +107,4 @@ public final class OverworldBiomes { public static void setRiverBiome(Biome parent, Biome river) { InternalBiomeData.setOverworldRiverBiome(parent, river); } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldClimate.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldClimate.java index d40a428b6..7637dea3e 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldClimate.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/api/biomes/v1/OverworldClimate.java @@ -17,27 +17,26 @@ package net.fabricmc.fabric.api.biomes.v1; /** - * Represents the climates of biomes on the overworld continents + * Represents the climates of biomes on the overworld continents. */ public enum OverworldClimate { - /** - * Includes Snowy Tundra (with a weight of 3) and Snowy Taiga (with a weight of 1) + * Includes Snowy Tundra (with a weight of 3) and Snowy Taiga (with a weight of 1). */ SNOWY, /** - * Includes Forest, Taiga, Mountains, and Plains (all with weights of 1) + * Includes Forest, Taiga, Mountains, and Plains (all with weights of 1). */ COOL, /** - * Includes Forest, Dark Forest, Mountains, Plains, Birch Forest, and Swamp (all with weights of 1) + * Includes Forest, Dark Forest, Mountains, Plains, Birch Forest, and Swamp (all with weights of 1). */ TEMPERATE, /** - * Includes Desert (with a weight of 3), Savanna (with a weight of 2), and Plains (with a weight of 1) + * Includes Desert (with a weight of 3), Savanna (with a weight of 2), and Plains (with a weight of 1). */ DRY } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/BiomeVariant.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/BiomeVariant.java index 854823f2c..cf95f581e 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/BiomeVariant.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/BiomeVariant.java @@ -19,10 +19,9 @@ package net.fabricmc.fabric.impl.biomes; import net.minecraft.world.biome.Biome; /** - * Represents a biome variant and its corresponding chance + * Represents a biome variant and its corresponding chance. */ final class BiomeVariant { - private final Biome variant; private final double chance; @@ -48,5 +47,4 @@ final class BiomeVariant { double getChance() { return chance; } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/ContinentalBiomeEntry.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/ContinentalBiomeEntry.java index 17e41caa9..dbefa3836 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/ContinentalBiomeEntry.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/ContinentalBiomeEntry.java @@ -19,7 +19,7 @@ package net.fabricmc.fabric.impl.biomes; import net.minecraft.world.biome.Biome; /** - * Represents a biome and its corresponding weight + * Represents a biome and its corresponding weight. */ final class ContinentalBiomeEntry { private final Biome biome; diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeData.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeData.java index c6b557850..268de271c 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeData.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeData.java @@ -16,26 +16,30 @@ package net.fabricmc.fabric.impl.biomes; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; + import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biomes; import net.minecraft.world.biome.layer.BiomeLayers; import net.minecraft.world.biome.source.VanillaLayeredBiomeSource; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.*; +import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; /** * Lists and maps for internal use only! Stores data that is used by the various mixins into the world generation */ public final class InternalBiomeData { - - private InternalBiomeData() { - } + private InternalBiomeData() { } private static final EnumMap OVERWORLD_MODDED_CONTINENTAL_BIOME_PICKERS = new EnumMap<>(OverworldClimate.class); private static final Map OVERWORLD_HILLS_MAP = new HashMap<>(); @@ -95,6 +99,7 @@ public final class InternalBiomeData { public static void setOverworldRiverBiome(Biome primary, Biome river) { Preconditions.checkArgument(primary != null, "Primary biome is null"); OVERWORLD_RIVER_MAP.put(primary, river); + if (river != null) { injectOverworldBiome(river); } @@ -113,7 +118,7 @@ public final class InternalBiomeData { } injectBiomeMethod.invoke(null, biome); - } catch (NoSuchMethodException | SecurityException | IllegalAccessException | InvocationTargetException e){ + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeUtils.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeUtils.java index 98a4b39cf..74fee8852 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeUtils.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/InternalBiomeUtils.java @@ -16,23 +16,22 @@ package net.fabricmc.fabric.impl.biomes; -import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; +import java.util.List; +import java.util.Map; +import java.util.function.IntConsumer; + import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.layer.LayerRandomnessSource; -import java.util.List; -import java.util.Map; -import java.util.function.IntConsumer; +import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; /** - * Internal utilities used for biome sampling + * Internal utilities used for biome sampling. */ public final class InternalBiomeUtils { - - private InternalBiomeUtils() { - } + private InternalBiomeUtils() { } /** * @param north raw id of the biome to the north @@ -85,14 +84,17 @@ public final class InternalBiomeUtils { reqWeightSum -= vanillaArrayWeight; int low = 0; int high = moddedBiomes.size() - 1; + while (low < high) { int mid = (high + low) >>> 1; + if (reqWeightSum < moddedBiomes.get(mid).getUpperWeightBound()) { high = mid; } else { low = mid + 1; } } + return low; } @@ -127,7 +129,7 @@ public final class InternalBiomeUtils { } int vanillaArrayWeight = vanillaArray.length; - double reqWeightSum = (double) random.nextInt(Integer.MAX_VALUE) * (vanillaArray.length + picker.getCurrentWeightTotal()) / Integer.MAX_VALUE; + double reqWeightSum = random.nextInt(Integer.MAX_VALUE) * (vanillaArray.length + picker.getCurrentWeightTotal()) / Integer.MAX_VALUE; if (reqWeightSum < vanillaArray.length) { // Vanilla biome; look it up from the vanilla array and transform accordingly. diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/VariantTransformer.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/VariantTransformer.java index 537e2b7c1..d7612d74f 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/VariantTransformer.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/VariantTransformer.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.impl.biomes; -import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.layer.LayerRandomnessSource; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.layer.LayerRandomnessSource; + +import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; + /** - * Deals with picking variants for you + * Deals with picking variants for you. */ final class VariantTransformer { private final SubTransformer defaultTransformer = new SubTransformer(); @@ -49,7 +50,7 @@ final class VariantTransformer { } /** - * Transforms a biome into a variant randomly depending on its chance + * Transforms a biome into a variant randomly depending on its chance. * * @param replaced biome to transform * @param random the {@link LayerRandomnessSource} from the layer @@ -81,7 +82,7 @@ final class VariantTransformer { } /** - * Transforms a biome into a variant randomly depending on its chance + * Transforms a biome into a variant randomly depending on its chance. * * @param replaced biome to transform * @param random the {@link LayerRandomnessSource} from the layer @@ -93,6 +94,7 @@ final class VariantTransformer { return variant.getVariant(); } } + return replaced; } } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/WeightedBiomePicker.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/WeightedBiomePicker.java index 2c7351427..127943db0 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/WeightedBiomePicker.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/impl/biomes/WeightedBiomePicker.java @@ -16,13 +16,14 @@ package net.fabricmc.fabric.impl.biomes; -import com.google.common.base.Preconditions; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.layer.LayerRandomnessSource; - import java.util.ArrayList; import java.util.List; +import com.google.common.base.Preconditions; + +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.layer.LayerRandomnessSource; + /** * Picks biomes with arbitrary double weights using a binary search. */ @@ -46,13 +47,13 @@ public final class WeightedBiomePicker { } public Biome pickRandom(LayerRandomnessSource random) { - double target = (double) random.nextInt(Integer.MAX_VALUE) * getCurrentWeightTotal() / Integer.MAX_VALUE; + double target = random.nextInt(Integer.MAX_VALUE) * getCurrentWeightTotal() / Integer.MAX_VALUE; return search(target).getBiome(); } /** - * Searches with the specified target value + * Searches with the specified target value. * * @param target The target value, must satisfy the constraint 0 <= target <= currentTotal * @return The result of the search @@ -67,6 +68,7 @@ public final class WeightedBiomePicker { while (low < high) { int mid = (high + low) >>> 1; + if (target < entries.get(mid).getUpperWeightBound()) { high = mid; } else { diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddEdgeBiomesLayer.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddEdgeBiomesLayer.java index 85277ba98..263ff3d67 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddEdgeBiomesLayer.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddEdgeBiomesLayer.java @@ -16,32 +16,33 @@ package net.fabricmc.fabric.mixin.biomes; -import net.fabricmc.fabric.api.biomes.v1.OverworldBiomes; -import net.fabricmc.fabric.impl.biomes.InternalBiomeData; -import net.fabricmc.fabric.impl.biomes.InternalBiomeUtils; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.layer.AddEdgeBiomesLayer; -import net.minecraft.world.biome.layer.LayerRandomnessSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.layer.AddEdgeBiomesLayer; +import net.minecraft.world.biome.layer.LayerRandomnessSource; + +import net.fabricmc.fabric.api.biomes.v1.OverworldBiomes; +import net.fabricmc.fabric.impl.biomes.InternalBiomeData; +import net.fabricmc.fabric.impl.biomes.InternalBiomeUtils; + /** - * Adds edges and shores specified in {@link OverworldBiomes#addEdgeBiome(Biome, Biome, double)} and {@link OverworldBiomes#addShoreBiome(Biome, Biome, double)} to the edges layer + * Adds edges and shores specified in {@link OverworldBiomes#addEdgeBiome(Biome, Biome, double)} and {@link OverworldBiomes#addShoreBiome(Biome, Biome, double)} to the edges layer. */ @Mixin(AddEdgeBiomesLayer.class) public class MixinAddEdgeBiomesLayer { - @Inject(at = @At("HEAD"), method = "sample", cancellable = true) private void sample(LayerRandomnessSource rand, int north, int east, int south, int west, int center, CallbackInfoReturnable info) { Biome centerBiome = Registry.BIOME.get(center); + if (InternalBiomeData.getOverworldShores().containsKey(centerBiome) && InternalBiomeUtils.neighborsOcean(north, east, south, west)) { info.setReturnValue(Registry.BIOME.getRawId(InternalBiomeData.getOverworldShores().get(centerBiome).pickRandom(rand))); } else if (InternalBiomeData.getOverworldEdges().containsKey(centerBiome) && InternalBiomeUtils.isEdge(north, east, south, west, center)) { info.setReturnValue(Registry.BIOME.getRawId(InternalBiomeData.getOverworldEdges().get(centerBiome).pickRandom(rand))); } } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddHillsLayer.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddHillsLayer.java index e3af6cf35..4393fd368 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddHillsLayer.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddHillsLayer.java @@ -16,26 +16,27 @@ package net.fabricmc.fabric.mixin.biomes; -import net.fabricmc.fabric.api.biomes.v1.OverworldBiomes; -import net.fabricmc.fabric.impl.biomes.InternalBiomeData; -import net.fabricmc.fabric.impl.biomes.WeightedBiomePicker; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.layer.AddHillsLayer; import net.minecraft.world.biome.layer.BiomeLayers; import net.minecraft.world.biome.layer.LayerRandomnessSource; import net.minecraft.world.biome.layer.LayerSampler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.fabricmc.fabric.api.biomes.v1.OverworldBiomes; +import net.fabricmc.fabric.impl.biomes.InternalBiomeData; +import net.fabricmc.fabric.impl.biomes.WeightedBiomePicker; /** - * Injects hills biomes specified from {@link OverworldBiomes#addHillsBiome(Biome, Biome, double)}into the default hills layer + * Injects hills biomes specified from {@link OverworldBiomes#addHillsBiome(Biome, Biome, double)}into the default hills layer. */ @Mixin(AddHillsLayer.class) public class MixinAddHillsLayer { - @Inject(at = @At("HEAD"), method = "sample", cancellable = true) private void sample(LayerRandomnessSource rand, LayerSampler biomeSampler, LayerSampler noiseSampler, int chunkX, int chunkZ, CallbackInfoReturnable info) { if (InternalBiomeData.getOverworldHills().isEmpty()) { @@ -67,18 +68,23 @@ public class MixinAddHillsLayer { if (biomeReturn != biomeId) { int similarity = 0; + if (BiomeLayers.areSimilar(biomeSampler.sample(chunkX, chunkZ - 1), biomeId)) { ++similarity; } + if (BiomeLayers.areSimilar(biomeSampler.sample(chunkX + 1, chunkZ), biomeId)) { ++similarity; } + if (BiomeLayers.areSimilar(biomeSampler.sample(chunkX - 1, chunkZ), biomeId)) { ++similarity; } + if (BiomeLayers.areSimilar(biomeSampler.sample(chunkX, chunkZ + 1), biomeId)) { ++similarity; } + if (similarity >= 3) { info.setReturnValue(biomeReturn); return; @@ -89,5 +95,4 @@ public class MixinAddHillsLayer { // Cancel vanilla logic. info.setReturnValue(biomeId); } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddRiversLayer.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddRiversLayer.java index 8ada40f15..345205a53 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddRiversLayer.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinAddRiversLayer.java @@ -16,13 +16,8 @@ package net.fabricmc.fabric.mixin.biomes; -import net.fabricmc.fabric.api.biomes.v1.OverworldBiomes; -import net.fabricmc.fabric.impl.biomes.InternalBiomeData; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.layer.AddRiversLayer; -import net.minecraft.world.biome.layer.LayerRandomnessSource; -import net.minecraft.world.biome.layer.LayerSampler; +import java.util.Map; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,14 +25,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Map; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.layer.AddRiversLayer; +import net.minecraft.world.biome.layer.LayerRandomnessSource; +import net.minecraft.world.biome.layer.LayerSampler; + +import net.fabricmc.fabric.api.biomes.v1.OverworldBiomes; +import net.fabricmc.fabric.impl.biomes.InternalBiomeData; /** - * Sets river biomes specified with {@link OverworldBiomes#setRiverBiome(Biome, Biome)} + * Sets river biomes specified with {@link OverworldBiomes#setRiverBiome(Biome, Biome)}. */ @Mixin(AddRiversLayer.class) public class MixinAddRiversLayer { - @Shadow @Final private static int RIVER_ID; @@ -49,10 +50,10 @@ public class MixinAddRiversLayer { int riverBiomeId = riverSampler.sample(x, z); Map overworldRivers = InternalBiomeData.getOverworldRivers(); + if (overworldRivers.containsKey(landBiome) && riverBiomeId == RIVER_ID) { Biome riverBiome = overworldRivers.get(landBiome); info.setReturnValue(riverBiome == null ? landBiomeId : Registry.BIOME.getRawId(riverBiome)); } } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinBiomeSource.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinBiomeSource.java index 1f8e66eb6..a7b4b7e95 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinBiomeSource.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinBiomeSource.java @@ -16,9 +16,11 @@ package net.fabricmc.fabric.mixin.biomes; -import net.fabricmc.fabric.impl.biomes.InternalBiomeData; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.BiomeSource; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,17 +28,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; + +import net.fabricmc.fabric.impl.biomes.InternalBiomeData; /** * Adds spawn biomes to the base {@link BiomeSource} class. */ @Mixin(BiomeSource.class) public class MixinBiomeSource { - @Shadow @Final private static List SPAWN_BIOMES; @@ -44,9 +45,9 @@ public class MixinBiomeSource { @Inject(at = @At("RETURN"), cancellable = true, method = "getSpawnBiomes") private void getSpawnBiomes(CallbackInfoReturnable> info) { Set biomes = new LinkedHashSet<>(info.getReturnValue()); + if (biomes.addAll(InternalBiomeData.getSpawnBiomes())) { info.setReturnValue(new ArrayList<>(biomes)); } } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinSetBaseBiomesLayer.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinSetBaseBiomesLayer.java index 7fb4104bf..4e8fd29ab 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinSetBaseBiomesLayer.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinSetBaseBiomesLayer.java @@ -16,12 +16,6 @@ package net.fabricmc.fabric.mixin.biomes; -import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; -import net.fabricmc.fabric.impl.biomes.InternalBiomeUtils; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.layer.LayerRandomnessSource; -import net.minecraft.world.biome.layer.SetBaseBiomesLayer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -30,12 +24,19 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.layer.LayerRandomnessSource; +import net.minecraft.world.biome.layer.SetBaseBiomesLayer; + +import net.fabricmc.fabric.api.biomes.v1.OverworldClimate; +import net.fabricmc.fabric.impl.biomes.InternalBiomeUtils; + /** - * Injects biomes into the arrays of biomes in the {@link SetBaseBiomesLayer} + * Injects biomes into the arrays of biomes in the {@link SetBaseBiomesLayer}. */ @Mixin(SetBaseBiomesLayer.class) public class MixinSetBaseBiomesLayer { - @Shadow @Final @Mutable @@ -112,5 +113,4 @@ public class MixinSetBaseBiomesLayer { info.setReturnValue(InternalBiomeUtils.transformBiome(random, biome, climate)); } - } diff --git a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinVanillaLayeredBiomeSource.java b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinVanillaLayeredBiomeSource.java index dcefd44b6..1e65b8fd1 100644 --- a/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinVanillaLayeredBiomeSource.java +++ b/fabric-biomes-v1/src/main/java/net/fabricmc/fabric/mixin/biomes/MixinVanillaLayeredBiomeSource.java @@ -16,9 +16,9 @@ package net.fabricmc.fabric.mixin.biomes; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.VanillaLayeredBiomeSource; -import net.minecraft.world.gen.feature.StructureFeature; +import java.util.HashSet; +import java.util.Set; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -27,8 +27,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.HashSet; -import java.util.Set; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.VanillaLayeredBiomeSource; +import net.minecraft.world.gen.feature.StructureFeature; /** * Adds the biomes in world gen to the array for the vanilla layered biome source. @@ -36,14 +37,13 @@ import java.util.Set; */ @Mixin(VanillaLayeredBiomeSource.class) public class MixinVanillaLayeredBiomeSource { - @Shadow @Final @Mutable private static Set BIOMES; @Inject(method = "", at = @At("RETURN")) - private static void cinit(CallbackInfo info){ + private static void cinit(CallbackInfo info) { BIOMES = new HashSet<>(BIOMES); } @@ -51,5 +51,4 @@ public class MixinVanillaLayeredBiomeSource { private static void fabric_injectBiome(Biome biome) { BIOMES.add(biome); } - } diff --git a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java index 78bff1ea6..2a20f91eb 100644 --- a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java +++ b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java @@ -16,31 +16,32 @@ package net.fabricmc.fabric.api.blockrenderlayer.v1; -import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl; import net.minecraft.block.Block; import net.minecraft.client.render.RenderLayer; import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; +import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl; + /** - * Use to associate blocks or fluids with block render layer other than default. - * Replaces the {@code renderLayer} property previously on {@code Block}.

- * - * {@code BlockRenderLayer} controls how sprite pixels for fluids and blocks are blended - * with the scene. Consult the vanilla {@code BlockRenderLayer} implementation for examples.

- * - * The Fabric Renderer API can be used to control this at a per-quad level at the code - * via {@code BlendMode}.

- * - * Client-side only. + * Use to associate blocks or fluids with block render layer other than default. + * Replaces the {@code renderLayer} property previously on {@code Block}. + * + *

{@code BlockRenderLayer} controls how sprite pixels for fluids and blocks are blended + * with the scene. Consult the vanilla {@code BlockRenderLayer} implementation for examples. + * + *

The Fabric Renderer API can be used to control this at a per-quad level at the code + * via {@code BlendMode}. + * + *

Client-side only. */ public interface BlockRenderLayerMap { BlockRenderLayerMap INSTANCE = BlockRenderLayerMapImpl.INSTANCE; - + /** * Map (or re-map) a block state with a render layer. Re-mapping is not recommended but if done, last one in wins. * Must be called from client thread prior to world load/rendering. Best practice will be to call from mod's client initializer. - * + * * @param block Identifies block to be mapped. * @param renderLayer Render layer. Should be one of the layers used for terrain rendering. */ @@ -58,7 +59,7 @@ public interface BlockRenderLayerMap { /** * Map (or re-map) a fluid state with a render layer. Re-mapping is not recommended but if done, last one in wins. * Must be called from client thread prior to world load/rendering. Best practice will be to call from mod's client initializer. - * + * * @param fluid Identifies fluid to be mapped. * @param renderLayer Render layer. Should be one of the layers used for terrain rendering. */ diff --git a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java index da0d4bf16..65da1d043 100644 --- a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java +++ b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java @@ -20,16 +20,16 @@ import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; +import net.minecraft.block.Block; import net.minecraft.client.render.RenderLayer; +import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; -import net.minecraft.block.Block; -import net.minecraft.fluid.Fluid; public class BlockRenderLayerMapImpl implements BlockRenderLayerMap { - private BlockRenderLayerMapImpl() {} - + private BlockRenderLayerMapImpl() { } + @Override public void putBlock(Block block, RenderLayer renderLayer) { if (block == null) throw new IllegalArgumentException("Request to map null block to BlockRenderLayer"); @@ -53,7 +53,7 @@ public class BlockRenderLayerMapImpl implements BlockRenderLayerMap { fluidHandler.accept(fluid, renderLayer); } - + public static final BlockRenderLayerMap INSTANCE = new BlockRenderLayerMapImpl(); private static Map blockRenderLayerMap = new HashMap<>(); diff --git a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java index dc751cab9..f3efa70f5 100644 --- a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java +++ b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java @@ -18,25 +18,26 @@ package net.fabricmc.fabric.mixin.blockrenderlayer; import java.util.Map; -import net.minecraft.class_4696; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.item.Item; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl; +import net.minecraft.class_4696; import net.minecraft.block.Block; +import net.minecraft.client.render.RenderLayer; import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; + +import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl; @Mixin(class_4696.class) public class MixinBlockRenderLayer { @Shadow private static Map field_21469; @Shadow private static Map field_21470; @Shadow private static Map field_21471; - + @Inject(method = "*", at = @At("RETURN")) private static void onInitialize(CallbackInfo info) { BlockRenderLayerMapImpl.initialize(field_21469::put, field_21470::put, field_21471::put); diff --git a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/api/registry/CommandRegistry.java b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/api/registry/CommandRegistry.java index 31931f357..73d78ca22 100644 --- a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/api/registry/CommandRegistry.java +++ b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/api/registry/CommandRegistry.java @@ -16,11 +16,13 @@ package net.fabricmc.fabric.api.registry; +import java.util.function.Consumer; + import com.mojang.brigadier.CommandDispatcher; -import net.fabricmc.fabric.impl.registry.CommandRegistryImpl; + import net.minecraft.server.command.ServerCommandSource; -import java.util.function.Consumer; +import net.fabricmc.fabric.impl.registry.CommandRegistryImpl; /** * Registry for server-side command providers. diff --git a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/impl/registry/CommandRegistryImpl.java b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/impl/registry/CommandRegistryImpl.java index 708a930b5..5c4ea5254 100644 --- a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/impl/registry/CommandRegistryImpl.java +++ b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/impl/registry/CommandRegistryImpl.java @@ -16,14 +16,15 @@ package net.fabricmc.fabric.impl.registry; -import com.mojang.brigadier.CommandDispatcher; -import net.minecraft.server.command.ServerCommandSource; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.function.Consumer; +import com.mojang.brigadier.CommandDispatcher; + +import net.minecraft.server.command.ServerCommandSource; + public class CommandRegistryImpl { public static final CommandRegistryImpl INSTANCE = new CommandRegistryImpl(); diff --git a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinCommandManagerIntegrated.java b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinCommandManagerIntegrated.java index 1aaab1767..a406a3ac1 100644 --- a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinCommandManagerIntegrated.java +++ b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinCommandManagerIntegrated.java @@ -17,15 +17,17 @@ package net.fabricmc.fabric.mixin.registrycommands; import com.mojang.brigadier.CommandDispatcher; -import net.fabricmc.fabric.impl.registry.CommandRegistryImpl; -import net.minecraft.server.command.CommandManager; -import net.minecraft.server.command.ServerCommandSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; + +import net.fabricmc.fabric.impl.registry.CommandRegistryImpl; + @Mixin(CommandManager.class) public class MixinCommandManagerIntegrated { @Shadow diff --git a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinMinecraftDedicatedServer.java b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinMinecraftDedicatedServer.java index 62c706624..e173a770d 100644 --- a/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinMinecraftDedicatedServer.java +++ b/fabric-commands-v0/src/main/java/net/fabricmc/fabric/mixin/registrycommands/MixinMinecraftDedicatedServer.java @@ -16,27 +16,28 @@ package net.fabricmc.fabric.mixin.registrycommands; +import java.io.File; +import java.net.Proxy; + import com.mojang.authlib.GameProfileRepository; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import com.mojang.datafixers.DataFixer; -import net.fabricmc.fabric.impl.registry.CommandRegistryImpl; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldGenerationProgressListenerFactory; -import net.minecraft.server.command.CommandManager; -import net.minecraft.server.dedicated.MinecraftDedicatedServer; -import net.minecraft.util.UserCache; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.io.File; -import java.net.Proxy; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListenerFactory; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.dedicated.MinecraftDedicatedServer; +import net.minecraft.util.UserCache; + +import net.fabricmc.fabric.impl.registry.CommandRegistryImpl; @Mixin(MinecraftDedicatedServer.class) public abstract class MixinMinecraftDedicatedServer extends MinecraftServer { - public MixinMinecraftDedicatedServer(File file_1, Proxy proxy_1, DataFixer dataFixer_1, CommandManager serverCommandManager_1, YggdrasilAuthenticationService yggdrasilAuthenticationService_1, MinecraftSessionService minecraftSessionService_1, GameProfileRepository gameProfileRepository_1, UserCache userCache_1, WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory_1, String string_1) { super(file_1, proxy_1, dataFixer_1, serverCommandManager_1, yggdrasilAuthenticationService_1, minecraftSessionService_1, gameProfileRepository_1, userCache_1, worldGenerationProgressListenerFactory_1, string_1); } diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ContainerScreenFactory.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ContainerScreenFactory.java index 3f5daab78..ecb13670d 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ContainerScreenFactory.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ContainerScreenFactory.java @@ -21,7 +21,5 @@ import net.minecraft.container.Container; @FunctionalInterface public interface ContainerScreenFactory { - AbstractContainerScreen create(C container); - } diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ScreenProviderRegistry.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ScreenProviderRegistry.java index 14799a37e..273ae87ca 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ScreenProviderRegistry.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/client/screen/ScreenProviderRegistry.java @@ -16,15 +16,15 @@ package net.fabricmc.fabric.api.client.screen; -import net.fabricmc.fabric.api.container.ContainerFactory; -import net.fabricmc.fabric.api.container.ContainerProviderRegistry; -import net.fabricmc.fabric.impl.client.gui.ScreenProviderRegistryImpl; import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; import net.minecraft.container.Container; import net.minecraft.util.Identifier; -public interface ScreenProviderRegistry { +import net.fabricmc.fabric.api.container.ContainerFactory; +import net.fabricmc.fabric.api.container.ContainerProviderRegistry; +import net.fabricmc.fabric.impl.client.gui.ScreenProviderRegistryImpl; +public interface ScreenProviderRegistry { ScreenProviderRegistry INSTANCE = ScreenProviderRegistryImpl.INSTANCE; /** @@ -43,5 +43,4 @@ public interface ScreenProviderRegistry { * @param factory the gui factory, this should return a new {@link AbstractContainerScreen} */ void registerFactory(Identifier identifier, ContainerFactory factory); - } diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerFactory.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerFactory.java index df1a059d7..51f968145 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerFactory.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerFactory.java @@ -22,7 +22,6 @@ import net.minecraft.util.PacketByteBuf; @FunctionalInterface public interface ContainerFactory { - /** * Creates the new object. * @@ -33,5 +32,4 @@ public interface ContainerFactory { * @return the new gui or container */ T create(int syncId, Identifier identifier, PlayerEntity player, PacketByteBuf buf); - } diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerProviderRegistry.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerProviderRegistry.java index 32e29b675..122cdf00c 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerProviderRegistry.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/api/container/ContainerProviderRegistry.java @@ -16,18 +16,18 @@ package net.fabricmc.fabric.api.container; -import net.fabricmc.fabric.api.client.screen.ScreenProviderRegistry; -import net.fabricmc.fabric.impl.container.ContainerProviderImpl; +import java.util.function.Consumer; + import net.minecraft.container.Container; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; -import java.util.function.Consumer; +import net.fabricmc.fabric.api.client.screen.ScreenProviderRegistry; +import net.fabricmc.fabric.impl.container.ContainerProviderImpl; public interface ContainerProviderRegistry { - ContainerProviderRegistry INSTANCE = ContainerProviderImpl.INSTANCE; /** diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/client/gui/ScreenProviderRegistryImpl.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/client/gui/ScreenProviderRegistryImpl.java index bf18e7ba2..5d6f731d1 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/client/gui/ScreenProviderRegistryImpl.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/client/gui/ScreenProviderRegistryImpl.java @@ -16,26 +16,27 @@ package net.fabricmc.fabric.impl.client.gui; +import java.util.HashMap; +import java.util.Map; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; +import net.minecraft.container.Container; +import net.minecraft.util.Identifier; + import net.fabricmc.fabric.api.client.screen.ContainerScreenFactory; import net.fabricmc.fabric.api.client.screen.ScreenProviderRegistry; import net.fabricmc.fabric.api.container.ContainerFactory; import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.impl.container.ContainerProviderImpl; import net.fabricmc.fabric.impl.network.PacketTypes; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; -import net.minecraft.container.Container; -import net.minecraft.util.Identifier; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.util.HashMap; -import java.util.Map; public class ScreenProviderRegistryImpl implements ScreenProviderRegistry { - /** - * Use the instance provided by ScreenProviderRegistry + * Use the instance provided by ScreenProviderRegistry. */ public static final ScreenProviderRegistry INSTANCE = new ScreenProviderRegistryImpl(); @@ -43,10 +44,12 @@ public class ScreenProviderRegistryImpl implements ScreenProviderRegistry { private static final Map> FACTORIES = new HashMap<>(); + @Override public void registerFactory(Identifier identifier, ContainerFactory factory) { if (FACTORIES.containsKey(identifier)) { throw new RuntimeException("A factory has already been registered as " + identifier + "!"); } + FACTORIES.put(identifier, factory); } @@ -54,10 +57,12 @@ public class ScreenProviderRegistryImpl implements ScreenProviderRegistry { public void registerFactory(Identifier identifier, ContainerScreenFactory containerScreenFactory) { registerFactory(identifier, (syncId, identifier1, player, buf) -> { C container = ContainerProviderImpl.INSTANCE.createContainer(syncId, identifier1, player, buf); + if (container == null) { LOGGER.error("Could not open container for {} - a null object was created!", identifier1.toString()); return null; } + return containerScreenFactory.create(container); }); } @@ -71,10 +76,12 @@ public class ScreenProviderRegistryImpl implements ScreenProviderRegistry { MinecraftClient.getInstance().execute(() -> { try { ContainerFactory factory = FACTORIES.get(identifier); + if (factory == null) { LOGGER.error("No GUI factory found for {}!", identifier.toString()); return; } + AbstractContainerScreen gui = factory.create(syncId, identifier, packetContext.getPlayer(), packetByteBuf); packetContext.getPlayer().container = gui.getContainer(); MinecraftClient.getInstance().openScreen(gui); diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ContainerProviderImpl.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ContainerProviderImpl.java index fd9678dcd..bee66c381 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ContainerProviderImpl.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ContainerProviderImpl.java @@ -16,28 +16,29 @@ package net.fabricmc.fabric.impl.container; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + import io.netty.buffer.Unpooled; -import net.fabricmc.fabric.api.container.ContainerFactory; -import net.fabricmc.fabric.api.container.ContainerProviderRegistry; -import net.fabricmc.fabric.impl.network.PacketTypes; -import net.fabricmc.fabric.mixin.container.ServerPlayerEntityAccessor; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.client.network.packet.CustomPayloadS2CPacket; import net.minecraft.container.Container; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; +import net.fabricmc.fabric.api.container.ContainerFactory; +import net.fabricmc.fabric.api.container.ContainerProviderRegistry; +import net.fabricmc.fabric.impl.network.PacketTypes; +import net.fabricmc.fabric.mixin.container.ServerPlayerEntityAccessor; public class ContainerProviderImpl implements ContainerProviderRegistry { - /** - * Use the instance provided by ContainerProviderRegistry + * Use the instance provided by ContainerProviderRegistry. */ public static final ContainerProviderImpl INSTANCE = new ContainerProviderImpl(); @@ -50,6 +51,7 @@ public class ContainerProviderImpl implements ContainerProviderRegistry { if (FACTORIES.containsKey(identifier)) { throw new RuntimeException("A factory has already been registered as " + identifier.toString()); } + FACTORIES.put(identifier, factory); } @@ -96,19 +98,23 @@ public class ContainerProviderImpl implements ContainerProviderRegistry { clonedBuf.readUnsignedByte(); Container container = createContainer(syncId, identifier, player, clonedBuf); + if (container == null) { return; } + player.container = container; player.container.addListener(player); } public C createContainer(int syncId, Identifier identifier, PlayerEntity player, PacketByteBuf buf) { ContainerFactory factory = FACTORIES.get(identifier); + if (factory == null) { LOGGER.error("No container factory found for {}!", identifier.toString()); return null; } + //noinspection unchecked return (C) factory.create(syncId, identifier, player, buf); } diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ServerPlayerEntitySyncHook.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ServerPlayerEntitySyncHook.java index 8a68c8501..9f0117590 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ServerPlayerEntitySyncHook.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/impl/container/ServerPlayerEntitySyncHook.java @@ -20,12 +20,10 @@ package net.fabricmc.fabric.impl.container; * This is a interface that is present on a ServerPlayerEntity, it allows access to the sync id. */ public interface ServerPlayerEntitySyncHook { - /** - * gets and sets the new player sync id, and returns the new value + * Gets and sets the new player sync id, and returns the new value. * * @return the new sync id of the player */ int fabric_incrementSyncId(); - } diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/MixinServerPlayerEntity.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/MixinServerPlayerEntity.java index 794a0be56..e967d86cd 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/MixinServerPlayerEntity.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/MixinServerPlayerEntity.java @@ -16,11 +16,13 @@ package net.fabricmc.fabric.mixin.container; -import net.fabricmc.fabric.impl.container.ServerPlayerEntitySyncHook; -import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import net.minecraft.server.network.ServerPlayerEntity; + +import net.fabricmc.fabric.impl.container.ServerPlayerEntitySyncHook; + @Mixin(ServerPlayerEntity.class) public abstract class MixinServerPlayerEntity implements ServerPlayerEntitySyncHook { @Shadow diff --git a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/ServerPlayerEntityAccessor.java b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/ServerPlayerEntityAccessor.java index 819b881b1..be73337ba 100644 --- a/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/ServerPlayerEntityAccessor.java +++ b/fabric-containers-v0/src/main/java/net/fabricmc/fabric/mixin/container/ServerPlayerEntityAccessor.java @@ -16,10 +16,11 @@ package net.fabricmc.fabric.mixin.container; -import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import net.minecraft.server.network.ServerPlayerEntity; + @Mixin(ServerPlayerEntity.class) public interface ServerPlayerEntityAccessor { @Accessor diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/CompostingChanceRegistry.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/CompostingChanceRegistry.java index 77bf3015b..9d8b5b499 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/CompostingChanceRegistry.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/CompostingChanceRegistry.java @@ -21,8 +21,8 @@ import net.fabricmc.fabric.impl.registry.CompostingChanceRegistryImpl; /** * Registry of items to 0.0-1.0 values, defining the chance of a given item - * increasing the Composter block's level + * increasing the Composter block's level. */ public interface CompostingChanceRegistry extends Item2ObjectMap { - final CompostingChanceRegistry INSTANCE = new CompostingChanceRegistryImpl(); + CompostingChanceRegistry INSTANCE = new CompostingChanceRegistryImpl(); } diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/FlammableBlockRegistry.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/FlammableBlockRegistry.java index 2db07d132..83eb76c2e 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/FlammableBlockRegistry.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/FlammableBlockRegistry.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.api.registry; -import net.fabricmc.fabric.api.util.Block2ObjectMap; -import net.fabricmc.fabric.impl.registry.FlammableBlockRegistryImpl; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.tag.Tag; +import net.fabricmc.fabric.api.util.Block2ObjectMap; +import net.fabricmc.fabric.impl.registry.FlammableBlockRegistryImpl; + public interface FlammableBlockRegistry extends Block2ObjectMap { static FlammableBlockRegistry getDefaultInstance() { return getInstance(Blocks.FIRE); @@ -39,7 +40,7 @@ public interface FlammableBlockRegistry extends Block2ObjectMap { - final FuelRegistry INSTANCE = FuelRegistryImpl.INSTANCE; + FuelRegistry INSTANCE = FuelRegistryImpl.INSTANCE; } diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/LootEntryTypeRegistry.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/LootEntryTypeRegistry.java index 162a75208..bd1291ad1 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/LootEntryTypeRegistry.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/LootEntryTypeRegistry.java @@ -16,16 +16,17 @@ package net.fabricmc.fabric.api.registry; +import net.minecraft.world.loot.entry.LootEntry; + import net.fabricmc.fabric.impl.registry.LootEntryTypeRegistryImpl; -import net.minecraft.world.loot.entry.LootEntry; /** * @deprecated Use {@link net.fabricmc.fabric.api.loot.v1.LootEntryTypeRegistry} */ @Deprecated public interface LootEntryTypeRegistry { @Deprecated - final LootEntryTypeRegistry INSTANCE = LootEntryTypeRegistryImpl.INSTANCE; + LootEntryTypeRegistry INSTANCE = LootEntryTypeRegistryImpl.INSTANCE; @Deprecated void register(LootEntry.Serializer serializer); diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/CompostingChanceRegistryImpl.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/CompostingChanceRegistryImpl.java index 363b4086a..bd893cc91 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/CompostingChanceRegistryImpl.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/CompostingChanceRegistryImpl.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.impl.registry; -import net.fabricmc.fabric.api.registry.CompostingChanceRegistry; import net.minecraft.block.ComposterBlock; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.tag.Tag; +import net.fabricmc.fabric.api.registry.CompostingChanceRegistry; + public class CompostingChanceRegistryImpl implements CompostingChanceRegistry { @Override public Float get(ItemConvertible item) { diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FireBlockHooks.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FireBlockHooks.java index ed781240f..e5e407f3b 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FireBlockHooks.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FireBlockHooks.java @@ -16,9 +16,10 @@ package net.fabricmc.fabric.impl.registry; -import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; import net.minecraft.block.BlockState; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; + public interface FireBlockHooks { FlammableBlockRegistry.Entry fabric_getVanillaEntry(BlockState block); } diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FlammableBlockRegistryImpl.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FlammableBlockRegistryImpl.java index 49dc0ad3a..64e7ce57f 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FlammableBlockRegistryImpl.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FlammableBlockRegistryImpl.java @@ -16,20 +16,21 @@ package net.fabricmc.fabric.impl.registry; -import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; -import net.fabricmc.fabric.api.resource.ResourceManagerHelper; -import net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys; -import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + import net.minecraft.block.Block; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceType; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys; +import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; public class FlammableBlockRegistryImpl implements FlammableBlockRegistry, SimpleSynchronousResourceReloadListener { private static final FlammableBlockRegistry.Entry REMOVED = new FlammableBlockRegistry.Entry(0, 0); @@ -59,13 +60,16 @@ public class FlammableBlockRegistryImpl implements FlammableBlockRegistry, Simpl private void reload() { computedEntries.clear(); + // tags take precedence before blocks for (Tag tag : registeredEntriesTag.keySet()) { FlammableBlockRegistry.Entry entry = registeredEntriesTag.get(tag); + for (Block block : tag.values()) { computedEntries.put(block, entry); } } + computedEntries.putAll(registeredEntriesBlock); /* computedBurnChances.clear(); @@ -82,6 +86,7 @@ public class FlammableBlockRegistryImpl implements FlammableBlockRegistry, Simpl @Override public Entry get(Block block) { Entry entry = computedEntries.get(block); + if (entry != null) { return entry; } else { diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FuelRegistryImpl.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FuelRegistryImpl.java index d46a0ba58..cfb132dde 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FuelRegistryImpl.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/FuelRegistryImpl.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.impl.registry; +import java.util.Map; + import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; -import net.fabricmc.fabric.api.registry.FuelRegistry; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.tag.Tag; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import java.util.Map; +import net.fabricmc.fabric.api.registry.FuelRegistry; // TODO: Clamp values to 32767 (+ add hook for mods which extend the limit to disable the check?) public class FuelRegistryImpl implements FuelRegistry { @@ -35,9 +37,7 @@ public class FuelRegistryImpl implements FuelRegistry { private final Object2IntMap itemCookTimes = new Object2IntLinkedOpenHashMap<>(); private final Object2IntMap> tagCookTimes = new Object2IntLinkedOpenHashMap<>(); - public FuelRegistryImpl() { - - } + public FuelRegistryImpl() { } @Override public Integer get(ItemConvertible item) { @@ -49,6 +49,7 @@ public class FuelRegistryImpl implements FuelRegistry { if (cookTime > 32767) { LOGGER.warn("Tried to register an overly high cookTime: " + cookTime + " > 32767! (" + item + ")"); } + itemCookTimes.put(item, cookTime.intValue()); } @@ -57,6 +58,7 @@ public class FuelRegistryImpl implements FuelRegistry { if (cookTime > 32767) { LOGGER.warn("Tried to register an overly high cookTime: " + cookTime + " > 32767! (" + tag.getId() + ")"); } + tagCookTimes.put(tag, cookTime.intValue()); } @@ -84,6 +86,7 @@ public class FuelRegistryImpl implements FuelRegistry { // tags take precedence before blocks for (Tag tag : tagCookTimes.keySet()) { int time = tagCookTimes.getInt(tag); + if (time <= 0) { for (Item i : tag.values()) { map.remove(i); @@ -97,6 +100,7 @@ public class FuelRegistryImpl implements FuelRegistry { for (ItemConvertible item : itemCookTimes.keySet()) { int time = itemCookTimes.getInt(item); + if (time <= 0) { map.remove(item.asItem()); } else { diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/LootEntryTypeRegistryImpl.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/LootEntryTypeRegistryImpl.java index 9182cf50e..25615923c 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/LootEntryTypeRegistryImpl.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/impl/registry/LootEntryTypeRegistryImpl.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.impl.registry; -import net.fabricmc.fabric.api.registry.LootEntryTypeRegistry; +import java.lang.reflect.Method; + import net.minecraft.world.loot.entry.LootEntries; import net.minecraft.world.loot.entry.LootEntry; -import java.lang.reflect.Method; +import net.fabricmc.fabric.api.registry.LootEntryTypeRegistry; @Deprecated public final class LootEntryTypeRegistryImpl implements LootEntryTypeRegistry { @@ -29,6 +30,7 @@ public final class LootEntryTypeRegistryImpl implements LootEntryTypeRegistry { static { Method target = null; + for (Method m : LootEntries.class.getDeclaredMethods()) { if (m.getParameterCount() == 1 && m.getParameterTypes()[0] == LootEntry.Serializer.class) { if (target != null) { @@ -47,8 +49,7 @@ public final class LootEntryTypeRegistryImpl implements LootEntryTypeRegistry { } } - private LootEntryTypeRegistryImpl() { - } + private LootEntryTypeRegistryImpl() { } @Override public void register(LootEntry.Serializer serializer) { diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinAbstractFurnaceBlockEntity.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinAbstractFurnaceBlockEntity.java index e1bec9ae0..97ca3df23 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinAbstractFurnaceBlockEntity.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinAbstractFurnaceBlockEntity.java @@ -16,15 +16,17 @@ package net.fabricmc.fabric.mixin.registryextras; -import net.fabricmc.fabric.impl.registry.FuelRegistryImpl; -import net.minecraft.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.item.Item; +import java.util.Map; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Map; +import net.minecraft.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.item.Item; + +import net.fabricmc.fabric.impl.registry.FuelRegistryImpl; @Mixin(AbstractFurnaceBlockEntity.class) public class MixinAbstractFurnaceBlockEntity { @@ -32,4 +34,4 @@ public class MixinAbstractFurnaceBlockEntity { private static void fuelTimeMapHook(CallbackInfoReturnable> info) { FuelRegistryImpl.INSTANCE.apply(info.getReturnValue()); } -} \ No newline at end of file +} diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinFireBlock.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinFireBlock.java index a78d9036d..bd39e0f7a 100644 --- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinFireBlock.java +++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/registryextras/MixinFireBlock.java @@ -16,13 +16,6 @@ package net.fabricmc.fabric.mixin.registryextras; -import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; -import net.fabricmc.fabric.impl.registry.FireBlockHooks; -import net.fabricmc.fabric.impl.registry.FlammableBlockRegistryImpl; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FireBlock; -import net.minecraft.state.property.Properties; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -30,6 +23,15 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FireBlock; +import net.minecraft.state.property.Properties; + +import net.fabricmc.fabric.api.registry.FlammableBlockRegistry; +import net.fabricmc.fabric.impl.registry.FireBlockHooks; +import net.fabricmc.fabric.impl.registry.FlammableBlockRegistryImpl; + @Mixin(FireBlock.class) public class MixinFireBlock implements FireBlockHooks { private FlammableBlockRegistryImpl fabric_registry; @@ -52,6 +54,7 @@ public class MixinFireBlock implements FireBlockHooks { @Inject(at = @At("HEAD"), method = "getBurnChance", cancellable = true) private void getFabricBurnChance(BlockState block, CallbackInfoReturnable info) { FlammableBlockRegistry.Entry entry = fabric_registry.getFabric(block.getBlock()); + if (entry != null) { // TODO: use a (BlockState -> int) with this as the default impl if (block.contains(Properties.WATERLOGGED) && block.get(Properties.WATERLOGGED)) { @@ -65,6 +68,7 @@ public class MixinFireBlock implements FireBlockHooks { @Inject(at = @At("HEAD"), method = "getSpreadChance", cancellable = true) private void getFabricSpreadChance(BlockState block, CallbackInfoReturnable info) { FlammableBlockRegistry.Entry entry = fabric_registry.getFabric(block.getBlock()); + if (entry != null) { // TODO: use a (BlockState -> int) with this as the default impl if (block.contains(Properties.WATERLOGGED) && block.get(Properties.WATERLOGGED)) { diff --git a/fabric-crash-report-info-v1/src/main/java/net/fabricmc/fabric/mixin/crash/MixinCrashReport.java b/fabric-crash-report-info-v1/src/main/java/net/fabricmc/fabric/mixin/crash/MixinCrashReport.java index a9a2183b2..9f5ba2f88 100644 --- a/fabric-crash-report-info-v1/src/main/java/net/fabricmc/fabric/mixin/crash/MixinCrashReport.java +++ b/fabric-crash-report-info-v1/src/main/java/net/fabricmc/fabric/mixin/crash/MixinCrashReport.java @@ -16,18 +16,20 @@ package net.fabricmc.fabric.mixin.crash; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; +import java.util.Map; +import java.util.TreeMap; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Map; -import java.util.TreeMap; +import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.crash.CrashReportSection; + +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; @Mixin(CrashReport.class) public abstract class MixinCrashReport { @@ -38,6 +40,7 @@ public abstract class MixinCrashReport { private void fillSystemDetails(CallbackInfo info) { getSystemDetailsSection().add("Fabric Mods", () -> { Map mods = new TreeMap<>(); + for (ModContainer container : FabricLoader.getInstance().getAllMods()) { mods.put(container.getMetadata().getId(), container.getMetadata().getName() + " " + container.getMetadata().getVersion().getFriendlyString()); } diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/EntityPlacer.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/EntityPlacer.java index 359248cc6..b5422706c 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/EntityPlacer.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/EntityPlacer.java @@ -20,7 +20,6 @@ import net.minecraft.block.pattern.BlockPattern; import net.minecraft.entity.Entity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.Direction; -import net.minecraft.world.dimension.DimensionType; /** * Responsible for placing an Entity once they have entered a dimension. @@ -35,7 +34,7 @@ public interface EntityPlacer { * Handles the placement of an entity going to a dimension. * Utilized by {@link FabricDimensions#teleport(Entity, DimensionType, EntityPlacer)} to specify placement logic when needed. * - *

This method may have side effects such as the creation of a portal in the target dimension, + *

This method may have side effects such as the creation of a portal in the target dimension, * or the creation of a chunk loading ticket. * * @param portalDir the direction the portal is facing, meaningless if no portal was used diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensionType.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensionType.java index 435cbeb43..3c43bfd6d 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensionType.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensionType.java @@ -16,6 +16,8 @@ package net.fabricmc.fabric.api.dimension.v1; +import java.util.function.BiFunction; + import com.google.common.base.Preconditions; import net.minecraft.entity.Entity; @@ -29,8 +31,6 @@ import net.minecraft.world.biome.VoronoiBiomeAccessType; import net.minecraft.world.dimension.Dimension; import net.minecraft.world.dimension.DimensionType; -import java.util.function.BiFunction; - /** * An extended version of {@link DimensionType} with automatic raw id management and default placement settings. * {@code FabricDimensionType} instances are constructed and registered through a {@link Builder}. @@ -42,7 +42,7 @@ import java.util.function.BiFunction; public final class FabricDimensionType extends DimensionType { private final EntityPlacer defaultPlacement; private int desiredRawId; - /** The fixed raw id for this dimension type, set through reflection */ + /** The fixed raw id for this dimension type, set through reflection. */ private int fixedRawId; /** @@ -77,7 +77,7 @@ public final class FabricDimensionType extends DimensionType { /** * Return the current raw id for this dimension type. * - *

The returned id is guaranteed to be unique and persistent in a save, + *

The returned id is guaranteed to be unique and persistent in a save, * as well as synchronized between a server and its connected clients. * It may change when connecting to a different server or opening a new save. * @@ -131,7 +131,7 @@ public final class FabricDimensionType extends DimensionType { * Set the default placer used when teleporting entities to dimensions of the built type. * The default placer must be set before building a dimension type. * - *

A dimension type's default placer must never return {@code null} when its + *

A dimension type's default placer must never return {@code null} when its * {@link EntityPlacer#placeEntity(Entity, ServerWorld, Direction, double, double) placeEntity} method * is called. * @@ -194,7 +194,7 @@ public final class FabricDimensionType extends DimensionType { * If this method is not called, the value defaults to the raw registry id * of the dimension type. * - *

A Fabric Dimension's desired raw id is used as its actual raw id + *

A Fabric Dimension's desired raw id is used as its actual raw id * when it does not conflict with any existing id, and the world * save does not map the dimension to a different raw id. * @@ -212,7 +212,7 @@ public final class FabricDimensionType extends DimensionType { /** * Build and register a {@code FabricDimensionType}. * - *

The {@code dimensionId} is used as a registry ID, and as + *

The {@code dimensionId} is used as a registry ID, and as * a unique name both for the dimension suffix and the save directory. * * @param dimensionId the id used to name and register the dimension @@ -225,7 +225,7 @@ public final class FabricDimensionType extends DimensionType { Preconditions.checkArgument(Registry.DIMENSION.get(dimensionId) == null); Preconditions.checkState(this.defaultPlacer != null, "No defaultPlacer has been specified!"); Preconditions.checkState(this.factory != null, "No dimension factory has been specified!"); - + String suffix = dimensionId.getNamespace() + "_" + dimensionId.getPath(); String saveDir = "DIM_" + dimensionId.getNamespace() + "_" + dimensionId.getPath(); FabricDimensionType built = new FabricDimensionType(suffix, saveDir, this); diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensions.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensions.java index d948e0ae1..379b81406 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensions.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/api/dimension/v1/FabricDimensions.java @@ -17,10 +17,12 @@ package net.fabricmc.fabric.api.dimension.v1; import com.google.common.base.Preconditions; -import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; + import net.minecraft.entity.Entity; import net.minecraft.world.dimension.DimensionType; +import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; + /** * This class consists exclusively of static methods that operate on world dimensions. */ @@ -32,10 +34,10 @@ public final class FabricDimensions { /** * Teleports an entity to a different dimension, using custom placement logic. * - *

This method behaves as if: + *

This method behaves as if: *

{@code teleported.changeDimension(destination)}
* - *

If {@code destination} is a {@link FabricDimensionType}, the placement logic used + *

If {@code destination} is a {@link FabricDimensionType}, the placement logic used * is {@link FabricDimensionType#getDefaultPlacement()}. If {@code destination} is * the nether or the overworld, the default logic is the vanilla path. * For any other dimension, the default placement behaviour is undefined. @@ -43,7 +45,7 @@ public final class FabricDimensions { * {@code lastPortalDirectionVector}, and {@code lastPortalDirection} fields should be updated * before calling this method. * - *

After calling this method, {@code teleported} may be invalidated. Callers should use + *

After calling this method, {@code teleported} may be invalidated. Callers should use * the returned entity for any further manipulation. * * @param teleported the entity to teleport @@ -58,12 +60,12 @@ public final class FabricDimensions { /** * Teleports an entity to a different dimension, using custom placement logic. * - *

If {@code customPlacement} is {@code null}, this method behaves as if: + *

If {@code customPlacement} is {@code null}, this method behaves as if: *

{@code teleported.changeDimension(destination)}
* The {@code customPlacement} may itself return {@code null}, in which case * the default placement logic for that dimension will be run. * - *

If {@code destination} is a {@link FabricDimensionType}, the default placement logic + *

If {@code destination} is a {@link FabricDimensionType}, the default placement logic * is {@link FabricDimensionType#getDefaultPlacement()}. If {@code destination} is the nether * or the overworld, the default logic is the vanilla path. * For any other dimension, the default placement behaviour is undefined. @@ -71,7 +73,7 @@ public final class FabricDimensions { * {@code lastPortalDirectionVector}, and {@code lastPortalDirection} fields should be updated * before calling this method. * - *

After calling this method, {@code teleported} may be invalidated. Callers should use + *

After calling this method, {@code teleported} may be invalidated. Callers should use * the returned entity for any further manipulation. * * @param teleported the entity to teleport diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsFixer.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsFixer.java index b4f525dbb..e4d5a224c 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsFixer.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsFixer.java @@ -16,12 +16,15 @@ package net.fabricmc.fabric.impl.dimension; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.fabricmc.fabric.api.dimension.v1.FabricDimensionType; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; -import net.fabricmc.fabric.impl.registry.RemapException; + import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Packet; import net.minecraft.util.Identifier; @@ -30,10 +33,9 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.level.LevelProperties; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import net.fabricmc.fabric.api.dimension.v1.FabricDimensionType; +import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; +import net.fabricmc.fabric.impl.registry.RemapException; /** * Handles fixing raw dimension ids between saves and servers, @@ -72,6 +74,7 @@ public class DimensionIdsFixer { setFixedRawId(fabricDimension, fabricDimension.getDesiredRawId()); } else { Identifier existing = fixedIds.put(dimensionType.getRawId(), id); + if (existing != null) { throw new RemapException("Two non-fabric dimensions have the same raw dim id (" + dimensionType.getRawId() + ") : " + existing + " and " + id); } @@ -89,6 +92,7 @@ public class DimensionIdsFixer { } DimensionType dim = DimensionType.byId(dimId); + if (dim instanceof FabricDimensionType) { setFixedRawId((FabricDimensionType) dim, savedRawId); } else { @@ -100,6 +104,7 @@ public class DimensionIdsFixer { // step 3: de-duplicate raw ids for dimensions which ids are not fixed yet int nextFreeId = 0; + for (FabricDimensionType fabricDimension : fabricDimensions) { int rawDimId = fabricDimension.getRawId(); Identifier dimId = Objects.requireNonNull(DimensionType.getId(fabricDimension)); diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsHolder.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsHolder.java index dce5ed674..a115202d3 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsHolder.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/DimensionIdsHolder.java @@ -19,7 +19,7 @@ package net.fabricmc.fabric.impl.dimension; import net.minecraft.nbt.CompoundTag; /** - * An object holding a raw id -> full id map for fabric dimensions + * An object holding a raw id -> full id map for fabric dimensions. */ public interface DimensionIdsHolder { CompoundTag fabric_getDimensionIds(); diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionClientInit.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionClientInit.java index 8593513b6..a2f229a94 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionClientInit.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionClientInit.java @@ -16,18 +16,20 @@ package net.fabricmc.fabric.impl.dimension; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; -import net.fabricmc.fabric.api.network.PacketContext; -import net.fabricmc.fabric.impl.registry.RemapException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.nbt.CompoundTag; import net.minecraft.text.LiteralText; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; + +import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.impl.registry.RemapException; /** - * Client entry point for fabric-dimensions + * Client entry point for fabric-dimensions. */ public final class FabricDimensionClientInit { private static final Logger LOGGER = LogManager.getLogger(); @@ -55,8 +57,7 @@ public final class FabricDimensionClientInit { LOGGER.error("Dimension id remapping failed!", e); MinecraftClient.getInstance().execute(() -> ((ClientPlayerEntity) ctx.getPlayer()).networkHandler.getConnection().disconnect( - new LiteralText("Dimension id remapping failed: " + e) + new LiteralText("Dimension id remapping failed: " + e) )); } - } diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionInternals.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionInternals.java index 1b9e32e44..359dc3375 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionInternals.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/impl/dimension/FabricDimensionInternals.java @@ -17,17 +17,19 @@ package net.fabricmc.fabric.impl.dimension; import com.google.common.base.Preconditions; -import net.fabricmc.fabric.api.dimension.v1.EntityPlacer; -import net.fabricmc.fabric.api.dimension.v1.FabricDimensionType; -import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; -import net.fabricmc.fabric.mixin.EntityHooks; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.block.pattern.BlockPattern; import net.minecraft.entity.Entity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.Direction; import net.minecraft.world.dimension.DimensionType; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; + +import net.fabricmc.fabric.api.dimension.v1.EntityPlacer; +import net.fabricmc.fabric.api.dimension.v1.FabricDimensionType; +import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; +import net.fabricmc.fabric.mixin.EntityHooks; public final class FabricDimensionInternals { private FabricDimensionInternals() { @@ -38,11 +40,11 @@ public final class FabricDimensionInternals { public static final Logger LOGGER = LogManager.getLogger(); /** - * The entity currently being transported to another dimension + * The entity currently being transported to another dimension. */ private static final ThreadLocal PORTAL_ENTITY = new ThreadLocal<>(); /** - * The custom placement logic passed from {@link FabricDimensions#teleport(Entity, DimensionType, EntityPlacer)} + * The custom placement logic passed from {@link FabricDimensions#teleport(Entity, DimensionType, EntityPlacer)}. */ private static EntityPlacer customPlacement; @@ -65,9 +67,11 @@ public final class FabricDimensionInternals { // Set values used by `PortalForcer#changeDimension` to prevent a NPE crash. EntityHooks access = ((EntityHooks) entity); + if (entity.getLastPortalDirectionVector() == null) { access.setLastPortalDirectionVector(entity.getRotationVector()); } + if (entity.getLastPortalDirection() == null) { access.setLastPortalDirection(entity.getHorizontalFacing()); } @@ -86,6 +90,7 @@ public final class FabricDimensionInternals { // Custom placement logic, falls back to default dimension placement if no placement or target found EntityPlacer customPlacement = FabricDimensionInternals.customPlacement; + if (customPlacement != null) { BlockPattern.TeleportTarget customTarget = customPlacement.placeEntity(teleported, destination, portalDir, portalX, portalY); @@ -96,12 +101,14 @@ public final class FabricDimensionInternals { // Default placement logic, falls back to vanilla if not a fabric dimension DimensionType dimType = destination.getDimension().getType(); + if (dimType instanceof FabricDimensionType) { BlockPattern.TeleportTarget defaultTarget = ((FabricDimensionType) dimType).getDefaultPlacement().placeEntity(teleported, destination, portalDir, portalX, portalY); if (defaultTarget == null) { throw new IllegalStateException("Mod dimension " + DimensionType.getId(dimType) + " returned an invalid teleport target"); } + return defaultTarget; } @@ -121,5 +128,4 @@ public final class FabricDimensionInternals { customPlacement = null; } } - } diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/EntityHooks.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/EntityHooks.java index 5d5473aac..68a012ceb 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/EntityHooks.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/EntityHooks.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.mixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + import net.minecraft.entity.Entity; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(Entity.class) public interface EntityHooks { @@ -29,5 +30,4 @@ public interface EntityHooks { @Accessor void setLastPortalDirection(Direction dir); - } diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinEntity.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinEntity.java index 4474f1d1e..a2a4fdc85 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinEntity.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinEntity.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.mixin; -import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; -import net.minecraft.entity.Entity; -import net.minecraft.world.dimension.DimensionType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.entity.Entity; +import net.minecraft.world.dimension.DimensionType; + +import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; + @Mixin(Entity.class) public abstract class MixinEntity { - // Inject right before the direction vector is retrieved by the game @Inject(method = "changeDimension", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getLastPortalDirectionVector()Lnet/minecraft/util/math/Vec3d;")) private void onGetPortal(DimensionType dimension, CallbackInfoReturnable cir) { diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinPortalForcer.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinPortalForcer.java index b257509fd..1b63dbc53 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinPortalForcer.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/MixinPortalForcer.java @@ -16,7 +16,13 @@ package net.fabricmc.fabric.mixin; -import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.block.pattern.BlockPattern; import net.minecraft.entity.Entity; import net.minecraft.server.world.ServerWorld; @@ -24,12 +30,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.PortalForcer; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; @Mixin(PortalForcer.class) public abstract class MixinPortalForcer { diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinDimensionRawIndexFix.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinDimensionRawIndexFix.java index 1a8eda2c5..66b75e67e 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinDimensionRawIndexFix.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinDimensionRawIndexFix.java @@ -16,13 +16,14 @@ package net.fabricmc.fabric.mixin.idremap; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.dimension.DimensionType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.dimension.DimensionType; + // NOTE: This probably goes into dimension-fixes @Mixin(DimensionType.class) public abstract class MixinDimensionRawIndexFix { diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelProperties.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelProperties.java index fb2de6565..4828b30d5 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelProperties.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelProperties.java @@ -17,18 +17,20 @@ package net.fabricmc.fabric.mixin.idremap; import com.mojang.datafixers.DataFixer; -import net.fabricmc.fabric.impl.dimension.DimensionIdsFixer; -import net.fabricmc.fabric.impl.dimension.DimensionIdsHolder; -import net.fabricmc.fabric.impl.dimension.DimensionRemapException; -import net.fabricmc.fabric.impl.registry.RemapException; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.LevelProperties; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.LevelProperties; + +import net.fabricmc.fabric.impl.dimension.DimensionIdsFixer; +import net.fabricmc.fabric.impl.dimension.DimensionIdsHolder; +import net.fabricmc.fabric.impl.dimension.DimensionRemapException; +import net.fabricmc.fabric.impl.registry.RemapException; + @Mixin(LevelProperties.class) public abstract class MixinLevelProperties implements DimensionIdsHolder { @Unique @@ -42,6 +44,7 @@ public abstract class MixinLevelProperties implements DimensionIdsHolder { @Inject(method = "(Lnet/minecraft/nbt/CompoundTag;Lcom/mojang/datafixers/DataFixer;ILnet/minecraft/nbt/CompoundTag;)V", at = @At("RETURN")) private void readDimensionIds(CompoundTag data, DataFixer fixer, int version, CompoundTag player, CallbackInfo ci) { CompoundTag savedIds = data.getCompound("fabric_DimensionIds"); + try { this.fabricDimensionIds = DimensionIdsFixer.apply(savedIds); } catch (RemapException e) { diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelStorage.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelStorage.java index 008f6624b..ca52d8bef 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelStorage.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinLevelStorage.java @@ -16,12 +16,14 @@ package net.fabricmc.fabric.mixin.idremap; -import net.fabricmc.fabric.impl.dimension.DimensionRemapException; -import net.minecraft.world.level.storage.LevelStorage; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; +import net.minecraft.world.level.storage.LevelStorage; + +import net.fabricmc.fabric.impl.dimension.DimensionRemapException; + @Mixin(LevelStorage.class) public abstract class MixinLevelStorage { @ModifyArg(method = "readLevelProperties", at = @At(value = "INVOKE", target = "Lorg/apache/logging/log4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false), index = 2) diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinPlayerManager.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinPlayerManager.java index 5d40b6a02..311b2bdd5 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinPlayerManager.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinPlayerManager.java @@ -16,20 +16,22 @@ package net.fabricmc.fabric.mixin.idremap; -import net.fabricmc.fabric.impl.dimension.DimensionIdsFixer; -import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; -import net.minecraft.network.ClientConnection; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.network.ClientConnection; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; + +import net.fabricmc.fabric.impl.dimension.DimensionIdsFixer; +import net.fabricmc.fabric.impl.dimension.FabricDimensionInternals; + @Mixin(PlayerManager.class) public abstract class MixinPlayerManager { /** - * Synchronizes raw dimension ids to connecting players + * Synchronizes raw dimension ids to connecting players. */ @Inject(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/packet/DifficultyS2CPacket;(Lnet/minecraft/world/Difficulty;Z)V")) private void onPlayerConnect(ClientConnection conn, ServerPlayerEntity player, CallbackInfo info) { diff --git a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinUnmodifiableLevelProperties.java b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinUnmodifiableLevelProperties.java index 3efc8f72f..5476e7c67 100644 --- a/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinUnmodifiableLevelProperties.java +++ b/fabric-dimensions-v1/src/main/java/net/fabricmc/fabric/mixin/idremap/MixinUnmodifiableLevelProperties.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.mixin.idremap; -import net.fabricmc.fabric.impl.dimension.DimensionIdsHolder; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.LevelProperties; -import net.minecraft.world.level.UnmodifiableLevelProperties; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.LevelProperties; +import net.minecraft.world.level.UnmodifiableLevelProperties; + +import net.fabricmc.fabric.impl.dimension.DimensionIdsHolder; + @Mixin(UnmodifiableLevelProperties.class) public abstract class MixinUnmodifiableLevelProperties implements DimensionIdsHolder { @Shadow @@ -31,7 +33,7 @@ public abstract class MixinUnmodifiableLevelProperties implements DimensionIdsHo private LevelProperties properties; /** - * Delegates to the main level properties + * Delegates to the main level properties. */ @Override public CompoundTag fabric_getDimensionIds() { diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockApplyCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockApplyCallback.java index cdfbdffb7..32707a09a 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockApplyCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockApplyCallback.java @@ -16,31 +16,33 @@ package net.fabricmc.fabric.api.event.client.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.hit.HitResult; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * This event is emitted during the block-picking process. It can be used to * modify the returned ItemStack, as well as nullify it - returning an empty * ItemStack will cause the event to leave, and no block to be picked. */ public interface ClientPickBlockApplyCallback { - public static final Event EVENT = EventFactory.createArrayBacked(ClientPickBlockApplyCallback.class, - (listeners) -> (player, result, _stack) -> { - ItemStack stack = _stack; + Event EVENT = EventFactory.createArrayBacked(ClientPickBlockApplyCallback.class, + (listeners) -> (player, result, _stack) -> { + ItemStack stack = _stack; - for (ClientPickBlockApplyCallback event : listeners) { - stack = event.pick(player, result, stack); - if (stack.isEmpty()) { - return ItemStack.EMPTY; + for (ClientPickBlockApplyCallback event : listeners) { + stack = event.pick(player, result, stack); + + if (stack.isEmpty()) { + return ItemStack.EMPTY; + } } - } - return stack; - } + return stack; + } ); ItemStack pick(PlayerEntity player, HitResult result, ItemStack stack); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockCallback.java index 6f26c2d15..4531c12f0 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockCallback.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.api.event.client.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.hit.HitResult; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * This event handler has been deprecated due to not hooking nicely * into the game. Please use the alternatives. @@ -32,7 +33,7 @@ import net.minecraft.util.hit.HitResult; @Deprecated public interface ClientPickBlockCallback { @Deprecated - public static final class Container { + final class Container { private ItemStack stack; public Container(ItemStack stack) { @@ -48,8 +49,7 @@ public interface ClientPickBlockCallback { } } - @Deprecated - public static final Event EVENT = EventFactory.createArrayBacked(ClientPickBlockCallback.class, + @Deprecated Event EVENT = EventFactory.createArrayBacked(ClientPickBlockCallback.class, (listeners) -> (player, result, container) -> { for (ClientPickBlockCallback event : listeners) { if (!event.pick(player, result, container)) { diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockGatherCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockGatherCallback.java index 4ffc6d080..c9b8f56e4 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockGatherCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/client/player/ClientPickBlockGatherCallback.java @@ -16,29 +16,31 @@ package net.fabricmc.fabric.api.event.client.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.hit.HitResult; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * This event is emitted at the beginning of the block picking process in * order to find any applicable ItemStack. The first non-empty ItemStack * will be returned, overriding vanilla behaviour. */ public interface ClientPickBlockGatherCallback { - public static final Event EVENT = EventFactory.createArrayBacked(ClientPickBlockGatherCallback.class, - (listeners) -> (player, result) -> { - for (ClientPickBlockGatherCallback event : listeners) { - ItemStack stack = event.pick(player, result); - if (stack != ItemStack.EMPTY && !stack.isEmpty()) { - return stack; - } - } + Event EVENT = EventFactory.createArrayBacked(ClientPickBlockGatherCallback.class, + (listeners) -> (player, result) -> { + for (ClientPickBlockGatherCallback event : listeners) { + ItemStack stack = event.pick(player, result); - return ItemStack.EMPTY; - } + if (stack != ItemStack.EMPTY && !stack.isEmpty()) { + return stack; + } + } + + return ItemStack.EMPTY; + } ); ItemStack pick(PlayerEntity player, HitResult result); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackBlockCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackBlockCallback.java index 1c5acefb7..f36b17528 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackBlockCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackBlockCallback.java @@ -16,8 +16,6 @@ package net.fabricmc.fabric.api.event.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; @@ -25,29 +23,33 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * Callback for left-clicking ("attacking") a block. * Is hooked in before the spectator check, so make sure to check for the player's game mode as well! - *

- * Upon return: - * - SUCCESS cancels further processing and, on the client, sends a packet to the server. - * - PASS falls back to further processing. - * - FAIL cancels further processing and does not send a packet to the server. - *

- * ATTACK_BLOCK does not let you control the packet sending process yet. + * + *

Upon return: + *

  • SUCCESS cancels further processing and, on the client, sends a packet to the server. + *
  • PASS falls back to further processing. + *
  • FAIL cancels further processing and does not send a packet to the server.
+ * + *

ATTACK_BLOCK does not let you control the packet sending process yet. */ public interface AttackBlockCallback { - public static final Event EVENT = EventFactory.createArrayBacked(AttackBlockCallback.class, - (listeners) -> (player, world, hand, pos, direction) -> { - for (AttackBlockCallback event : listeners) { - ActionResult result = event.interact(player, world, hand, pos, direction); - if (result != ActionResult.PASS) { - return result; - } - } + Event EVENT = EventFactory.createArrayBacked(AttackBlockCallback.class, + (listeners) -> (player, world, hand, pos, direction) -> { + for (AttackBlockCallback event : listeners) { + ActionResult result = event.interact(player, world, hand, pos, direction); - return ActionResult.PASS; - } + if (result != ActionResult.PASS) { + return result; + } + } + + return ActionResult.PASS; + } ); ActionResult interact(PlayerEntity player, World world, Hand hand, BlockPos pos, Direction direction); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackEntityCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackEntityCallback.java index 76e366aac..dfe348d1a 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackEntityCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/AttackEntityCallback.java @@ -16,8 +16,6 @@ package net.fabricmc.fabric.api.event.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ActionResult; @@ -25,27 +23,31 @@ import net.minecraft.util.Hand; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.world.World; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * Callback for left-clicking ("attacking") an entity. * Is hooked in before the spectator check, so make sure to check for the player's game mode as well! - *

- * Upon return: - * - SUCCESS cancels further processing and, on the client, sends a packet to the server. - * - PASS falls back to further processing. - * - FAIL cancels further processing and does not send a packet to the server. + * + *

Upon return: + *

  • SUCCESS cancels further processing and, on the client, sends a packet to the server. + *
  • PASS falls back to further processing. + *
  • FAIL cancels further processing and does not send a packet to the server.
*/ public interface AttackEntityCallback { - public static final Event EVENT = EventFactory.createArrayBacked(AttackEntityCallback.class, - (listeners) -> (player, world, hand, entity, hitResult) -> { - for (AttackEntityCallback event : listeners) { - ActionResult result = event.interact(player, world, hand, entity, hitResult); - if (result != ActionResult.PASS) { - return result; - } - } + Event EVENT = EventFactory.createArrayBacked(AttackEntityCallback.class, + (listeners) -> (player, world, hand, entity, hitResult) -> { + for (AttackEntityCallback event : listeners) { + ActionResult result = event.interact(player, world, hand, entity, hitResult); - return ActionResult.PASS; - } + if (result != ActionResult.PASS) { + return result; + } + } + + return ActionResult.PASS; + } ); ActionResult interact(PlayerEntity player, World world, Hand hand, Entity entity, /* Nullable */ EntityHitResult hitResult); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseBlockCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseBlockCallback.java index 5f4fd742d..03cd5fa9e 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseBlockCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseBlockCallback.java @@ -16,35 +16,37 @@ package net.fabricmc.fabric.api.event.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.world.World; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * Callback for right-clicking ("using") a block. * Is hooked in before the spectator check, so make sure to check for the player's game mode as well! - *

- * Upon return: - * - SUCCESS cancels further processing and, on the client, sends a packet to the server. - * - PASS falls back to further processing. - * - FAIL cancels further processing and does not send a packet to the server. + * + *

Upon return: + *

  • SUCCESS cancels further processing and, on the client, sends a packet to the server. + *
  • PASS falls back to further processing. + *
  • FAIL cancels further processing and does not send a packet to the server.
*/ public interface UseBlockCallback { - public static final Event EVENT = EventFactory.createArrayBacked(UseBlockCallback.class, - (listeners) -> (player, world, hand, hitResult) -> { - for (UseBlockCallback event : listeners) { - ActionResult result = event.interact(player, world, hand, hitResult); - if (result != ActionResult.PASS) { - return result; - } - } + Event EVENT = EventFactory.createArrayBacked(UseBlockCallback.class, + (listeners) -> (player, world, hand, hitResult) -> { + for (UseBlockCallback event : listeners) { + ActionResult result = event.interact(player, world, hand, hitResult); - return ActionResult.PASS; - } + if (result != ActionResult.PASS) { + return result; + } + } + + return ActionResult.PASS; + } ); ActionResult interact(PlayerEntity player, World world, Hand hand, BlockHitResult hitResult); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseEntityCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseEntityCallback.java index 94786ef1a..8ecc0a609 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseEntityCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseEntityCallback.java @@ -16,8 +16,6 @@ package net.fabricmc.fabric.api.event.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ActionResult; @@ -25,27 +23,31 @@ import net.minecraft.util.Hand; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.world.World; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * Callback for right-clicking ("using") an entity. * Is hooked in before the spectator check, so make sure to check for the player's game mode as well! - *

- * Upon return: - * - SUCCESS cancels further processing and, on the client, sends a packet to the server. - * - PASS falls back to further processing. - * - FAIL cancels further processing and does not send a packet to the server. + * + *

Upon return: + *

  • SUCCESS cancels further processing and, on the client, sends a packet to the server. + *
  • PASS falls back to further processing. + *
  • FAIL cancels further processing and does not send a packet to the server.
*/ public interface UseEntityCallback { - public static final Event EVENT = EventFactory.createArrayBacked(UseEntityCallback.class, - (listeners) -> (player, world, hand, entity, hitResult) -> { - for (UseEntityCallback event : listeners) { - ActionResult result = event.interact(player, world, hand, entity, hitResult); - if (result != ActionResult.PASS) { - return result; - } - } + Event EVENT = EventFactory.createArrayBacked(UseEntityCallback.class, + (listeners) -> (player, world, hand, entity, hitResult) -> { + for (UseEntityCallback event : listeners) { + ActionResult result = event.interact(player, world, hand, entity, hitResult); - return ActionResult.PASS; - } + if (result != ActionResult.PASS) { + return result; + } + } + + return ActionResult.PASS; + } ); ActionResult interact(PlayerEntity player, World world, Hand hand, Entity entity, /* Nullable */ EntityHitResult hitResult); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseItemCallback.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseItemCallback.java index f11294695..f5d3da8dd 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseItemCallback.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/api/event/player/UseItemCallback.java @@ -16,8 +16,6 @@ package net.fabricmc.fabric.api.event.player; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; @@ -25,27 +23,31 @@ import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.world.World; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + /** * Callback for right-clicking ("using") an item. * Is hooked in before the spectator check, so make sure to check for the player's game mode as well! - *

- * Upon return: - * - SUCCESS cancels further processing and, on the client, sends a packet to the server. - * - PASS falls back to further processing. - * - FAIL cancels further processing and does not send a packet to the server. + * + *

Upon return: + *

  • SUCCESS cancels further processing and, on the client, sends a packet to the server. + *
  • PASS falls back to further processing. + *
  • FAIL cancels further processing and does not send a packet to the server.
*/ public interface UseItemCallback { - public static final Event EVENT = EventFactory.createArrayBacked(UseItemCallback.class, - listeners -> (player, world, hand) -> { - for (UseItemCallback event : listeners) { - TypedActionResult result = event.interact(player, world, hand); - if (result.getResult() != ActionResult.PASS) { - return result; - } - } + Event EVENT = EventFactory.createArrayBacked(UseItemCallback.class, + listeners -> (player, world, hand) -> { + for (UseItemCallback event : listeners) { + TypedActionResult result = event.interact(player, world, hand); - return TypedActionResult.pass(ItemStack.EMPTY); - } + if (result.getResult() != ActionResult.PASS) { + return result; + } + } + + return TypedActionResult.pass(ItemStack.EMPTY); + } ); TypedActionResult interact(PlayerEntity player, World world, Hand hand); diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouter.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouter.java index afc9fcfef..a3af63fcf 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouter.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouter.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.impl.event; +import net.minecraft.block.BlockState; +import net.minecraft.util.ActionResult; + import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.block.BlockAttackInteractionAware; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; -import net.minecraft.block.BlockState; -import net.minecraft.util.ActionResult; public class InteractionEventsRouter implements ModInitializer { @Override public void onInitialize() { AttackBlockCallback.EVENT.register((player, world, hand, pos, direction) -> { BlockState state = world.getBlockState(pos); + if (state instanceof BlockAttackInteractionAware) { if (((BlockAttackInteractionAware) state).onAttackInteraction(state, world, pos, player, hand, direction)) { return ActionResult.FAIL; diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouterClient.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouterClient.java index c85a9e0ef..3dbe1109a 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouterClient.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/impl/event/InteractionEventsRouterClient.java @@ -16,10 +16,6 @@ package net.fabricmc.fabric.impl.event; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.block.BlockPickInteractionAware; -import net.fabricmc.fabric.api.entity.EntityPickInteractionAware; -import net.fabricmc.fabric.api.event.client.player.ClientPickBlockGatherCallback; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; @@ -28,6 +24,11 @@ import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.block.BlockPickInteractionAware; +import net.fabricmc.fabric.api.entity.EntityPickInteractionAware; +import net.fabricmc.fabric.api.event.client.player.ClientPickBlockGatherCallback; + public class InteractionEventsRouterClient implements ClientModInitializer { @Override public void onInitializeClient() { diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinClientPlayerInteractionManager.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinClientPlayerInteractionManager.java index 5d6a10cf7..db18f80a4 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinClientPlayerInteractionManager.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinClientPlayerInteractionManager.java @@ -16,7 +16,13 @@ package net.fabricmc.fabric.mixin.eventsinteraction; -import net.fabricmc.fabric.api.event.player.*; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; @@ -38,12 +44,12 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.fabricmc.fabric.api.event.player.AttackBlockCallback; +import net.fabricmc.fabric.api.event.player.AttackEntityCallback; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.fabricmc.fabric.api.event.player.UseEntityCallback; +import net.fabricmc.fabric.api.event.player.UseItemCallback; @Mixin(ClientPlayerInteractionManager.class) public class MixinClientPlayerInteractionManager { @@ -57,6 +63,7 @@ public class MixinClientPlayerInteractionManager { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/GameMode;isCreative()Z", ordinal = 0), method = "attackBlock", cancellable = true) public void attackBlock(BlockPos pos, Direction direction, CallbackInfoReturnable info) { ActionResult result = AttackBlockCallback.EVENT.invoker().interact(client.player, client.world, Hand.MAIN_HAND, pos, direction); + if (result != ActionResult.PASS) { info.setReturnValue(result == ActionResult.SUCCESS); info.cancel(); @@ -70,6 +77,7 @@ public class MixinClientPlayerInteractionManager { } ActionResult result = AttackBlockCallback.EVENT.invoker().interact(client.player, client.world, Hand.MAIN_HAND, pos, direction); + if (result != ActionResult.PASS) { info.setReturnValue(result == ActionResult.SUCCESS); info.cancel(); @@ -79,10 +87,12 @@ public class MixinClientPlayerInteractionManager { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getStackInHand(Lnet/minecraft/util/Hand;)Lnet/minecraft/item/ItemStack;", ordinal = 0), method = "interactBlock", cancellable = true) public void interactBlock(ClientPlayerEntity player, ClientWorld world, Hand hand, BlockHitResult blockHitResult, CallbackInfoReturnable info) { ActionResult result = UseBlockCallback.EVENT.invoker().interact(player, world, hand, blockHitResult); + if (result != ActionResult.PASS) { if (result == ActionResult.SUCCESS) { this.networkHandler.sendPacket(new PlayerInteractBlockC2SPacket(hand, blockHitResult)); } + info.setReturnValue(result); info.cancel(); } @@ -91,10 +101,12 @@ public class MixinClientPlayerInteractionManager { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 0), method = "interactItem", cancellable = true) public void interactItem(PlayerEntity player, World world, Hand hand, CallbackInfoReturnable> info) { TypedActionResult result = UseItemCallback.EVENT.invoker().interact(player, world, hand); + if (result.getResult() != ActionResult.PASS) { if (result.getResult() == ActionResult.SUCCESS) { this.networkHandler.sendPacket(new PlayerInteractItemC2SPacket(hand)); } + info.setReturnValue(result); info.cancel(); return; @@ -104,10 +116,12 @@ public class MixinClientPlayerInteractionManager { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 0), method = "attackEntity", cancellable = true) public void attackEntity(PlayerEntity player, Entity entity, CallbackInfo info) { ActionResult result = AttackEntityCallback.EVENT.invoker().interact(player, player.getEntityWorld(), Hand.MAIN_HAND /* TODO */, entity, null); + if (result != ActionResult.PASS) { if (result == ActionResult.SUCCESS) { this.networkHandler.sendPacket(new PlayerInteractEntityC2SPacket(entity)); } + info.cancel(); } } @@ -115,11 +129,13 @@ public class MixinClientPlayerInteractionManager { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 0), method = "interactEntityAtLocation", cancellable = true) public void interactEntityAtLocation(PlayerEntity player, Entity entity, EntityHitResult hitResult, Hand hand, CallbackInfoReturnable info) { ActionResult result = UseEntityCallback.EVENT.invoker().interact(player, player.getEntityWorld(), hand, entity, hitResult); + if (result != ActionResult.PASS) { if (result == ActionResult.SUCCESS) { Vec3d hitVec = hitResult.getPos().subtract(entity.getX(), entity.getY(), entity.getZ()); this.networkHandler.sendPacket(new PlayerInteractEntityC2SPacket(entity, hand, hitVec)); } + info.setReturnValue(result); info.cancel(); return; diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinMinecraftClient.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinMinecraftClient.java index 130cb2b85..ce9203efd 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinMinecraftClient.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinMinecraftClient.java @@ -16,9 +16,13 @@ package net.fabricmc.fabric.mixin.eventsinteraction; -import net.fabricmc.fabric.api.event.client.player.ClientPickBlockApplyCallback; -import net.fabricmc.fabric.api.event.client.player.ClientPickBlockCallback; -import net.fabricmc.fabric.api.event.client.player.ClientPickBlockGatherCallback; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; @@ -27,12 +31,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.HitResult; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.fabricmc.fabric.api.event.client.player.ClientPickBlockApplyCallback; +import net.fabricmc.fabric.api.event.client.player.ClientPickBlockCallback; +import net.fabricmc.fabric.api.event.client.player.ClientPickBlockGatherCallback; @Mixin(MinecraftClient.class) public abstract class MixinMinecraftClient { @@ -52,6 +54,7 @@ public abstract class MixinMinecraftClient { // Do a "best effort" emulation of the old events. ItemStack stack = ClientPickBlockGatherCallback.EVENT.invoker().pick(client.player, client.hitResult); + // TODO: Remove in 0.3.0 if (stack.isEmpty()) { stack = fabric_emulateOldPick(); @@ -67,12 +70,14 @@ public abstract class MixinMinecraftClient { if (client.player.abilities.creativeMode && Screen.hasControlDown() && client.hitResult.getType() == HitResult.Type.BLOCK) { BlockEntity be = client.world.getBlockEntity(((BlockHitResult) client.hitResult).getBlockPos()); + if (be != null) { stack = addBlockEntityNbt(stack, be); } } stack = ClientPickBlockApplyCallback.EVENT.invoker().pick(client.player, client.hitResult, stack); + if (stack.isEmpty()) { return; } @@ -82,6 +87,7 @@ public abstract class MixinMinecraftClient { client.interactionManager.clickCreativeStack(client.player.getStackInHand(Hand.MAIN_HAND), 36 + playerInventory.selectedSlot); } else { int slot = playerInventory.getSlotWithStack(stack); + if (slot >= 0) { if (PlayerInventory.isValidHotbarIndex(slot)) { playerInventory.selectedSlot = slot; diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayNetworkHandler.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayNetworkHandler.java index b5a8ca99c..458e68b56 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayNetworkHandler.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayNetworkHandler.java @@ -16,7 +16,12 @@ package net.fabricmc.fabric.mixin.eventsinteraction; -import net.fabricmc.fabric.api.event.player.UseEntityCallback; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.entity.Entity; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; @@ -24,11 +29,8 @@ import net.minecraft.server.network.packet.PlayerInteractEntityC2SPacket; import net.minecraft.util.ActionResult; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.fabricmc.fabric.api.event.player.UseEntityCallback; @Mixin(ServerPlayNetworkHandler.class) public class MixinServerPlayNetworkHandler { @@ -39,10 +41,12 @@ public class MixinServerPlayNetworkHandler { public void onPlayerInteractEntity(PlayerInteractEntityC2SPacket packet, CallbackInfo info) { World world = player.getEntityWorld(); Entity entity = packet.getEntity(world); + if (entity != null) { EntityHitResult hitResult = new EntityHitResult(entity, packet.getHitPosition().add(entity.getX(), entity.getY(), entity.getZ())); ActionResult result = UseEntityCallback.EVENT.invoker().interact(player, world, packet.getHand(), entity, hitResult); + if (result != ActionResult.PASS) { info.cancel(); } diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerEntity.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerEntity.java index 3bc67a4f2..b38ce0803 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerEntity.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerEntity.java @@ -16,22 +16,25 @@ package net.fabricmc.fabric.mixin.eventsinteraction; -import net.fabricmc.fabric.api.event.player.AttackEntityCallback; -import net.minecraft.entity.Entity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.entity.Entity; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; + +import net.fabricmc.fabric.api.event.player.AttackEntityCallback; + @Mixin(ServerPlayerEntity.class) public class MixinServerPlayerEntity { @Inject(method = "attack", at = @At("HEAD"), cancellable = true) public void onPlayerInteractEntity(Entity target, CallbackInfo info) { ServerPlayerEntity player = (ServerPlayerEntity) (Object) this; ActionResult result = AttackEntityCallback.EVENT.invoker().interact(player, player.getEntityWorld(), Hand.MAIN_HAND, target, null); + if (result != ActionResult.PASS) { info.cancel(); } diff --git a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerInteractionManager.java b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerInteractionManager.java index 7806c4ae7..59f306f93 100644 --- a/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerInteractionManager.java +++ b/fabric-events-interaction-v0/src/main/java/net/fabricmc/fabric/mixin/eventsinteraction/MixinServerPlayerInteractionManager.java @@ -16,9 +16,13 @@ package net.fabricmc.fabric.mixin.eventsinteraction; -import net.fabricmc.fabric.api.event.player.AttackBlockCallback; -import net.fabricmc.fabric.api.event.player.UseBlockCallback; -import net.fabricmc.fabric.api.event.player.UseItemCallback; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.client.network.packet.BlockUpdateS2CPacket; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -33,12 +37,10 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.fabricmc.fabric.api.event.player.AttackBlockCallback; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.fabricmc.fabric.api.event.player.UseItemCallback; @Mixin(ServerPlayerInteractionManager.class) public class MixinServerPlayerInteractionManager { @@ -50,6 +52,7 @@ public class MixinServerPlayerInteractionManager { @Inject(at = @At("HEAD"), method = "processBlockBreakingAction", cancellable = true) public void startBlockBreak(BlockPos pos, PlayerActionC2SPacket.Action playerAction, Direction direction, int i, CallbackInfo info) { ActionResult result = AttackBlockCallback.EVENT.invoker().interact(player, world, Hand.MAIN_HAND, pos, direction); + if (result != ActionResult.PASS) { // The client might have broken the block on its side, so make sure to let it know. this.player.networkHandler.sendPacket(new BlockUpdateS2CPacket(world, pos)); @@ -60,6 +63,7 @@ public class MixinServerPlayerInteractionManager { @Inject(at = @At("HEAD"), method = "interactBlock", cancellable = true) public void interactBlock(PlayerEntity player, World world, ItemStack stack, Hand hand, BlockHitResult blockHitResult, CallbackInfoReturnable info) { ActionResult result = UseBlockCallback.EVENT.invoker().interact(player, world, hand, blockHitResult); + if (result != ActionResult.PASS) { info.setReturnValue(result); info.cancel(); @@ -70,6 +74,7 @@ public class MixinServerPlayerInteractionManager { @Inject(at = @At("HEAD"), method = "interactItem", cancellable = true) public void interactItem(PlayerEntity player, World world, ItemStack stack, Hand hand, CallbackInfoReturnable info) { TypedActionResult result = UseItemCallback.EVENT.invoker().interact(player, world, hand); + if (result.getResult() != ActionResult.PASS) { info.setReturnValue(result.getResult()); info.cancel(); diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientTickCallback.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientTickCallback.java index e2aacfa45..653ed4f33 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientTickCallback.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientTickCallback.java @@ -16,31 +16,34 @@ package net.fabricmc.fabric.api.event.client; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.client.MinecraftClient; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface ClientTickCallback { - public static final Event EVENT = EventFactory.createArrayBacked(ClientTickCallback.class, - (listeners) -> { - if (EventFactory.isProfilingEnabled()) { - return (client) -> { - client.getProfiler().push("fabricClientTick"); - for (ClientTickCallback event : listeners) { - client.getProfiler().push(EventFactory.getHandlerName(event)); - event.tick(client); + Event EVENT = EventFactory.createArrayBacked(ClientTickCallback.class, + (listeners) -> { + if (EventFactory.isProfilingEnabled()) { + return (client) -> { + client.getProfiler().push("fabricClientTick"); + + for (ClientTickCallback event : listeners) { + client.getProfiler().push(EventFactory.getHandlerName(event)); + event.tick(client); + client.getProfiler().pop(); + } + client.getProfiler().pop(); - } - client.getProfiler().pop(); - }; - } else { - return (client) -> { - for (ClientTickCallback event : listeners) { - event.tick(client); - } - }; + }; + } else { + return (client) -> { + for (ClientTickCallback event : listeners) { + event.tick(client); + } + }; + } } - } ); void tick(MinecraftClient client); diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ItemTooltipCallback.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ItemTooltipCallback.java index 62d664c06..e79543288 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ItemTooltipCallback.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/client/ItemTooltipCallback.java @@ -16,24 +16,23 @@ package net.fabricmc.fabric.api.event.client; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; +import java.util.List; + import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; -import java.util.List; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; public interface ItemTooltipCallback { - - /** Fired after the game has appended all base tooltip lines to the list */ + /** Fired after the game has appended all base tooltip lines to the list. */ Event EVENT = EventFactory.createArrayBacked(ItemTooltipCallback.class, (listeners) -> - (stack, tooltipContext, lines) -> { - for(ItemTooltipCallback callback : listeners){ - callback.getTooltip(stack, tooltipContext, lines); - } + (stack, tooltipContext, lines) -> { + for (ItemTooltipCallback callback : listeners) { + callback.getTooltip(stack, tooltipContext, lines); } - ); + }); /** * Called when an item stack's tooltip is rendered. Text added to {@code lines} will be @@ -41,5 +40,4 @@ public interface ItemTooltipCallback { * @param lines the list containing the lines of text displayed on the stack's tooltip */ void getTooltip(ItemStack stack, TooltipContext tooltipContext, List lines); - } diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStartCallback.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStartCallback.java index 836677d30..e314f9366 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStartCallback.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStartCallback.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.api.event.server; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.server.MinecraftServer; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface ServerStartCallback { - public static final Event EVENT = EventFactory.createArrayBacked(ServerStartCallback.class, - (listeners) -> (server) -> { - for (ServerStartCallback event : listeners) { - event.onStartServer(server); + Event EVENT = EventFactory.createArrayBacked(ServerStartCallback.class, + (listeners) -> (server) -> { + for (ServerStartCallback event : listeners) { + event.onStartServer(server); + } } - } ); void onStartServer(MinecraftServer server); diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStopCallback.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStopCallback.java index fea2c82b4..d44b522a2 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStopCallback.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerStopCallback.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.api.event.server; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.server.MinecraftServer; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface ServerStopCallback { - public static final Event EVENT = EventFactory.createArrayBacked(ServerStopCallback.class, - (listeners) -> (server) -> { - for (ServerStopCallback event : listeners) { - event.onStopServer(server); + Event EVENT = EventFactory.createArrayBacked(ServerStopCallback.class, + (listeners) -> (server) -> { + for (ServerStopCallback event : listeners) { + event.onStopServer(server); + } } - } ); void onStopServer(MinecraftServer server); diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerTickCallback.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerTickCallback.java index de712b879..56a2bc7fb 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerTickCallback.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/server/ServerTickCallback.java @@ -16,31 +16,34 @@ package net.fabricmc.fabric.api.event.server; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.server.MinecraftServer; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface ServerTickCallback { - public static final Event EVENT = EventFactory.createArrayBacked(ServerTickCallback.class, - (listeners) -> { - if (EventFactory.isProfilingEnabled()) { - return (server) -> { - server.getProfiler().push("fabricServerTick"); - for (ServerTickCallback event : listeners) { - server.getProfiler().push(EventFactory.getHandlerName(event)); - event.tick(server); + Event EVENT = EventFactory.createArrayBacked(ServerTickCallback.class, + (listeners) -> { + if (EventFactory.isProfilingEnabled()) { + return (server) -> { + server.getProfiler().push("fabricServerTick"); + + for (ServerTickCallback event : listeners) { + server.getProfiler().push(EventFactory.getHandlerName(event)); + event.tick(server); + server.getProfiler().pop(); + } + server.getProfiler().pop(); - } - server.getProfiler().pop(); - }; - } else { - return (server) -> { - for (ServerTickCallback event : listeners) { - event.tick(server); - } - }; + }; + } else { + return (server) -> { + for (ServerTickCallback event : listeners) { + event.tick(server); + } + }; + } } - } ); void tick(MinecraftServer server); diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/world/WorldTickCallback.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/world/WorldTickCallback.java index 7e2b21a7a..38cda986f 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/world/WorldTickCallback.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/api/event/world/WorldTickCallback.java @@ -16,31 +16,34 @@ package net.fabricmc.fabric.api.event.world; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.world.World; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface WorldTickCallback { - public static final Event EVENT = EventFactory.createArrayBacked(WorldTickCallback.class, - (listeners) -> { - if (EventFactory.isProfilingEnabled()) { - return (world) -> { - world.getProfiler().push("fabricWorldTick"); - for (WorldTickCallback event : listeners) { - world.getProfiler().push(EventFactory.getHandlerName(event)); - event.tick(world); + Event EVENT = EventFactory.createArrayBacked(WorldTickCallback.class, + (listeners) -> { + if (EventFactory.isProfilingEnabled()) { + return (world) -> { + world.getProfiler().push("fabricWorldTick"); + + for (WorldTickCallback event : listeners) { + world.getProfiler().push(EventFactory.getHandlerName(event)); + event.tick(world); + world.getProfiler().pop(); + } + world.getProfiler().pop(); - } - world.getProfiler().pop(); - }; - } else { - return (world) -> { - for (WorldTickCallback event : listeners) { - event.tick(world); - } - }; + }; + } else { + return (world) -> { + for (WorldTickCallback event : listeners) { + event.tick(world); + } + }; + } } - } ); void tick(World world); diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinItemStack.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinItemStack.java index a9f1898e8..c26b73236 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinItemStack.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinItemStack.java @@ -16,25 +16,24 @@ package net.fabricmc.fabric.mixin.eventslifecycle; -import net.fabricmc.fabric.api.event.client.ItemTooltipCallback; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; +import java.util.List; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.List; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +import net.fabricmc.fabric.api.event.client.ItemTooltipCallback; @Mixin(ItemStack.class) public class MixinItemStack { - @Inject(method = "getTooltip", at = @At("RETURN")) - private void getTooltip(PlayerEntity entity, TooltipContext tooltipContext, CallbackInfoReturnable> info){ - ItemTooltipCallback.EVENT.invoker().getTooltip((ItemStack) (Object)this, tooltipContext, info.getReturnValue()); + private void getTooltip(PlayerEntity entity, TooltipContext tooltipContext, CallbackInfoReturnable> info) { + ItemTooltipCallback.EVENT.invoker().getTooltip((ItemStack) (Object) this, tooltipContext, info.getReturnValue()); } - } diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftClient.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftClient.java index e89201a40..568c5a41b 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftClient.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftClient.java @@ -16,13 +16,15 @@ package net.fabricmc.fabric.mixin.eventslifecycle; -import net.fabricmc.fabric.api.event.client.ClientTickCallback; -import net.minecraft.client.MinecraftClient; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.MinecraftClient; + +import net.fabricmc.fabric.api.event.client.ClientTickCallback; + @Mixin(MinecraftClient.class) public class MixinMinecraftClient { @Inject(at = @At("RETURN"), method = "tick") diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftServer.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftServer.java index 84897d021..98a08c904 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftServer.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinMinecraftServer.java @@ -16,16 +16,18 @@ package net.fabricmc.fabric.mixin.eventslifecycle; -import net.fabricmc.fabric.api.event.server.ServerStartCallback; -import net.fabricmc.fabric.api.event.server.ServerStopCallback; -import net.fabricmc.fabric.api.event.server.ServerTickCallback; -import net.minecraft.server.MinecraftServer; +import java.util.function.BooleanSupplier; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.function.BooleanSupplier; +import net.minecraft.server.MinecraftServer; + +import net.fabricmc.fabric.api.event.server.ServerStartCallback; +import net.fabricmc.fabric.api.event.server.ServerStopCallback; +import net.fabricmc.fabric.api.event.server.ServerTickCallback; @Mixin(MinecraftServer.class) public class MixinMinecraftServer { diff --git a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinWorld.java b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinWorld.java index aa21af5cd..918548310 100644 --- a/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinWorld.java +++ b/fabric-events-lifecycle-v0/src/main/java/net/fabricmc/fabric/mixin/eventslifecycle/MixinWorld.java @@ -16,13 +16,15 @@ package net.fabricmc.fabric.mixin.eventslifecycle; -import net.fabricmc.fabric.api.event.world.WorldTickCallback; -import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.world.World; + +import net.fabricmc.fabric.api.event.world.WorldTickCallback; + @Mixin(World.class) public class MixinWorld { // TODO split into ClientWorld/ServerWorld ticks? mmm need more mappings diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/api/client/itemgroup/FabricItemGroupBuilder.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/api/client/itemgroup/FabricItemGroupBuilder.java index b331f4dc2..8eb50ef81 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/api/client/itemgroup/FabricItemGroupBuilder.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/api/client/itemgroup/FabricItemGroupBuilder.java @@ -16,18 +16,18 @@ package net.fabricmc.fabric.api.client.itemgroup; -import net.fabricmc.fabric.impl.itemgroup.ItemGroupExtensions; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.util.DefaultedList; import net.minecraft.util.Identifier; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; +import net.fabricmc.fabric.impl.itemgroup.ItemGroupExtensions; public final class FabricItemGroupBuilder { - private Identifier identifier; private Supplier stackSupplier = () -> ItemStack.EMPTY; private Consumer> stacksForDisplay; @@ -37,7 +37,7 @@ public final class FabricItemGroupBuilder { } /** - * Create a new Item Group Builder + * Create a new Item Group Builder. * * @param identifier the id will become the name of the ItemGroup and will be used for the translation key * @return a FabricItemGroupBuilder @@ -47,7 +47,7 @@ public final class FabricItemGroupBuilder { } /** - * This is used to add an icon to to the item group + * This is used to add an icon to to the item group. * * @param stackSupplier the supplier should return the item stack that you wish to show on the tab * @return a reference to the FabricItemGroupBuilder @@ -58,7 +58,7 @@ public final class FabricItemGroupBuilder { } /** - * This allows for a custom list of items to be displayed in a tab, this enabled tabs to be created with a custom set of items + * This allows for a custom list of items to be displayed in a tab, this enabled tabs to be created with a custom set of items. * * @param appender Add ItemStack's to this list to show in the ItemGroup * @return a reference to the FabricItemGroupBuilder @@ -70,7 +70,7 @@ public final class FabricItemGroupBuilder { } /** - * This allows for a custom list of items to be displayed in a tab, this enabled tabs to be created with a custom set of items + * This allows for a custom list of items to be displayed in a tab, this enabled tabs to be created with a custom set of items. * * @param stacksForDisplay Add ItemStack's to this list to show in the ItemGroup * @return a reference to the FabricItemGroupBuilder @@ -81,7 +81,7 @@ public final class FabricItemGroupBuilder { } /** - * This is a single method that makes creating an ItemGroup with an icon one call + * This is a single method that makes creating an ItemGroup with an icon one call. * * @param identifier the id will become the name of the ItemGroup and will be used for the translation key * @param stackSupplier the supplier should return the item stack that you wish to show on the tab @@ -92,7 +92,7 @@ public final class FabricItemGroupBuilder { } /** - * Create an instance of the ItemGroup + * Create an instance of the ItemGroup. * * @return An instance of the built ItemGroup */ @@ -110,9 +110,9 @@ public final class FabricItemGroupBuilder { stacksForDisplay.accept(stacks); return; } + super.appendStacks(stacks); } }; } - } diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/CreativeGuiExtensions.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/CreativeGuiExtensions.java index 25123ca6d..efd9c6e9f 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/CreativeGuiExtensions.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/CreativeGuiExtensions.java @@ -17,7 +17,6 @@ package net.fabricmc.fabric.impl.itemgroup; public interface CreativeGuiExtensions { - void fabric_nextPage(); void fabric_previousPage(); diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java index 51995b6bc..8dc345758 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java @@ -16,21 +16,20 @@ package net.fabricmc.fabric.impl.itemgroup; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.MinecraftClient; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; import net.minecraft.item.ItemGroup; import net.minecraft.util.Identifier; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; - public class FabricCreativeGuiComponents { - private static final Identifier BUTTON_TEX = new Identifier("fabric", "textures/gui/creative_buttons.png"); public static final Set COMMON_GROUPS = new HashSet<>(); @@ -41,7 +40,6 @@ public class FabricCreativeGuiComponents { } public static class ItemGroupButtonWidget extends ButtonWidget { - CreativeGuiExtensions extensions; CreativeInventoryScreen gui; Type type; @@ -73,7 +71,6 @@ public class FabricCreativeGuiComponents { } public enum Type { - NEXT(">", CreativeGuiExtensions::fabric_nextPage), PREVIOUS("<", CreativeGuiExtensions::fabric_previousPage); @@ -85,5 +82,4 @@ public class FabricCreativeGuiComponents { this.clickConsumer = clickConsumer; } } - } diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupExtensions.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupExtensions.java index 45f2366e2..d2cdf893b 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupExtensions.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupExtensions.java @@ -17,7 +17,5 @@ package net.fabricmc.fabric.impl.itemgroup; public interface ItemGroupExtensions { - void fabric_expandArray(); - } diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/MixinItemGroup.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/MixinItemGroup.java index d507b6d68..58666b919 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/MixinItemGroup.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/MixinItemGroup.java @@ -16,16 +16,17 @@ package net.fabricmc.fabric.mixin.itemgroup; -import net.fabricmc.fabric.impl.itemgroup.ItemGroupExtensions; -import net.minecraft.item.ItemGroup; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; +import net.minecraft.item.ItemGroup; + +import net.fabricmc.fabric.impl.itemgroup.ItemGroupExtensions; + @Mixin(ItemGroup.class) public abstract class MixinItemGroup implements ItemGroupExtensions { - @Shadow @Final @Mutable @@ -35,9 +36,9 @@ public abstract class MixinItemGroup implements ItemGroupExtensions { public void fabric_expandArray() { ItemGroup[] tempGroups = GROUPS; GROUPS = new ItemGroup[GROUPS.length + 1]; + for (int i = 0; i < tempGroups.length; i++) { GROUPS[i] = tempGroups[i]; } } - } diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java index 2fab22c1f..b40a61726 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java @@ -16,14 +16,6 @@ package net.fabricmc.fabric.mixin.itemgroup.client; -import net.fabricmc.fabric.impl.itemgroup.CreativeGuiExtensions; -import net.fabricmc.fabric.impl.itemgroup.FabricCreativeGuiComponents; -import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; -import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; -import net.minecraft.container.Container; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemGroup; -import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -31,9 +23,18 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; +import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; +import net.minecraft.container.Container; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemGroup; +import net.minecraft.text.Text; + +import net.fabricmc.fabric.impl.itemgroup.CreativeGuiExtensions; +import net.fabricmc.fabric.impl.itemgroup.FabricCreativeGuiComponents; + @Mixin(CreativeInventoryScreen.class) public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryScreen implements CreativeGuiExtensions { - public MixinCreativePlayerInventoryGui(Container container_1, PlayerInventory playerInventory_1, Text textComponent_1) { super(container_1, playerInventory_1, textComponent_1); } @@ -49,12 +50,12 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS private int fabric_getPageOffset(int page) { switch (page) { - case 0: - return 0; - case 1: - return 12; - default: - return 12 + ((12 - FabricCreativeGuiComponents.COMMON_GROUPS.size()) * (page - 1)); + case 0: + return 0; + case 1: + return 12; + default: + return 12 + ((12 - FabricCreativeGuiComponents.COMMON_GROUPS.size()) * (page - 1)); } } @@ -71,6 +72,7 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS if (fabric_getPageOffset(fabric_currentPage + 1) >= ItemGroup.GROUPS.length) { return; } + fabric_currentPage++; fabric_updateSelection(); } @@ -80,6 +82,7 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS if (fabric_currentPage == 0) { return; } + fabric_currentPage--; fabric_updateSelection(); } @@ -94,9 +97,11 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS if (type == FabricCreativeGuiComponents.Type.NEXT) { return !(fabric_getPageOffset(fabric_currentPage + 1) >= ItemGroup.GROUPS.length); } + if (type == FabricCreativeGuiComponents.Type.PREVIOUS) { return fabric_currentPage != 0; } + return false; } @@ -119,7 +124,6 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS addButton(new FabricCreativeGuiComponents.ItemGroupButtonWidget(xpos + 10, ypos, FabricCreativeGuiComponents.Type.NEXT, this)); addButton(new FabricCreativeGuiComponents.ItemGroupButtonWidget(xpos, ypos, FabricCreativeGuiComponents.Type.PREVIOUS, this)); - } @Inject(method = "setSelectedTab", at = @At("HEAD"), cancellable = true) @@ -154,8 +158,8 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS if (FabricCreativeGuiComponents.COMMON_GROUPS.contains(itemGroup)) { return true; } - return fabric_currentPage == fabric_getOffsetPage(itemGroup.getIndex()); + return fabric_currentPage == fabric_getOffsetPage(itemGroup.getIndex()); } @Override diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinItemGroup.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinItemGroup.java index 147164c50..c9ad3d179 100644 --- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinItemGroup.java +++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinItemGroup.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.mixin.itemgroup.client; -import net.fabricmc.fabric.impl.itemgroup.FabricCreativeGuiComponents; -import net.minecraft.item.ItemGroup; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.item.ItemGroup; + +import net.fabricmc.fabric.impl.itemgroup.FabricCreativeGuiComponents; + @Mixin(ItemGroup.class) public abstract class MixinItemGroup { @Shadow @@ -47,7 +49,6 @@ public abstract class MixinItemGroup { } else { info.setReturnValue((getIndex() - 12) % (12 - FabricCreativeGuiComponents.COMMON_GROUPS.size()) - 4); } - } } } diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java index 9c6d11940..6ac86ba83 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/FabricKeyBinding.java @@ -16,15 +16,16 @@ package net.fabricmc.fabric.api.client.keybinding; -import net.fabricmc.fabric.mixin.client.keybinding.KeyCodeAccessor; import net.minecraft.client.options.KeyBinding; import net.minecraft.client.util.InputUtil; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.mixin.client.keybinding.KeyCodeAccessor; + /** * Expanded version of {@link KeyBinding} for use by Fabric mods. - *

- * *ALL* instantiated FabricKeyBindings should be registered in + * + *

*ALL* instantiated FabricKeyBindings should be registered in * {@link KeyBindingRegistry#register(FabricKeyBinding)}! */ public class FabricKeyBinding extends KeyBinding { diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java index 213fc8ee3..f7bf5945c 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/api/client/keybinding/KeyBindingRegistry.java @@ -16,16 +16,17 @@ package net.fabricmc.fabric.api.client.keybinding; -import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; import net.minecraft.client.options.KeyBinding; +import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; + /** * Interface for registering key bindings. * * @see KeyBinding */ public interface KeyBindingRegistry { - static KeyBindingRegistry INSTANCE = KeyBindingRegistryImpl.INSTANCE; + KeyBindingRegistry INSTANCE = KeyBindingRegistryImpl.INSTANCE; /** * Add a new key binding category. diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java index 3f66538dc..eba0d8b83 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/impl/client/keybinding/KeyBindingRegistryImpl.java @@ -16,18 +16,20 @@ package net.fabricmc.fabric.impl.client.keybinding; -import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; -import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; -import net.minecraft.client.options.KeyBinding; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.client.options.KeyBinding; + +import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; +import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; + public class KeyBindingRegistryImpl implements KeyBindingRegistry { public static final KeyBindingRegistryImpl INSTANCE = new KeyBindingRegistryImpl(); private static final Logger LOGGER = LogManager.getLogger(); @@ -67,6 +69,7 @@ public class KeyBindingRegistryImpl implements KeyBindingRegistry { @Override public boolean addCategory(String categoryName) { Map map = getCategoryMap(); + if (map.containsKey(categoryName)) { return false; } @@ -98,6 +101,7 @@ public class KeyBindingRegistryImpl implements KeyBindingRegistry { public KeyBinding[] process(KeyBinding[] keysAll) { List newKeysAll = new ArrayList<>(); + for (KeyBinding binding : keysAll) { if (!(binding instanceof FabricKeyBinding)) { newKeysAll.add(binding); diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java index dd15460c2..6d3f487c1 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/KeyCodeAccessor.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.mixin.client.keybinding; -import net.minecraft.client.options.KeyBinding; -import net.minecraft.client.util.InputUtil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.util.InputUtil; + @Mixin(KeyBinding.class) public interface KeyCodeAccessor { @Accessor diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java index 5638d603e..9038bb7ed 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinGameOptions.java @@ -16,15 +16,17 @@ package net.fabricmc.fabric.mixin.client.keybinding; -import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; -import net.minecraft.client.options.GameOptions; -import net.minecraft.client.options.KeyBinding; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.options.GameOptions; +import net.minecraft.client.options.KeyBinding; + +import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; + @Mixin(GameOptions.class) public class MixinGameOptions { @Shadow @@ -34,4 +36,4 @@ public class MixinGameOptions { public void loadHook(CallbackInfo info) { keysAll = KeyBindingRegistryImpl.INSTANCE.process(keysAll); } -} \ No newline at end of file +} diff --git a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java index eacd37354..adc56a4f9 100644 --- a/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java +++ b/fabric-keybindings-v0/src/main/java/net/fabricmc/fabric/mixin/client/keybinding/MixinKeyBinding.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.mixin.client.keybinding; -import net.minecraft.client.options.KeyBinding; +import java.util.Map; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import java.util.Map; +import net.minecraft.client.options.KeyBinding; @Mixin(KeyBinding.class) public class MixinKeyBinding { diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPool.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPool.java index f551a1e53..21c5cc7e4 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPool.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPool.java @@ -16,14 +16,14 @@ package net.fabricmc.fabric.api.loot.v1; +import java.util.List; + import net.minecraft.world.loot.LootPool; import net.minecraft.world.loot.LootTableRange; import net.minecraft.world.loot.condition.LootCondition; import net.minecraft.world.loot.entry.LootEntry; import net.minecraft.world.loot.function.LootFunction; -import java.util.List; - /** * An interface implemented by all {@code net.minecraft.world.loot.LootPool} instances when * Fabric API is present. Contains accessors for various fields. @@ -32,6 +32,7 @@ public interface FabricLootPool { default LootPool asVanilla() { return (LootPool) this; } + List getEntries(); List getConditions(); List getFunctions(); diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPoolBuilder.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPoolBuilder.java index 156e59970..23145d86d 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPoolBuilder.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootPoolBuilder.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.api.loot.v1; -import net.fabricmc.fabric.mixin.loot.LootPoolBuilderHooks; import net.minecraft.world.loot.LootPool; import net.minecraft.world.loot.LootTableRange; import net.minecraft.world.loot.condition.LootCondition; import net.minecraft.world.loot.entry.LootEntry; import net.minecraft.world.loot.function.LootFunction; +import net.fabricmc.fabric.mixin.loot.LootPoolBuilderHooks; + public class FabricLootPoolBuilder extends LootPool.Builder { private final LootPoolBuilderHooks extended = (LootPoolBuilderHooks) this; - private FabricLootPoolBuilder() {} + private FabricLootPoolBuilder() { } private FabricLootPoolBuilder(LootPool pool) { copyFrom(pool, true); @@ -75,7 +76,7 @@ public class FabricLootPoolBuilder extends LootPool.Builder { * Copies the entries, conditions and functions of the {@code pool} to this * builder. * - * This is equal to {@code copyFrom(pool, false)}. + *

This is equal to {@code copyFrom(pool, false)}. */ public FabricLootPoolBuilder copyFrom(LootPool pool) { return copyFrom(pool, false); @@ -85,7 +86,7 @@ public class FabricLootPoolBuilder extends LootPool.Builder { * Copies the entries, conditions and functions of the {@code pool} to this * builder. * - * If {@code copyRolls} is true, the {@link FabricLootPool#getRollsRange rolls} of the pool are also copied. + *

If {@code copyRolls} is true, the {@link FabricLootPool#getRollsRange rolls} of the pool are also copied. */ public FabricLootPoolBuilder copyFrom(LootPool pool, boolean copyRolls) { FabricLootPool extendedPool = (FabricLootPool) pool; diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java index b65ad7bc7..184d7c9c5 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java @@ -16,13 +16,13 @@ package net.fabricmc.fabric.api.loot.v1; +import java.util.List; + import net.minecraft.world.loot.LootPool; import net.minecraft.world.loot.LootTable; import net.minecraft.world.loot.context.LootContextType; import net.minecraft.world.loot.function.LootFunction; -import java.util.List; - /** * An interface implemented by all {@code net.minecraft.world.loot.LootSupplier} instances when * Fabric API is present. Contains accessors for various fields. @@ -31,6 +31,7 @@ public interface FabricLootSupplier { default LootTable asVanilla() { return (LootTable) this; } + List getPools(); List getFunctions(); LootContextType getType(); diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java index 316a025c0..96677f396 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java @@ -16,18 +16,19 @@ package net.fabricmc.fabric.api.loot.v1; -import net.fabricmc.fabric.mixin.loot.LootSupplierBuilderHooks; +import java.util.Collection; + import net.minecraft.world.loot.LootPool; import net.minecraft.world.loot.LootTable; import net.minecraft.world.loot.context.LootContextType; import net.minecraft.world.loot.function.LootFunction; -import java.util.Collection; +import net.fabricmc.fabric.mixin.loot.LootSupplierBuilderHooks; public class FabricLootSupplierBuilder extends LootTable.Builder { private final LootSupplierBuilderHooks extended = (LootSupplierBuilderHooks) this; - protected FabricLootSupplierBuilder() {} + protected FabricLootSupplierBuilder() { } private FabricLootSupplierBuilder(LootTable supplier) { copyFrom(supplier, true); diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootEntryTypeRegistry.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootEntryTypeRegistry.java index fa7fbea1c..db3e788b5 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootEntryTypeRegistry.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootEntryTypeRegistry.java @@ -16,9 +16,10 @@ package net.fabricmc.fabric.api.loot.v1; -import net.fabricmc.fabric.impl.loot.LootEntryTypeRegistryImpl; import net.minecraft.world.loot.entry.LootEntry; +import net.fabricmc.fabric.impl.loot.LootEntryTypeRegistryImpl; + /** * Fabric's extensions to {@code net.minecraft.world.loot.entry.LootEntries} for registering * custom loot entry types. @@ -26,7 +27,7 @@ import net.minecraft.world.loot.entry.LootEntry; * @see #register */ public interface LootEntryTypeRegistry { - final LootEntryTypeRegistry INSTANCE = LootEntryTypeRegistryImpl.INSTANCE; + LootEntryTypeRegistry INSTANCE = LootEntryTypeRegistryImpl.INSTANCE; /** * Registers a loot entry type by its serializer. diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootJsonParser.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootJsonParser.java index 2048e9d2d..37119f35e 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootJsonParser.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/LootJsonParser.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.api.loot.v1; -import com.google.gson.Gson; -import net.minecraft.util.JsonHelper; -import net.minecraft.util.Lazy; -import net.minecraft.world.loot.*; import java.io.Reader; import java.lang.reflect.Field; import java.util.stream.Stream; +import com.google.gson.Gson; + +import net.minecraft.util.JsonHelper; +import net.minecraft.util.Lazy; +import net.minecraft.world.loot.LootManager; + public final class LootJsonParser { /* Reading this from LootManager to access all serializers from vanilla. */ private static final Lazy GSON = new Lazy<>(() -> { @@ -39,9 +41,7 @@ public final class LootJsonParser { } }); - private LootJsonParser() { - - } + private LootJsonParser() { } public static T read(Reader json, Class c) { return JsonHelper.deserialize(GSON.get(), json, c); diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java index 52b50ce75..9e7eb1ec3 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java @@ -16,14 +16,15 @@ package net.fabricmc.fabric.api.loot.v1.event; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.fabricmc.fabric.api.loot.v1.FabricLootSupplierBuilder; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; import net.minecraft.world.loot.LootManager; import net.minecraft.world.loot.LootTable; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.fabricmc.fabric.api.loot.v1.FabricLootSupplierBuilder; + /** * An event handler that is called when loot tables are loaded. * Use {@link #EVENT} to register instances. @@ -35,7 +36,7 @@ public interface LootTableLoadingCallback { void set(LootTable supplier); } - final Event EVENT = EventFactory.createArrayBacked( + Event EVENT = EventFactory.createArrayBacked( LootTableLoadingCallback.class, (listeners) -> (resourceManager, manager, id, supplier, setter) -> { for (LootTableLoadingCallback callback : listeners) { diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/impl/loot/LootEntryTypeRegistryImpl.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/impl/loot/LootEntryTypeRegistryImpl.java index 194c9a8a4..a20373e2a 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/impl/loot/LootEntryTypeRegistryImpl.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/impl/loot/LootEntryTypeRegistryImpl.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.impl.loot; +import java.lang.reflect.Method; + import net.minecraft.world.loot.entry.LootEntries; import net.minecraft.world.loot.entry.LootEntry; -import java.lang.reflect.Method; - public final class LootEntryTypeRegistryImpl implements net.fabricmc.fabric.api.loot.v1.LootEntryTypeRegistry { public static final LootEntryTypeRegistryImpl INSTANCE = new LootEntryTypeRegistryImpl(); private static final Method REGISTER_METHOD; static { Method target = null; + for (Method m : LootEntries.class.getDeclaredMethods()) { if (m.getParameterCount() == 1 && m.getParameterTypes()[0] == LootEntry.Serializer.class) { if (target != null) { @@ -45,8 +46,7 @@ public final class LootEntryTypeRegistryImpl implements net.fabricmc.fabric.api. } } - private LootEntryTypeRegistryImpl() { - } + private LootEntryTypeRegistryImpl() { } @Override public void register(LootEntry.Serializer serializer) { diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootPoolBuilderHooks.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootPoolBuilderHooks.java index 52868eb25..c0fe1a11a 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootPoolBuilderHooks.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootPoolBuilderHooks.java @@ -16,14 +16,15 @@ package net.fabricmc.fabric.mixin.loot; +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + import net.minecraft.world.loot.LootPool; import net.minecraft.world.loot.condition.LootCondition; import net.minecraft.world.loot.entry.LootEntry; import net.minecraft.world.loot.function.LootFunction; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; @Mixin(LootPool.Builder.class) public interface LootPoolBuilderHooks { diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java index 71d4a979a..fa1406721 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java @@ -16,13 +16,14 @@ package net.fabricmc.fabric.mixin.loot; -import net.minecraft.world.loot.LootPool; -import net.minecraft.world.loot.LootTable; -import net.minecraft.world.loot.function.LootFunction; +import java.util.List; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.List; +import net.minecraft.world.loot.LootPool; +import net.minecraft.world.loot.LootTable; +import net.minecraft.world.loot.function.LootFunction; @Mixin(LootTable.Builder.class) public interface LootSupplierBuilderHooks { diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java index a8517d72a..fa7689bdf 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java @@ -16,23 +16,25 @@ package net.fabricmc.fabric.mixin.loot; +import java.util.HashMap; +import java.util.Map; + import com.google.common.collect.ImmutableMap; import com.google.gson.JsonObject; -import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; -import net.fabricmc.fabric.api.loot.v1.FabricLootSupplierBuilder; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; -import net.minecraft.world.loot.LootManager; -import net.minecraft.world.loot.LootTable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.HashMap; -import java.util.Map; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.loot.LootManager; +import net.minecraft.world.loot.LootTable; + +import net.fabricmc.fabric.api.loot.v1.FabricLootSupplierBuilder; +import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; @Mixin(LootManager.class) public class MixinLootManager { @@ -47,7 +49,7 @@ public class MixinLootManager { //noinspection ConstantConditions LootTableLoadingCallback.EVENT.invoker().onLootTableLoading( - manager, (LootManager) (Object) this, id, builder, (s) -> newSuppliers.put(id, s) + manager, (LootManager) (Object) this, id, builder, (s) -> newSuppliers.put(id, s) ); newSuppliers.computeIfAbsent(id, (i) -> builder.create()); diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootPool.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootPool.java index f78e3fce1..5509a048f 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootPool.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootPool.java @@ -16,27 +16,35 @@ package net.fabricmc.fabric.mixin.loot; -import net.fabricmc.fabric.api.loot.v1.FabricLootPool; -import net.minecraft.world.loot.LootPool; -import net.minecraft.world.loot.LootTableRange; -import net.minecraft.world.loot.condition.LootCondition; -import net.minecraft.world.loot.entry.LootEntry; -import net.minecraft.world.loot.function.LootFunction; +import java.util.Arrays; +import java.util.List; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.Arrays; -import java.util.List; +import net.minecraft.world.loot.LootPool; +import net.minecraft.world.loot.LootTableRange; +import net.minecraft.world.loot.condition.LootCondition; +import net.minecraft.world.loot.entry.LootEntry; +import net.minecraft.world.loot.function.LootFunction; + +import net.fabricmc.fabric.api.loot.v1.FabricLootPool; @Mixin(LootPool.class) public abstract class MixinLootPool implements FabricLootPool { - @Shadow @Final private LootEntry[] entries; + @Shadow + @Final + private LootEntry[] entries; - @Shadow @Final private LootCondition[] conditions; + @Shadow + @Final + private LootCondition[] conditions; - @Shadow @Final private LootFunction[] functions; + @Shadow + @Final + private LootFunction[] functions; @Override public List getEntries() { diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java index d38e9c8c4..92a09c97d 100644 --- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java +++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java @@ -16,23 +16,29 @@ package net.fabricmc.fabric.mixin.loot; -import net.fabricmc.fabric.api.loot.v1.FabricLootSupplier; -import net.minecraft.world.loot.LootPool; -import net.minecraft.world.loot.LootTable; -import net.minecraft.world.loot.context.LootContextType; -import net.minecraft.world.loot.function.LootFunction; +import java.util.Arrays; +import java.util.List; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.Arrays; -import java.util.List; +import net.minecraft.world.loot.LootPool; +import net.minecraft.world.loot.LootTable; +import net.minecraft.world.loot.context.LootContextType; +import net.minecraft.world.loot.function.LootFunction; + +import net.fabricmc.fabric.api.loot.v1.FabricLootSupplier; @Mixin(LootTable.class) public abstract class MixinLootSupplier implements FabricLootSupplier { - @Shadow @Final private LootPool[] pools; - @Shadow @Final private LootFunction[] functions; + @Shadow + @Final + private LootPool[] pools; + @Shadow + @Final + private LootFunction[] functions; @Override public List getPools() { diff --git a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tag/FabricItemTags.java b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tag/FabricItemTags.java index 6c2383b77..570d7dbee 100644 --- a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tag/FabricItemTags.java +++ b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tag/FabricItemTags.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.api.tag; -import net.fabricmc.fabric.api.tools.FabricToolTags; import net.minecraft.item.Item; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.api.tools.FabricToolTags; + /** * Item tags provided by Fabric. * @@ -34,9 +35,7 @@ public class FabricItemTags { public static final Tag SHOVELS = FabricToolTags.SHOVELS; public static final Tag SWORDS = FabricToolTags.SWORDS; - private FabricItemTags() { - - } + private FabricItemTags() { } private static Tag register(String id) { return TagRegistry.item(new Identifier("fabric", id)); diff --git a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tools/FabricToolTags.java b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tools/FabricToolTags.java index 5fe971d26..a7567c43d 100644 --- a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tools/FabricToolTags.java +++ b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/api/tools/FabricToolTags.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.api.tools; -import net.fabricmc.fabric.api.tag.TagRegistry; import net.minecraft.item.Item; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.api.tag.TagRegistry; + /** * Tool item tags provided by Fabric. */ @@ -31,9 +32,7 @@ public class FabricToolTags { public static final Tag SHOVELS = register("shovels"); public static final Tag SWORDS = register("swords"); - private FabricToolTags() { - - } + private FabricToolTags() { } private static Tag register(String id) { return TagRegistry.item(new Identifier("fabric", id)); diff --git a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/impl/tools/ToolManager.java b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/impl/tools/ToolManager.java index fe99bcea5..7573d25df 100644 --- a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/impl/tools/ToolManager.java +++ b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/impl/tools/ToolManager.java @@ -16,7 +16,9 @@ package net.fabricmc.fabric.impl.tools; -import net.fabricmc.fabric.api.util.TriState; +import java.util.HashMap; +import java.util.Map; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.Item; @@ -24,8 +26,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ToolItem; import net.minecraft.tag.Tag; -import java.util.HashMap; -import java.util.Map; +import net.fabricmc.fabric.api.util.TriState; public final class ToolManager { public interface Entry { @@ -36,7 +37,7 @@ public final class ToolManager { private static class EntryImpl implements Entry { @SuppressWarnings("unchecked") - private Tag[] tags = (Tag[]) new Tag[0]; + private Tag[] tags = new Tag[0]; private int[] tagLevels = new int[0]; private TriState defaultValue = TriState.DEFAULT; @@ -55,7 +56,7 @@ public final class ToolManager { } //noinspection unchecked - Tag[] newTags = (Tag[]) new Tag[tags.length + 1]; + Tag[] newTags = new Tag[tags.length + 1]; int[] newTagLevels = new int[tagLevels.length + 1]; System.arraycopy(tags, 0, newTags, 0, tags.length); System.arraycopy(tagLevels, 0, newTagLevels, 0, tagLevels.length); @@ -68,9 +69,7 @@ public final class ToolManager { private static final Map entries = new HashMap<>(); - private ToolManager() { - - } + private ToolManager() { } public static Entry entry(Block block) { return entries.computeIfAbsent(block, (bb) -> new EntryImpl()); @@ -99,8 +98,10 @@ public final class ToolManager { */ public static TriState handleIsEffectiveOn(ItemStack stack, BlockState state) { EntryImpl entry = entries.get(state.getBlock()); + if (entry != null) { Item item = stack.getItem(); + for (int i = 0; i < entry.tags.length; i++) { if (item.isIn(entry.tags[i])) { return TriState.of(getMiningLevel(stack) >= entry.tagLevels[i]); diff --git a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MiningToolItemAccessor.java b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MiningToolItemAccessor.java index 9b23a88e6..0522cc3f5 100644 --- a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MiningToolItemAccessor.java +++ b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MiningToolItemAccessor.java @@ -16,10 +16,11 @@ package net.fabricmc.fabric.mixin.tools; -import net.minecraft.item.MiningToolItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import net.minecraft.item.MiningToolItem; + @Mixin(MiningToolItem.class) public interface MiningToolItemAccessor { @Accessor diff --git a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MixinItemStack.java b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MixinItemStack.java index 9fbdaea49..de74e255a 100644 --- a/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MixinItemStack.java +++ b/fabric-mining-levels-v0/src/main/java/net/fabricmc/fabric/mixin/tools/MixinItemStack.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.mixin.tools; -import net.fabricmc.fabric.api.util.TriState; -import net.fabricmc.fabric.impl.tools.ToolManager; -import net.minecraft.block.BlockState; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.block.BlockState; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import net.fabricmc.fabric.api.util.TriState; +import net.fabricmc.fabric.impl.tools.ToolManager; + @Mixin(ItemStack.class) public abstract class MixinItemStack { @Shadow @@ -35,6 +37,7 @@ public abstract class MixinItemStack { @Inject(at = @At("HEAD"), method = "isEffectiveOn", cancellable = true) public void isEffectiveOn(BlockState state, CallbackInfoReturnable info) { TriState triState = ToolManager.handleIsEffectiveOn((ItemStack) (Object) this, state); + if (triState != TriState.DEFAULT) { info.setReturnValue(triState.get()); info.cancel(); @@ -45,11 +48,11 @@ public abstract class MixinItemStack { public void getBlockBreakingSpeed(BlockState state, CallbackInfoReturnable info) { if (this.getItem() instanceof MiningToolItemAccessor) { TriState triState = ToolManager.handleIsEffectiveOn((ItemStack) (Object) this, state); + if (triState != TriState.DEFAULT) { info.setReturnValue(triState.get() ? ((MiningToolItemAccessor) this.getItem()).getMiningSpeed() : 1.0F); info.cancel(); } } } - } diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelAppender.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelAppender.java index d433abd4f..b2398b2d0 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelAppender.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelAppender.java @@ -16,11 +16,11 @@ package net.fabricmc.fabric.api.client.model; +import java.util.function.Consumer; + import net.minecraft.client.util.ModelIdentifier; import net.minecraft.resource.ResourceManager; -import java.util.function.Consumer; - @FunctionalInterface public interface ModelAppender { void appendAll(ResourceManager manager, Consumer out); diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelLoadingRegistry.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelLoadingRegistry.java index ad15fe02f..64b2ba5ae 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelLoadingRegistry.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelLoadingRegistry.java @@ -16,10 +16,11 @@ package net.fabricmc.fabric.api.client.model; -import net.fabricmc.fabric.impl.client.model.ModelLoadingRegistryImpl; +import java.util.function.Function; + import net.minecraft.resource.ResourceManager; -import java.util.function.Function; +import net.fabricmc.fabric.impl.client.model.ModelLoadingRegistryImpl; public interface ModelLoadingRegistry { ModelLoadingRegistry INSTANCE = ModelLoadingRegistryImpl.INSTANCE; diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelProviderContext.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelProviderContext.java index 072a334ef..3aafc7014 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelProviderContext.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelProviderContext.java @@ -26,8 +26,8 @@ import net.minecraft.util.Identifier; public interface ModelProviderContext { /** * Load a model using a {@link Identifier}, {@link ModelIdentifier}, ... - *

- * Please note that the game engine keeps track of circular model loading calls on its own. + * + *

Please note that the game engine keeps track of circular model loading calls on its own. * * @param id The model identifier. * @return The UnbakedModel. Can return a missing model if it's not present! diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelResourceProvider.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelResourceProvider.java index e52e531a0..b6544414c 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelResourceProvider.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelResourceProvider.java @@ -21,27 +21,26 @@ import net.minecraft.util.Identifier; /** * Interface for model resource providers. - *

- * Model resource providers hook the loading of model *files* from the resource tree; + * + *

Model resource providers hook the loading of model *files* from the resource tree; * that is, in vanilla, it handles going from "minecraft:block/stone" to a * "assets/minecraft/models/block/stone.json" file. - *

- * This is where you want to add your own custom model formats. - *

- * As providers are instantiated with a new provider, it is safe + * + *

This is where you want to add your own custom model formats. + * + *

As providers are instantiated with a new provider, it is safe * (and recommended!) to cache information inside a loader. - *

- * Keep in mind that only *one* ModelResourceProvider may respond to a given model + * + *

Keep in mind that only *one* ModelResourceProvider may respond to a given model * at any time. If you're writing, say, an OBJ loader, this means you could * easily conflict with another OBJ loader unless you take some precautions, * for example: - *

- * a) Only load files with a mod-suffixed name, such as .architect.obj, - * b) Only load files from an explicit list of namespaces, registered elsewhere. + * + *

  • Only load files with a mod-suffixed name, such as .architect.obj, + *
  • Only load files from an explicit list of namespaces, registered elsewhere.
*/ @FunctionalInterface public interface ModelResourceProvider { - /** * @param resourceId The resource identifier to be loaded. * @return The loaded UnbakedModel, or null if this ModelResourceProvider doesn't handle a specific Identifier diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelVariantProvider.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelVariantProvider.java index 476ad7065..81bcf0dc3 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelVariantProvider.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/api/client/model/ModelVariantProvider.java @@ -21,24 +21,23 @@ import net.minecraft.client.util.ModelIdentifier; /** * Interface for model variant providers. - *

- * Model variant providers hook the resolution of ModelIdentifiers. In vanilla, this is + * + *

Model variant providers hook the resolution of ModelIdentifiers. In vanilla, this is * the part where a "minecraft:stone#normal" identifier triggers the loading of a * "minecraft:models/stone" model ({@link ModelResourceProvider} handles the later step). - *

- * The most common use of this is to cooperate with a {@link ModelAppender}, but it can + * + *

The most common use of this is to cooperate with a {@link ModelAppender}, but it can * also allow you to add your own block- or item-state formats. To trigger the loading * of another model, use the passed {@link ModelProviderContext}. - *

- * As every model loading is instantiated with a new provider, it is safe + * + *

As every model loading is instantiated with a new provider, it is safe * (and recommended!) to cache information. - *

- * Keep in mind that only *one* ModelVariantProvider may respond to a given model + * + *

Keep in mind that only *one* ModelVariantProvider may respond to a given model * at any time. */ @FunctionalInterface public interface ModelVariantProvider { - /** * @param modelId The model identifier, complete with variant. * @return The loaded UnbakedModel, or null if this ModelVariantProvider doesn't handle a specific Identifier diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/impl/client/model/ModelLoadingRegistryImpl.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/impl/client/model/ModelLoadingRegistryImpl.java index 33ba824ad..8951aec57 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/impl/client/model/ModelLoadingRegistryImpl.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/impl/client/model/ModelLoadingRegistryImpl.java @@ -16,17 +16,6 @@ package net.fabricmc.fabric.impl.client.model; -import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.client.model.*; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -35,9 +24,27 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import com.google.common.collect.Lists; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.util.ModelIdentifier; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.api.client.model.ModelAppender; +import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry; +import net.fabricmc.fabric.api.client.model.ModelProviderContext; +import net.fabricmc.fabric.api.client.model.ModelProviderException; +import net.fabricmc.fabric.api.client.model.ModelResourceProvider; +import net.fabricmc.fabric.api.client.model.ModelVariantProvider; +import net.fabricmc.loader.api.FabricLoader; + public class ModelLoadingRegistryImpl implements ModelLoadingRegistry { private static final boolean DEBUG_MODEL_LOADING = FabricLoader.getInstance().isDevelopmentEnvironment() - || Boolean.valueOf(System.getProperty("fabric.debugModelLoading", "false")); + || Boolean.valueOf(System.getProperty("fabric.debugModelLoading", "false")); @FunctionalInterface private interface CustomModelItf { @@ -81,6 +88,7 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry { for (T provider : loaders) { try { UnbakedModel model = function.load(provider); + if (model != null) { return model; } @@ -100,6 +108,7 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry { for (T provider : loaders) { try { UnbakedModel model = function.load(provider); + if (model != null) { if (providersApplied != null) { providersApplied.add(provider); @@ -118,9 +127,11 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry { if (providersApplied != null) { StringBuilder builder = new StringBuilder("Conflict - multiple " + debugName + "s claimed the same unbaked model:"); + for (T loader : providersApplied) { builder.append("\n\t - ").append(loader.getClass().getName()); } + logger.error(builder.toString()); return null; } else { @@ -140,6 +151,7 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry { } else { ModelIdentifier modelId = (ModelIdentifier) variantId; UnbakedModel model = loadCustomModel((r) -> r.loadModelVariant((ModelIdentifier) variantId, this), modelVariantProviders, "resource provider"); + if (model != null) { return model; } @@ -148,6 +160,7 @@ public class ModelLoadingRegistryImpl implements ModelLoadingRegistry { if (Objects.equals(modelId.getVariant(), "inventory")) { Identifier resourceId = new Identifier(modelId.getNamespace(), "item/" + modelId.getPath()); model = loadModelFromResource(resourceId); + if (model != null) { return model; } diff --git a/fabric-models-v0/src/main/java/net/fabricmc/fabric/mixin/client/model/MixinModelLoader.java b/fabric-models-v0/src/main/java/net/fabricmc/fabric/mixin/client/model/MixinModelLoader.java index be9db76f4..c38ab3db8 100644 --- a/fabric-models-v0/src/main/java/net/fabricmc/fabric/mixin/client/model/MixinModelLoader.java +++ b/fabric-models-v0/src/main/java/net/fabricmc/fabric/mixin/client/model/MixinModelLoader.java @@ -16,21 +16,23 @@ package net.fabricmc.fabric.mixin.client.model; -import net.fabricmc.fabric.impl.client.model.ModelLoaderHooks; -import net.fabricmc.fabric.impl.client.model.ModelLoadingRegistryImpl; -import net.minecraft.client.render.model.ModelLoader; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; +import java.util.Map; +import java.util.Set; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Map; -import java.util.Set; +import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; +import net.minecraft.client.util.ModelIdentifier; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.impl.client.model.ModelLoaderHooks; +import net.fabricmc.fabric.impl.client.model.ModelLoadingRegistryImpl; @Mixin(ModelLoader.class) public class MixinModelLoader implements ModelLoaderHooks { @@ -47,23 +49,18 @@ public class MixinModelLoader implements ModelLoaderHooks { private ModelLoadingRegistryImpl.LoaderInstance fabric_mlrLoaderInstance; @Shadow - private void addModel(ModelIdentifier id) { - - } + private void addModel(ModelIdentifier id) { } @Shadow - private void putModel(Identifier id, UnbakedModel unbakedModel) { - - } + private void putModel(Identifier id, UnbakedModel unbakedModel) { } @Shadow - private void loadModel(Identifier id) { - - } + private void loadModel(Identifier id) { } @Inject(at = @At("HEAD"), method = "loadModel", cancellable = true) private void loadModelHook(Identifier id, CallbackInfo ci) { UnbakedModel customModel = fabric_mlrLoaderInstance.loadModelFromVariant(id); + if (customModel != null) { putModel(id, customModel); ci.cancel(); @@ -74,7 +71,7 @@ public class MixinModelLoader implements ModelLoaderHooks { private void addModelHook(ModelIdentifier id, CallbackInfo info) { if (id == MISSING) { //noinspection RedundantCast - ModelLoaderHooks hooks = (ModelLoaderHooks) (Object) this; + ModelLoaderHooks hooks = this; fabric_mlrLoaderInstance = ModelLoadingRegistryImpl.begin((ModelLoader) (Object) this, resourceManager); fabric_mlrLoaderInstance.onModelPopulation(hooks::fabric_addModel); @@ -97,6 +94,7 @@ public class MixinModelLoader implements ModelLoaderHooks { if (!modelsToLoad.add(id)) { throw new IllegalStateException("Circular reference while loading " + id); } + loadModel(id); modelsToLoad.remove(id); return unbakedModels.get(id); diff --git a/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/api/block/entity/BlockEntityClientSerializable.java b/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/api/block/entity/BlockEntityClientSerializable.java index 99db278e0..a2dfc32c3 100644 --- a/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/api/block/entity/BlockEntityClientSerializable.java +++ b/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/api/block/entity/BlockEntityClientSerializable.java @@ -37,7 +37,7 @@ public interface BlockEntityClientSerializable { * This will cause {@link #toClientTag(CompoundTag)} to be called on the * server to generate the packet data, and then * {@link #fromClientTag(CompoundTag)} on the client to decode that data. - * + * *

This is preferable to * {@link World#updateListeners(net.minecraft.util.math.BlockPos, net.minecraft.block.BlockState, net.minecraft.block.BlockState, int)} * because it does not cause entities to update their pathing as a side effect. diff --git a/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinBlockEntity.java b/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinBlockEntity.java index 756cababd..72e8164ec 100644 --- a/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinBlockEntity.java +++ b/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinBlockEntity.java @@ -16,18 +16,20 @@ package net.fabricmc.fabric.mixin.networkingblockentity; -import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.client.network.packet.BlockEntityUpdateS2CPacket; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; @Mixin(BlockEntity.class) public abstract class MixinBlockEntity { @@ -39,7 +41,7 @@ public abstract class MixinBlockEntity { @Inject(at = @At("HEAD"), method = "toUpdatePacket", cancellable = true) public void toUpdatePacket(CallbackInfoReturnable info) { - Object self = (Object) this; + Object self = this; if (self instanceof BlockEntityClientSerializable) { // Mojang's serialization of x/y/z into the update packet is redundant, @@ -50,6 +52,7 @@ public abstract class MixinBlockEntity { CompoundTag tag = new CompoundTag(); Identifier entityId = BlockEntityType.getId(getType()); + if (entityId == null) { throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!"); } @@ -63,7 +66,7 @@ public abstract class MixinBlockEntity { @Inject(at = @At("RETURN"), method = "toInitialChunkDataTag", cancellable = true) public void toInitialChunkDataTag(CallbackInfoReturnable info) { - Object self = (Object) this; + Object self = this; if (self instanceof BlockEntityClientSerializable && info.getReturnValue() != null) { info.setReturnValue(((BlockEntityClientSerializable) self).toClientTag(info.getReturnValue())); diff --git a/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinClientPlayNetworkHandler.java b/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinClientPlayNetworkHandler.java index e6af9b8f8..40e9f3f3a 100644 --- a/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinClientPlayNetworkHandler.java +++ b/fabric-networking-blockentity-v0/src/main/java/net/fabricmc/fabric/mixin/networkingblockentity/MixinClientPlayNetworkHandler.java @@ -16,13 +16,6 @@ package net.fabricmc.fabric.mixin.networkingblockentity; -import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.packet.BlockEntityUpdateS2CPacket; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -33,6 +26,15 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.packet.BlockEntityUpdateS2CPacket; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; + @Mixin(ClientPlayNetworkHandler.class) public class MixinClientPlayNetworkHandler { @Unique @@ -44,14 +46,16 @@ public class MixinClientPlayNetworkHandler { if (packet.getBlockEntityType() == 127) { BlockEntityClientSerializable serializable = (BlockEntityClientSerializable) entity; String id = packet.getCompoundTag().getString("id"); + if (id != null) { Identifier otherIdObj = BlockEntityType.getId(entity.getType()); - ; + if (otherIdObj == null) { FABRIC_LOGGER.error(entity.getClass() + " is missing a mapping! This is a bug!"); info.cancel(); return; } + String otherId = otherIdObj.toString(); if (otherId.equals(id)) { diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/C2SPacketTypeCallback.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/C2SPacketTypeCallback.java index 138060f5c..9f58542d6 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/C2SPacketTypeCallback.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/C2SPacketTypeCallback.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.api.event.network; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; +import java.util.Collection; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Identifier; -import java.util.Collection; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; /** * Event for listening to packet type registrations and unregistrations @@ -29,22 +30,22 @@ import java.util.Collection; * in the client -> server direction. */ public interface C2SPacketTypeCallback { - static final Event REGISTERED = EventFactory.createArrayBacked( - C2SPacketTypeCallback.class, - (callbacks) -> (client, types) -> { - for (C2SPacketTypeCallback callback : callbacks) { - callback.accept(client, types); + Event REGISTERED = EventFactory.createArrayBacked( + C2SPacketTypeCallback.class, + (callbacks) -> (client, types) -> { + for (C2SPacketTypeCallback callback : callbacks) { + callback.accept(client, types); + } } - } ); - static final Event UNREGISTERED = EventFactory.createArrayBacked( - C2SPacketTypeCallback.class, - (callbacks) -> (client, types) -> { - for (C2SPacketTypeCallback callback : callbacks) { - callback.accept(client, types); + Event UNREGISTERED = EventFactory.createArrayBacked( + C2SPacketTypeCallback.class, + (callbacks) -> (client, types) -> { + for (C2SPacketTypeCallback callback : callbacks) { + callback.accept(client, types); + } } - } ); /** diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/S2CPacketTypeCallback.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/S2CPacketTypeCallback.java index 13b10c952..b1602613d 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/S2CPacketTypeCallback.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/event/network/S2CPacketTypeCallback.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.api.event.network; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; +import java.util.Collection; + import net.minecraft.util.Identifier; -import java.util.Collection; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; /** * Event for listening to packet type registrations and unregistrations @@ -28,22 +29,22 @@ import java.util.Collection; * in the server -> client direction. */ public interface S2CPacketTypeCallback { - static final Event REGISTERED = EventFactory.createArrayBacked( - S2CPacketTypeCallback.class, - (callbacks) -> (types) -> { - for (S2CPacketTypeCallback callback : callbacks) { - callback.accept(types); + Event REGISTERED = EventFactory.createArrayBacked( + S2CPacketTypeCallback.class, + (callbacks) -> (types) -> { + for (S2CPacketTypeCallback callback : callbacks) { + callback.accept(types); + } } - } ); - static final Event UNREGISTERED = EventFactory.createArrayBacked( - S2CPacketTypeCallback.class, - (callbacks) -> (types) -> { - for (S2CPacketTypeCallback callback : callbacks) { - callback.accept(types); + Event UNREGISTERED = EventFactory.createArrayBacked( + S2CPacketTypeCallback.class, + (callbacks) -> (types) -> { + for (S2CPacketTypeCallback callback : callbacks) { + callback.accept(types); + } } - } ); /** diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ClientSidePacketRegistry.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ClientSidePacketRegistry.java index b2ee5c1e5..6c5af7b6c 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ClientSidePacketRegistry.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ClientSidePacketRegistry.java @@ -18,21 +18,23 @@ package net.fabricmc.fabric.api.network; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.fabricmc.fabric.impl.network.ClientSidePacketRegistryImpl; + import net.minecraft.network.Packet; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; +import net.fabricmc.fabric.impl.network.ClientSidePacketRegistryImpl; + /** * The client-side packet registry. - *

- * It is used for: - *

- * - registering client-side packet receivers (server -> client packets) - * - sending packets to the server (client -> server packets). + * + *

It is used for: + * + *

  • registering client-side packet receivers (server -> client packets) + *
  • sending packets to the server (client -> server packets).
*/ public interface ClientSidePacketRegistry extends PacketRegistry { - static final ClientSidePacketRegistry INSTANCE = new ClientSidePacketRegistryImpl(); + ClientSidePacketRegistry INSTANCE = new ClientSidePacketRegistryImpl(); /** * Check if the server declared the ability to receive a given packet ID diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketConsumer.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketConsumer.java index 7064b9f8c..b6d42c55d 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketConsumer.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketConsumer.java @@ -26,11 +26,11 @@ public interface PacketConsumer { /** * Receive a CustomPayload-based packet. * - * The PacketByteBuf received will be released as soon as the method exits, + *

The PacketByteBuf received will be released as soon as the method exits, * meaning that you have to call .retain()/.release() on it if you want to * keep it around after that. * - * Please keep in mind that this CAN be called OUTSIDE of the main thread! + *

Please keep in mind that this CAN be called OUTSIDE of the main thread! * Most game operations are not thread-safe, so you should look into using * the thread task queue ({@link PacketContext#getTaskQueue()}) to split * the "reading" (which should happen within this method's execution) diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketContext.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketContext.java index d70ecb8f4..782045a42 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketContext.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/PacketContext.java @@ -16,10 +16,11 @@ package net.fabricmc.fabric.api.network; -import net.fabricmc.api.EnvType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ThreadExecutor; +import net.fabricmc.api.EnvType; + /** * Interface defining a context used during packet processing. Allows access * to additional information, such as the source/target of the player, or @@ -36,8 +37,8 @@ public interface PacketContext { /** * Get the player associated with the packet. - *

- * On the client side, this always returns the client-side player instance. + * + *

On the client side, this always returns the client-side player instance. * On the server side, it returns the player belonging to the client this * packet was sent by. * @@ -47,15 +48,15 @@ public interface PacketContext { /** * Get the task queue for a given side. - *

- * As Minecraft networking I/O is asynchronous, but a lot of its logic is + * + *

As Minecraft networking I/O is asynchronous, but a lot of its logic is * not thread-safe, it is recommended to do the following: - *

- * - read and parse the PacketByteBuf, - * - run the packet response logic through the main thread task queue via + * + *

  • read and parse the PacketByteBuf, + *
  • run the packet response logic through the main thread task queue via * ThreadTaskQueue.execute(). The method will check if it's not already * on the main thread in order to avoid unnecessary delays, so don't - * worry about that! + * worry about that!
* * @return The thread task queue. */ diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ServerSidePacketRegistry.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ServerSidePacketRegistry.java index b26dd2614..cb12d9fca 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ServerSidePacketRegistry.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/network/ServerSidePacketRegistry.java @@ -18,25 +18,27 @@ package net.fabricmc.fabric.api.network; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.fabricmc.fabric.api.server.PlayerStream; -import net.fabricmc.fabric.impl.network.ServerSidePacketRegistryImpl; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.Packet; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; +import net.fabricmc.fabric.api.server.PlayerStream; +import net.fabricmc.fabric.impl.network.ServerSidePacketRegistryImpl; + /** * The server-side packet registry. - *

- * It is used for: - *

- * - registering server-side packet receivers (client -> server packets) - * - sending packets to clients (server -> client packets). - *

- * For iterating over clients in a server, see {@link PlayerStream}. + * + *

It is used for: + * + *

  • registering server-side packet receivers (client -> server packets) + *
  • sending packets to clients (server -> client packets).
+ * + *

For iterating over clients in a server, see {@link PlayerStream}. */ public interface ServerSidePacketRegistry extends PacketRegistry { - static final ServerSidePacketRegistry INSTANCE = new ServerSidePacketRegistryImpl(); + ServerSidePacketRegistry INSTANCE = new ServerSidePacketRegistryImpl(); /** * Check if a given client declared the ability to receive a given packet ID diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/server/PlayerStream.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/server/PlayerStream.java index 1d4092e1f..f9d181605 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/server/PlayerStream.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/api/server/PlayerStream.java @@ -16,7 +16,8 @@ package net.fabricmc.fabric.api.server; -import net.fabricmc.fabric.impl.server.EntityTrackerStorageAccessor; +import java.util.stream.Stream; + import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -31,17 +32,15 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraft.world.chunk.ChunkManager; -import java.util.stream.Stream; +import net.fabricmc.fabric.impl.server.EntityTrackerStorageAccessor; /** * Helper streams for looking up players on a server. - *

- * In general, most of these methods will only function with a {@link ServerWorld} instance. + * + *

In general, most of these methods will only function with a {@link ServerWorld} instance. */ public final class PlayerStream { - private PlayerStream() { - - } + private PlayerStream() { } public static Stream all(MinecraftServer server) { if (server.getPlayerManager() != null) { @@ -54,7 +53,7 @@ public final class PlayerStream { public static Stream world(World world) { if (world instanceof ServerWorld) { // noinspection unchecked - return ((Stream) (Stream) ((ServerWorld) world).getPlayers().stream()); + return ((Stream) ((ServerWorld) world).getPlayers().stream()); } else { throw new RuntimeException("Only supported on ServerWorld!"); } @@ -62,11 +61,12 @@ public final class PlayerStream { public static Stream watching(World world, ChunkPos pos) { ChunkManager manager = world.getChunkManager(); + if (!(manager instanceof ServerChunkManager)) { throw new RuntimeException("Only supported on ServerWorld!"); } else { //noinspection unchecked - return ((Stream) (Stream) ((ServerChunkManager) manager).threadedAnvilChunkStorage.getPlayersWatchingChunk(pos, false)); + return ((Stream) ((ServerChunkManager) manager).threadedAnvilChunkStorage.getPlayersWatchingChunk(pos, false)); } } @@ -81,9 +81,10 @@ public final class PlayerStream { if (manager instanceof ServerChunkManager) { ThreadedAnvilChunkStorage storage = ((ServerChunkManager) manager).threadedAnvilChunkStorage; + if (storage instanceof EntityTrackerStorageAccessor) { //noinspection unchecked - return ((Stream) (Stream) ((EntityTrackerStorageAccessor) storage).fabric_getTrackingPlayers(entity)); + return ((Stream) ((EntityTrackerStorageAccessor) storage).fabric_getTrackingPlayers(entity)); } } diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ClientSidePacketRegistryImpl.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ClientSidePacketRegistryImpl.java index 22b08236b..bdb387236 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ClientSidePacketRegistryImpl.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ClientSidePacketRegistryImpl.java @@ -16,11 +16,13 @@ package net.fabricmc.fabric.impl.network; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; + import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.fabricmc.fabric.api.event.network.S2CPacketTypeCallback; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; -import net.fabricmc.fabric.api.network.PacketContext; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.network.Packet; @@ -28,9 +30,9 @@ import net.minecraft.server.network.packet.CustomPayloadC2SPacket; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; +import net.fabricmc.fabric.api.event.network.S2CPacketTypeCallback; +import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +import net.fabricmc.fabric.api.network.PacketContext; public class ClientSidePacketRegistryImpl extends PacketRegistryImpl implements ClientSidePacketRegistry { private final Collection serverPayloadIds = new HashSet<>(); @@ -47,6 +49,7 @@ public class ClientSidePacketRegistryImpl extends PacketRegistryImpl implements @Override public void sendToServer(Packet packet, GenericFutureListener> completionListener) { ClientPlayNetworkHandler handler = MinecraftClient.getInstance().getNetworkHandler(); + if (handler != null) { if (completionListener == null) { // stay closer to the vanilla codepath @@ -67,6 +70,7 @@ public class ClientSidePacketRegistryImpl extends PacketRegistryImpl implements @Override protected void onRegister(Identifier id) { ClientPlayNetworkHandler handler = MinecraftClient.getInstance().getNetworkHandler(); + if (handler != null) { createRegisterTypePacket(PacketTypes.REGISTER, Collections.singleton(id)).ifPresent(handler::sendPacket); } @@ -75,6 +79,7 @@ public class ClientSidePacketRegistryImpl extends PacketRegistryImpl implements @Override protected void onUnregister(Identifier id) { ClientPlayNetworkHandler handler = MinecraftClient.getInstance().getNetworkHandler(); + if (handler != null) { createRegisterTypePacket(PacketTypes.UNREGISTER, Collections.singleton(id)).ifPresent(handler::sendPacket); } diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketDebugOptions.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketDebugOptions.java index 1101ded81..6f8d523d1 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketDebugOptions.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketDebugOptions.java @@ -19,7 +19,5 @@ package net.fabricmc.fabric.impl.network; public final class PacketDebugOptions { public static final boolean DISABLE_BUFFER_RELEASES = System.getProperty("fabric.networking.broken.disableBufferReleases", "false").equalsIgnoreCase("true"); - private PacketDebugOptions() { - - } + private PacketDebugOptions() { } } diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketRegistryImpl.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketRegistryImpl.java index 7b02ba3f1..6bc137355 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketRegistryImpl.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/PacketRegistryImpl.java @@ -16,20 +16,26 @@ package net.fabricmc.fabric.impl.network; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + import io.netty.buffer.Unpooled; -import net.fabricmc.fabric.api.network.PacketConsumer; -import net.fabricmc.fabric.api.network.PacketContext; -import net.fabricmc.fabric.api.network.PacketRegistry; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.network.Packet; import net.minecraft.util.Identifier; import net.minecraft.util.InvalidIdentifierException; import net.minecraft.util.PacketByteBuf; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.function.Supplier; +import net.fabricmc.fabric.api.network.PacketConsumer; +import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.api.network.PacketRegistry; public abstract class PacketRegistryImpl implements PacketRegistry { protected static final Logger LOGGER = LogManager.getLogger(); @@ -47,6 +53,7 @@ public abstract class PacketRegistryImpl implements PacketRegistry { @Override public void register(Identifier id, PacketConsumer consumer) { boolean isNew = true; + if (consumerMap.containsKey(id)) { LOGGER.warn("Registered duplicate packet " + id + "!"); LOGGER.trace(new Throwable()); @@ -54,6 +61,7 @@ public abstract class PacketRegistryImpl implements PacketRegistry { } consumerMap.put(id, consumer); + if (isNew) { onRegister(id); } @@ -86,14 +94,17 @@ public abstract class PacketRegistryImpl implements PacketRegistry { PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); boolean first = true; + for (Identifier a : ids) { if (!first) { buf.writeByte(0); } else { first = false; } + buf.writeBytes(a.toString().getBytes(StandardCharsets.US_ASCII)); } + return Optional.of(toPacket(id, buf)); } @@ -108,8 +119,10 @@ public abstract class PacketRegistryImpl implements PacketRegistry { try { while (buf.readerIndex() < buf.writerIndex()) { c = (char) buf.readByte(); + if (c == 0) { String s = sb.toString(); + if (!s.isEmpty()) { try { ids.add(new Identifier(s)); @@ -118,6 +131,7 @@ public abstract class PacketRegistryImpl implements PacketRegistry { LOGGER.trace(e); } } + sb = new StringBuilder(); } else { sb.append(c); @@ -128,6 +142,7 @@ public abstract class PacketRegistryImpl implements PacketRegistry { } String s = sb.toString(); + if (!s.isEmpty()) { try { ids.add(new Identifier(s)); @@ -139,6 +154,7 @@ public abstract class PacketRegistryImpl implements PacketRegistry { } Collection target = getIdCollectionFor(context); + if (id.equals(PacketTypes.UNREGISTER)) { target.removeAll(ids); onReceivedUnregisterPacket(context, ids); @@ -146,13 +162,14 @@ public abstract class PacketRegistryImpl implements PacketRegistry { target.addAll(ids); onReceivedRegisterPacket(context, ids); } + return false; // continue execution for other mods } /** * Hook for accepting packets used in Fabric mixins. * - * As PacketByteBuf getters in vanilla create a copy (to allow releasing the original packet buffer without + *

As PacketByteBuf getters in vanilla create a copy (to allow releasing the original packet buffer without * breaking other, potentially delayed accesses), we use a Supplier to generate those copies and release them * when needed. * @@ -167,8 +184,10 @@ public abstract class PacketRegistryImpl implements PacketRegistry { } PacketConsumer consumer = consumerMap.get(id); + if (consumer != null) { PacketByteBuf buf = bufSupplier.get(); + try { consumer.accept(context, buf); } catch (Throwable t) { @@ -178,6 +197,7 @@ public abstract class PacketRegistryImpl implements PacketRegistry { buf.release(); } } + return true; } else { return false; diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ServerSidePacketRegistryImpl.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ServerSidePacketRegistryImpl.java index 5492cb1f6..b10198409 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ServerSidePacketRegistryImpl.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/network/ServerSidePacketRegistryImpl.java @@ -16,11 +16,18 @@ package net.fabricmc.fabric.impl.network; +import java.lang.ref.WeakReference; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.function.Consumer; + import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import net.fabricmc.fabric.api.event.network.C2SPacketTypeCallback; -import net.fabricmc.fabric.api.network.PacketContext; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; + import net.minecraft.client.network.packet.CustomPayloadS2CPacket; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.Packet; @@ -30,9 +37,9 @@ import net.minecraft.server.network.packet.LoginQueryResponseC2SPacket; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; -import java.lang.ref.WeakReference; -import java.util.*; -import java.util.function.Consumer; +import net.fabricmc.fabric.api.event.network.C2SPacketTypeCallback; +import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; public class ServerSidePacketRegistryImpl extends PacketRegistryImpl implements ServerSidePacketRegistry { private final WeakHashMap> playerPayloadIds = new WeakHashMap<>(); @@ -47,8 +54,10 @@ public class ServerSidePacketRegistryImpl extends PacketRegistryImpl implements protected void forEachHandler(Consumer consumer) { Iterator> it = handlers.iterator(); + while (it.hasNext()) { ServerPlayNetworkHandler server = it.next().get(); + if (server != null) { consumer.accept(server); } else { @@ -60,6 +69,7 @@ public class ServerSidePacketRegistryImpl extends PacketRegistryImpl implements @Override public boolean canPlayerReceive(PlayerEntity player, Identifier id) { Collection ids = playerPayloadIds.get(player); + if (ids != null) { return ids.contains(id); } else { diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStorageAccessor.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStorageAccessor.java index 7c12267fc..69b219b47 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStorageAccessor.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStorageAccessor.java @@ -16,11 +16,11 @@ package net.fabricmc.fabric.impl.server; +import java.util.stream.Stream; + import net.minecraft.entity.Entity; import net.minecraft.server.network.ServerPlayerEntity; -import java.util.stream.Stream; - public interface EntityTrackerStorageAccessor { Stream fabric_getTrackingPlayers(Entity entity); } diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStreamAccessor.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStreamAccessor.java index a656b3366..b77832d44 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStreamAccessor.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/impl/server/EntityTrackerStreamAccessor.java @@ -16,10 +16,10 @@ package net.fabricmc.fabric.impl.server; -import net.minecraft.server.network.ServerPlayerEntity; - import java.util.stream.Stream; +import net.minecraft.server.network.ServerPlayerEntity; + public interface EntityTrackerStreamAccessor { Stream fabric_getTrackingPlayers(); } diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinClientPlayNetworkHandler.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinClientPlayNetworkHandler.java index 00c72c2b8..ffbd16303 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinClientPlayNetworkHandler.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinClientPlayNetworkHandler.java @@ -16,12 +16,15 @@ package net.fabricmc.fabric.mixin.network; -import net.fabricmc.api.EnvType; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; -import net.fabricmc.fabric.api.network.PacketContext; -import net.fabricmc.fabric.impl.network.ClientSidePacketRegistryImpl; -import net.fabricmc.fabric.impl.network.PacketRegistryImpl; -import net.fabricmc.fabric.impl.network.PacketTypes; +import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.packet.CustomPayloadS2CPacket; @@ -31,14 +34,13 @@ import net.minecraft.network.Packet; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; import net.minecraft.util.ThreadExecutor; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.Optional; +import net.fabricmc.api.EnvType; +import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.impl.network.ClientSidePacketRegistryImpl; +import net.fabricmc.fabric.impl.network.PacketRegistryImpl; +import net.fabricmc.fabric.impl.network.PacketTypes; @Mixin(ClientPlayNetworkHandler.class) public abstract class MixinClientPlayNetworkHandler implements PacketContext { @@ -51,6 +53,7 @@ public abstract class MixinClientPlayNetworkHandler implements PacketContext { @Inject(at = @At("RETURN"), method = "onGameJoin") public void onGameJoin(GameJoinS2CPacket packet, CallbackInfo info) { Optional> optionalPacket = PacketRegistryImpl.createInitialRegisterPacket(ClientSidePacketRegistry.INSTANCE); + //noinspection OptionalIsPresent if (optionalPacket.isPresent()) { sendPacket(optionalPacket.get()); diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinCustomPayloadC2SPacket.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinCustomPayloadC2SPacket.java index e83d0c198..9124a6c64 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinCustomPayloadC2SPacket.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinCustomPayloadC2SPacket.java @@ -16,12 +16,14 @@ package net.fabricmc.fabric.mixin.network; -import net.fabricmc.fabric.impl.network.CustomPayloadC2SPacketAccessor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + import net.minecraft.server.network.packet.CustomPayloadC2SPacket; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; + +import net.fabricmc.fabric.impl.network.CustomPayloadC2SPacketAccessor; @Mixin(CustomPayloadC2SPacket.class) public class MixinCustomPayloadC2SPacket implements CustomPayloadC2SPacketAccessor { diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinEntityTracker.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinEntityTracker.java index f13b6b660..3f1605780 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinEntityTracker.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinEntityTracker.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.mixin.network; -import net.fabricmc.fabric.impl.server.EntityTrackerStreamAccessor; -import net.minecraft.server.network.ServerPlayerEntity; +import java.util.Set; +import java.util.stream.Stream; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import java.util.Set; -import java.util.stream.Stream; +import net.minecraft.server.network.ServerPlayerEntity; + +import net.fabricmc.fabric.impl.server.EntityTrackerStreamAccessor; @Mixin(targets = "net.minecraft.server.world.ThreadedAnvilChunkStorage$EntityTracker") public class MixinEntityTracker implements EntityTrackerStreamAccessor { diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinMinecraftClient.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinMinecraftClient.java index 9edd9a867..94556fd52 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinMinecraftClient.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinMinecraftClient.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.mixin.network; -import net.fabricmc.fabric.impl.network.ClientSidePacketRegistryImpl; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; + +import net.fabricmc.fabric.impl.network.ClientSidePacketRegistryImpl; + @Mixin(MinecraftClient.class) public class MixinMinecraftClient { @Inject(at = @At("RETURN"), method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V") diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinPlayerManager.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinPlayerManager.java index 417db1a39..26580a074 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinPlayerManager.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinPlayerManager.java @@ -16,25 +16,28 @@ package net.fabricmc.fabric.mixin.network; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; -import net.fabricmc.fabric.impl.network.PacketRegistryImpl; -import net.fabricmc.fabric.impl.network.ServerSidePacketRegistryImpl; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.Packet; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayerEntity; +import java.util.Optional; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Optional; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.Packet; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; + +import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; +import net.fabricmc.fabric.impl.network.PacketRegistryImpl; +import net.fabricmc.fabric.impl.network.ServerSidePacketRegistryImpl; @Mixin(priority = 500, value = PlayerManager.class) public abstract class MixinPlayerManager { @Inject(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/packet/DifficultyS2CPacket;(Lnet/minecraft/world/Difficulty;Z)V")) public void onPlayerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo info) { Optional> optionalPacket = PacketRegistryImpl.createInitialRegisterPacket(ServerSidePacketRegistry.INSTANCE); + //noinspection OptionalIsPresent if (optionalPacket.isPresent()) { player.networkHandler.sendPacket(optionalPacket.get()); diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinServerPlayNetworkHandler.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinServerPlayNetworkHandler.java index 3286badfe..7a27163b6 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinServerPlayNetworkHandler.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinServerPlayNetworkHandler.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.mixin.network; -import net.fabricmc.api.EnvType; -import net.fabricmc.fabric.api.network.PacketContext; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; -import net.fabricmc.fabric.impl.network.CustomPayloadC2SPacketAccessor; -import net.fabricmc.fabric.impl.network.ServerSidePacketRegistryImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayNetworkHandler; @@ -28,11 +29,12 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.packet.CustomPayloadC2SPacket; import net.minecraft.util.Identifier; import net.minecraft.util.ThreadExecutor; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.fabricmc.api.EnvType; +import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; +import net.fabricmc.fabric.impl.network.CustomPayloadC2SPacketAccessor; +import net.fabricmc.fabric.impl.network.ServerSidePacketRegistryImpl; @Mixin(ServerPlayNetworkHandler.class) public class MixinServerPlayNetworkHandler implements PacketContext { diff --git a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinThreadedAnvilChunkStorage.java b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinThreadedAnvilChunkStorage.java index 3769f37f5..5a2ebfc5d 100644 --- a/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinThreadedAnvilChunkStorage.java +++ b/fabric-networking-v0/src/main/java/net/fabricmc/fabric/mixin/network/MixinThreadedAnvilChunkStorage.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.mixin.network; +import java.util.stream.Stream; + import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.fabricmc.fabric.impl.server.EntityTrackerStorageAccessor; -import net.fabricmc.fabric.impl.server.EntityTrackerStreamAccessor; -import net.minecraft.entity.Entity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ThreadedAnvilChunkStorage; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import java.util.stream.Stream; +import net.minecraft.entity.Entity; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ThreadedAnvilChunkStorage; + +import net.fabricmc.fabric.impl.server.EntityTrackerStorageAccessor; +import net.fabricmc.fabric.impl.server.EntityTrackerStreamAccessor; @Mixin(ThreadedAnvilChunkStorage.class) public class MixinThreadedAnvilChunkStorage implements EntityTrackerStorageAccessor { diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/BlockSettingsExtensions.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/BlockSettingsExtensions.java index caabe0560..8ca772ea6 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/BlockSettingsExtensions.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/BlockSettingsExtensions.java @@ -16,7 +16,6 @@ package net.fabricmc.fabric.api.block; -import net.fabricmc.fabric.mixin.builders.BlockSettingsHooks; import net.minecraft.block.Block.Settings; import net.minecraft.block.MaterialColor; import net.minecraft.item.Item; @@ -24,63 +23,65 @@ import net.minecraft.sound.BlockSoundGroup; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.mixin.builders.BlockSettingsHooks; + public final class BlockSettingsExtensions { - private BlockSettingsExtensions() { - } + private BlockSettingsExtensions() { + } - public static void breakByHand(Settings settings, boolean breakByHand) { - FabricBlockSettings.computeExtraData(settings).breakByHand(breakByHand); - } + public static void breakByHand(Settings settings, boolean breakByHand) { + FabricBlockSettings.computeExtraData(settings).breakByHand(breakByHand); + } - public static void breakByTool(Settings settings, Tag tag, int miningLevel) { - FabricBlockSettings.computeExtraData(settings).addMiningLevel(tag, miningLevel); - } + public static void breakByTool(Settings settings, Tag tag, int miningLevel) { + FabricBlockSettings.computeExtraData(settings).addMiningLevel(tag, miningLevel); + } - public static void hardness(Settings settings, float hardness) { - ((BlockSettingsHooks) settings).setHardness(hardness); - } + public static void hardness(Settings settings, float hardness) { + ((BlockSettingsHooks) settings).setHardness(hardness); + } - public static void resistance(Settings settings, float resistance) { - ((BlockSettingsHooks) settings).setResistance(Math.max(0.0F, resistance)); - } + public static void resistance(Settings settings, float resistance) { + ((BlockSettingsHooks) settings).setResistance(Math.max(0.0F, resistance)); + } - public static void collidable(Settings settings, boolean collidable) { - ((BlockSettingsHooks) settings).setCollidable(collidable); - } + public static void collidable(Settings settings, boolean collidable) { + ((BlockSettingsHooks) settings).setCollidable(collidable); + } - public static void materialColor(Settings settings, MaterialColor materialColor) { - ((BlockSettingsHooks) settings).setMaterialColor(materialColor); - } + public static void materialColor(Settings settings, MaterialColor materialColor) { + ((BlockSettingsHooks) settings).setMaterialColor(materialColor); + } - public static void drops(Settings settings, Identifier dropTableId) { - ((BlockSettingsHooks) settings).setDropTableId(dropTableId); - } + public static void drops(Settings settings, Identifier dropTableId) { + ((BlockSettingsHooks) settings).setDropTableId(dropTableId); + } - public static void sounds(Settings settings, BlockSoundGroup soundGroup) { - ((BlockSettingsHooks) settings).invokeSounds(soundGroup); - } + public static void sounds(Settings settings, BlockSoundGroup soundGroup) { + ((BlockSettingsHooks) settings).invokeSounds(soundGroup); + } - public static void lightLevel(Settings settings, int lightLevel) { - ((BlockSettingsHooks) settings).invokeLightLevel(lightLevel); - } + public static void lightLevel(Settings settings, int lightLevel) { + ((BlockSettingsHooks) settings).invokeLightLevel(lightLevel); + } - public static void breakInstantly(Settings settings) { - ((BlockSettingsHooks) settings).invokeBreakInstantly(); - } + public static void breakInstantly(Settings settings) { + ((BlockSettingsHooks) settings).invokeBreakInstantly(); + } - public static void strength(Settings settings, float strength) { - ((BlockSettingsHooks) settings).invokeStrength(strength); - } + public static void strength(Settings settings, float strength) { + ((BlockSettingsHooks) settings).invokeStrength(strength); + } - public static void ticksRandomly(Settings settings) { - ((BlockSettingsHooks) settings).invokeTicksRandomly(); - } + public static void ticksRandomly(Settings settings) { + ((BlockSettingsHooks) settings).invokeTicksRandomly(); + } - public static void dynamicBounds(Settings settings) { - ((BlockSettingsHooks) settings).invokeHasDynamicBounds(); - } + public static void dynamicBounds(Settings settings) { + ((BlockSettingsHooks) settings).invokeHasDynamicBounds(); + } - public static void dropsNothing(Settings settings) { - ((BlockSettingsHooks) settings).invokeDropsNothing(); - } + public static void dropsNothing(Settings settings) { + ((BlockSettingsHooks) settings).invokeDropsNothing(); + } } diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricBlockSettings.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricBlockSettings.java index 33c9c0fa3..6c5297f15 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricBlockSettings.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricBlockSettings.java @@ -16,8 +16,12 @@ package net.fabricmc.fabric.api.block; -import net.fabricmc.fabric.api.event.registry.BlockConstructedCallback; -import net.fabricmc.fabric.impl.tools.ToolManager; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + import net.minecraft.block.Block; import net.minecraft.block.Material; import net.minecraft.block.MaterialColor; @@ -27,17 +31,14 @@ import net.minecraft.tag.Tag; import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; +import net.fabricmc.fabric.api.event.registry.BlockConstructedCallback; +import net.fabricmc.fabric.impl.tools.ToolManager; /** * Fabric's version of Block.Settings. Adds additional methods and hooks * not found in the original class. - *

- * To use it, simply replace Block.Settings.create() with + * + *

To use it, simply replace Block.Settings.create() with * FabricBlockSettings.create() and add .build() at the end to return the * vanilla Block.Settings instance beneath. */ @@ -46,47 +47,49 @@ public class FabricBlockSettings { BlockConstructedCallback.EVENT.register(FabricBlockSettings::onBuild); } - private static final Map EXTRA_DATA = new HashMap<>(); + private static final Map EXTRA_DATA = new HashMap<>(); - protected final Block.Settings delegate; + protected final Block.Settings delegate; static final class ExtraData { - private final List miningLevels = new ArrayList<>(); - /* @Nullable */ private Boolean breakByHand; + private final List miningLevels = new ArrayList<>(); + /* @Nullable */ private Boolean breakByHand; private ExtraData(Block.Settings settings) { - } + } void breakByHand(boolean breakByHand) { - this.breakByHand = breakByHand; - } + this.breakByHand = breakByHand; + } void addMiningLevel(Tag tag, int level) { - miningLevels.add(new MiningLevel(tag, level)); - } + miningLevels.add(new MiningLevel(tag, level)); + } } - private static final class MiningLevel { - private final Tag tag; - private final int level; + private static final class MiningLevel { + private final Tag tag; + private final int level; - MiningLevel(Tag tag, int level) { - this.tag = tag; - this.level = level; - } - } + MiningLevel(Tag tag, int level) { + this.tag = tag; + this.level = level; + } + } static ExtraData computeExtraData(Block.Settings settings) { - return EXTRA_DATA.computeIfAbsent(settings, ExtraData::new); - } + return EXTRA_DATA.computeIfAbsent(settings, ExtraData::new); + } private static void onBuild(Block.Settings settings, Block block) { // TODO: Load only if fabric-mining-levels present ExtraData data = EXTRA_DATA.get(settings); + if (data != null) { if (data.breakByHand != null) { ToolManager.entry(block).setBreakByHand(data.breakByHand); } + for (MiningLevel tml : data.miningLevels) { ToolManager.entry(block).putBreakByTool(tml.tag, tml.level); } @@ -121,9 +124,9 @@ public class FabricBlockSettings { return new FabricBlockSettings(base); } - public static FabricBlockSettings copyOf(Block.Settings settings) { - return new FabricBlockSettings(settings); - } + public static FabricBlockSettings copyOf(Block.Settings settings) { + return new FabricBlockSettings(settings); + } /* FABRIC HELPERS */ @@ -137,9 +140,9 @@ public class FabricBlockSettings { return this; } - public FabricBlockSettings breakByTool(Tag tag) { - return breakByTool(tag, 0); - } + public FabricBlockSettings breakByTool(Tag tag) { + return breakByTool(tag, 0); + } /* DELEGATE WRAPPERS */ @@ -214,7 +217,7 @@ public class FabricBlockSettings { @Deprecated public FabricBlockSettings friction(float friction) { - delegate.slipperiness(friction); + delegate.slipperiness(friction); return this; } diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricMaterialBuilder.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricMaterialBuilder.java index 984b591f2..6b00da81f 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricMaterialBuilder.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/block/FabricMaterialBuilder.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.api.block; -import net.fabricmc.fabric.mixin.builders.MaterialBuilderHooks; import net.minecraft.block.Material; import net.minecraft.block.MaterialColor; import net.minecraft.block.piston.PistonBehavior; import net.minecraft.util.DyeColor; +import net.fabricmc.fabric.mixin.builders.MaterialBuilderHooks; + public class FabricMaterialBuilder extends Material.Builder { public FabricMaterialBuilder(MaterialColor color) { super(color); diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/EntityTrackingRegistry.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/EntityTrackingRegistry.java index 4a4c6a167..cd2b18d37 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/EntityTrackingRegistry.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/EntityTrackingRegistry.java @@ -16,13 +16,14 @@ package net.fabricmc.fabric.api.entity; -import net.minecraft.entity.EntityType; -import net.minecraft.util.registry.Registry; +import java.util.HashMap; +import java.util.Map; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.HashMap; -import java.util.Map; +import net.minecraft.entity.EntityType; +import net.minecraft.util.registry.Registry; /** * Registry for server->client entity tracking values. @@ -63,9 +64,7 @@ public class EntityTrackingRegistry { public static final EntityTrackingRegistry INSTANCE = new EntityTrackingRegistry(); private final Map entries = new HashMap<>(); - private EntityTrackingRegistry() { - - } + private EntityTrackingRegistry() { } @Deprecated public Entry get(EntityType type) { diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/FabricEntityTypeBuilder.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/FabricEntityTypeBuilder.java index 146f6de9e..062d9b6ee 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/FabricEntityTypeBuilder.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/entity/FabricEntityTypeBuilder.java @@ -16,16 +16,18 @@ package net.fabricmc.fabric.api.entity; -import net.fabricmc.fabric.impl.entity.FabricEntityType; +import java.util.function.Function; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCategory; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; import net.minecraft.world.World; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import java.util.function.Function; +import net.fabricmc.fabric.impl.entity.FabricEntityType; /** * Extended version of {@link EntityType.Builder} with added registration for diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/BlockConstructedCallback.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/BlockConstructedCallback.java index c8338c75f..00815acc1 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/BlockConstructedCallback.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/BlockConstructedCallback.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.api.event.registry; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.block.Block; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface BlockConstructedCallback { - public static Event EVENT = EventFactory.createArrayBacked(BlockConstructedCallback.class, - (listeners) -> (settings, builtBlock) -> { - for (BlockConstructedCallback callback : listeners) { - callback.building(settings, builtBlock); + Event EVENT = EventFactory.createArrayBacked(BlockConstructedCallback.class, + (listeners) -> (settings, builtBlock) -> { + for (BlockConstructedCallback callback : listeners) { + callback.building(settings, builtBlock); + } } - } ); void building(Block.Settings settings, Block builtBlock); diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/ItemConstructedCallback.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/ItemConstructedCallback.java index 1abc06e7d..560326ee4 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/ItemConstructedCallback.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/api/event/registry/ItemConstructedCallback.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.api.event.registry; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.item.Item; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + public interface ItemConstructedCallback { - public static Event EVENT = EventFactory.createArrayBacked(ItemConstructedCallback.class, - (listeners) -> (settings, builtItem) -> { - for (ItemConstructedCallback callback : listeners) { - callback.building(settings, builtItem); + Event EVENT = EventFactory.createArrayBacked(ItemConstructedCallback.class, + (listeners) -> (settings, builtItem) -> { + for (ItemConstructedCallback callback : listeners) { + callback.building(settings, builtItem); + } } - } ); void building(Item.Settings settings, Item builtItem); diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/BlockSettingsHooks.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/BlockSettingsHooks.java index ef8ecd547..d99fe70c5 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/BlockSettingsHooks.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/BlockSettingsHooks.java @@ -16,49 +16,50 @@ package net.fabricmc.fabric.mixin.builders; -import net.minecraft.block.Block; -import net.minecraft.block.MaterialColor; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; +import net.minecraft.block.Block; +import net.minecraft.block.MaterialColor; +import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.util.Identifier; + @Mixin(Block.Settings.class) public interface BlockSettingsHooks { - @Accessor - void setHardness(float hardness); + @Accessor + void setHardness(float hardness); - @Accessor - void setResistance(float resistance); + @Accessor + void setResistance(float resistance); - @Accessor - void setCollidable(boolean collidable); + @Accessor + void setCollidable(boolean collidable); - @Accessor - void setMaterialColor(MaterialColor materialColor); + @Accessor + void setMaterialColor(MaterialColor materialColor); - @Accessor - void setDropTableId(Identifier dropTableId); + @Accessor + void setDropTableId(Identifier dropTableId); - @Invoker - Block.Settings invokeSounds(BlockSoundGroup group); + @Invoker + Block.Settings invokeSounds(BlockSoundGroup group); - @Invoker - Block.Settings invokeLightLevel(int lightLevel); + @Invoker + Block.Settings invokeLightLevel(int lightLevel); - @Invoker - Block.Settings invokeBreakInstantly(); + @Invoker + Block.Settings invokeBreakInstantly(); - @Invoker - Block.Settings invokeStrength(float strength); + @Invoker + Block.Settings invokeStrength(float strength); - @Invoker - Block.Settings invokeTicksRandomly(); + @Invoker + Block.Settings invokeTicksRandomly(); - @Invoker - Block.Settings invokeHasDynamicBounds(); + @Invoker + Block.Settings invokeHasDynamicBounds(); - @Invoker - Block.Settings invokeDropsNothing(); + @Invoker + Block.Settings invokeDropsNothing(); } diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MaterialBuilderHooks.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MaterialBuilderHooks.java index 0120f7441..9845fe59d 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MaterialBuilderHooks.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MaterialBuilderHooks.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.mixin.builders; -import net.minecraft.block.Material; -import net.minecraft.block.piston.PistonBehavior; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; +import net.minecraft.block.Material; +import net.minecraft.block.piston.PistonBehavior; + @Mixin(Material.Builder.class) public interface MaterialBuilderHooks { @Accessor diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinBlock.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinBlock.java index 5fdd4cf9e..5e3ecc726 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinBlock.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinBlock.java @@ -16,13 +16,15 @@ package net.fabricmc.fabric.mixin.builders; -import net.fabricmc.fabric.api.event.registry.BlockConstructedCallback; -import net.minecraft.block.Block; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.block.Block; + +import net.fabricmc.fabric.api.event.registry.BlockConstructedCallback; + @Mixin(Block.class) public class MixinBlock { @Inject(method = "(Lnet/minecraft/block/Block$Settings;)V", at = @At("RETURN")) diff --git a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinItem.java b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinItem.java index 62aab26c9..165c09bad 100644 --- a/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinItem.java +++ b/fabric-object-builders-v0/src/main/java/net/fabricmc/fabric/mixin/builders/MixinItem.java @@ -16,13 +16,15 @@ package net.fabricmc.fabric.mixin.builders; -import net.fabricmc.fabric.api.event.registry.ItemConstructedCallback; -import net.minecraft.item.Item; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.item.Item; + +import net.fabricmc.fabric.api.event.registry.ItemConstructedCallback; + @Mixin(Item.class) public class MixinItem { @Inject(method = "(Lnet/minecraft/item/Item$Settings;)V", at = @At("RETURN")) diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/FabricSpriteProvider.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/FabricSpriteProvider.java index 5d6897886..bf788ae9b 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/FabricSpriteProvider.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/FabricSpriteProvider.java @@ -22,27 +22,27 @@ import net.minecraft.client.particle.SpriteProvider; import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; -/* +/** * FabricSpriteProvider. It does the same thing as vanilla's SpriteProvider, * but in a way that's accessible to mods, and that exposes the atlas as well. * - * Custom sprites registered using ParticleFactoryRegistry have the options + *

Custom sprites registered using ParticleFactoryRegistry have the options * to supply a particle factory which will recieve an instance of this * interface containing the sprites set loaded for their particle from the * active resourcepacks. * - * @see ParticleFactoryRegistry.register(type, constructor) - * @see ParticleFactoryRegistry.PendingParticleFactory + * @see ParticleFactoryRegistry#register(type, constructor) + * @see ParticleFactoryRegistry.PendingParticleFactory */ public interface FabricSpriteProvider extends SpriteProvider { /** * Returns the entire particles texture atlas. */ - public SpriteAtlasTexture getAtlas(); + SpriteAtlasTexture getAtlas(); /** * Gets the list of all sprites available for this particle to use. * This is defined in your resourcepack. */ - public List getSprites(); + List getSprites(); } diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/ParticleFactoryRegistry.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/ParticleFactoryRegistry.java index 9c5a58756..b0ba14146 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/ParticleFactoryRegistry.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/client/particle/v1/ParticleFactoryRegistry.java @@ -16,11 +16,13 @@ package net.fabricmc.fabric.api.client.particle.v1; -import net.fabricmc.fabric.impl.client.particle.ParticleFactoryRegistryImpl; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; +import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; +import net.fabricmc.fabric.impl.client.particle.ParticleFactoryRegistryImpl; + /** * Registry for adding particle factories on the client for * particle types created using FabricParticleTypes (or otherwise). @@ -28,23 +30,23 @@ import net.minecraft.particle.ParticleType; * @see FabricParticleTypes */ public interface ParticleFactoryRegistry { - public static ParticleFactoryRegistry getInstance() { + static ParticleFactoryRegistry getInstance() { return ParticleFactoryRegistryImpl.INSTANCE; } /** * Registers a factory for constructing particles of the given type. */ - public void register(ParticleType type, ParticleFactory factory); + void register(ParticleType type, ParticleFactory factory); /** * Registers a delayed factory for constructing particles of the given type. * - * The factory method will be called with a sprite provider to use for that particle when it comes time. + *

The factory method will be called with a sprite provider to use for that particle when it comes time. * - * Particle sprites will be loaded from domain:/particles/particle_name.json as per vanilla minecraft behaviour. + *

Particle sprites will be loaded from domain:/particles/particle_name.json as per vanilla minecraft behaviour. */ - public void register(ParticleType type, PendingParticleFactory constructor); + void register(ParticleType type, PendingParticleFactory constructor); /** * A pending particle factory. @@ -56,12 +58,12 @@ public interface ParticleFactoryRegistry { /** * Called to create a new particle factory. * - * Particle sprites will be loaded from domain:/particles/particle_name.json as per vanilla minecraft behaviour. + *

Particle sprites will be loaded from domain:/particles/particle_name.json as per vanilla minecraft behaviour. * * @param provider The sprite provider used to supply sprite textures when drawing the mod's particle. * * @return A new particle factory. */ - public ParticleFactory create(FabricSpriteProvider provider); + ParticleFactory create(FabricSpriteProvider provider); } } diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/particle/v1/FabricParticleTypes.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/particle/v1/FabricParticleTypes.java index ba0d211fd..271fb71cf 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/particle/v1/FabricParticleTypes.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/api/particle/v1/FabricParticleTypes.java @@ -23,16 +23,16 @@ import net.minecraft.particle.ParticleType; /** * Methods for creating particle types, both simple and using an existing attribute factory. * - * Usage: + *

Usage: + *

 {@code
+ * public static final DefaultParticleType SIMPLE_TEST_PARTICLE = FabricParticleTypes.simple();
+ * public static final DefaultParticleType CUSTOM_TEST_PARTICLE = FabricParticleTypes.simple();
  *
- *	public static final DefaultParticleType SIMPLE_TEST_PARTICLE = FabricParticleTypes.simple();
- *	public static final DefaultParticleType CUSTOM_TEST_PARTICLE = FabricParticleTypes.simple();
- *
- *	@Override
- *	public void onInitialize() {
- *		Registry.register(Registry.PARTICLE_TYPE, new Identifier("testmod", "simple"), SIMPLE_TEST_PARTICLE);
- *		Registry.register(Registry.PARTICLE_TYPE, new Identifier("testmod", "custom"), CUSTOM_TEST_PARTICLE);
- *	}
+ * @Override
+ * public void onInitialize() {
+ *     Registry.register(Registry.PARTICLE_TYPE, new Identifier("testmod", "simple"), SIMPLE_TEST_PARTICLE);
+ *     Registry.register(Registry.PARTICLE_TYPE, new Identifier("testmod", "custom"), CUSTOM_TEST_PARTICLE);
+ * }}
* * @see ParticleModClient in the fabric example mods for a more complete usage. */ @@ -55,7 +55,7 @@ public final class FabricParticleTypes { * @param alwaysSpawn True to always spawn the particle regardless of distance. */ public static DefaultParticleType simple(boolean alwaysSpawn) { - return new DefaultParticleType(alwaysSpawn) {}; + return new DefaultParticleType(alwaysSpawn) { }; } /** @@ -76,6 +76,6 @@ public final class FabricParticleTypes { * @param factory A factory for serializing packet data and string command parameters into a particle effect. */ public static ParticleType complex(boolean alwaysSpawn, ParticleEffect.Factory factory) { - return new ParticleType(alwaysSpawn, factory) {}; + return new ParticleType(alwaysSpawn, factory) { }; } } diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/FabricParticleManager.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/FabricParticleManager.java index 37b3f5f91..bad4dadf1 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/FabricParticleManager.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/FabricParticleManager.java @@ -25,10 +25,9 @@ import java.util.Random; import java.util.stream.Collectors; import com.google.common.collect.ImmutableList; - import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; + import net.minecraft.client.particle.ParticleTextureData; import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; @@ -36,6 +35,8 @@ import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; +import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; + public final class FabricParticleManager { private final VanillaParticleManager manager; @@ -50,8 +51,8 @@ public final class FabricParticleManager { ParticleFactoryRegistryImpl.INSTANCE.constructors.forEach((id, factory) -> { FabricSpriteProviderImpl provider = new FabricSpriteProviderImpl(); - providers.put((int)id, provider); - manager.getFactories().put((int)id, factory.create(provider)); + providers.put((int) id, provider); + manager.getFactories().put((int) id, factory.create(provider)); }); } @@ -60,7 +61,7 @@ public final class FabricParticleManager { return null; } - return providers.get((int)ParticleFactoryRegistryImpl.INSTANCE.constructorsIdsMap.get(id)); + return providers.get((int) ParticleFactoryRegistryImpl.INSTANCE.constructorsIdsMap.get(id)); } public boolean loadParticle(ResourceManager manager, Identifier id) { @@ -114,6 +115,7 @@ public final class FabricParticleManager { if (sprites == null) { sprites = spriteIds.stream().map(getAtlas()::getSprite).collect(Collectors.toList()); } + return sprites; } diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/ParticleFactoryRegistryImpl.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/ParticleFactoryRegistryImpl.java index 9c5e1383d..eabc58512 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/ParticleFactoryRegistryImpl.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/ParticleFactoryRegistryImpl.java @@ -21,13 +21,15 @@ import java.util.Map; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; + import net.minecraft.client.particle.ParticleFactory; import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleType; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; + public final class ParticleFactoryRegistryImpl implements ParticleFactoryRegistry { public static final ParticleFactoryRegistryImpl INSTANCE = new ParticleFactoryRegistryImpl(); diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/VanillaParticleManager.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/VanillaParticleManager.java index 88852bba8..174413d27 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/VanillaParticleManager.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/impl/client/particle/VanillaParticleManager.java @@ -17,17 +17,20 @@ package net.fabricmc.fabric.impl.client.particle; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.texture.SpriteAtlasTexture; /** * Accessors for some private members of ParticleManager. * - * Usage: - * SpriteAtlasTexture atlas = ((VanillaParticleManager)MinecraftClient.getInstance().particleManager).getAtlas() + *

Usage: + *

 {@code
+ * SpriteAtlasTexture atlas = ((VanillaParticleManager)MinecraftClient.getInstance().particleManager).getAtlas()
+ * }
*/ public interface VanillaParticleManager { - public SpriteAtlasTexture getAtlas(); + SpriteAtlasTexture getAtlas(); - public Int2ObjectMap> getFactories(); + Int2ObjectMap> getFactories(); } diff --git a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/mixin/client/particle/MixinParticleManager.java b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/mixin/client/particle/MixinParticleManager.java index 77eadddc3..9e063e983 100644 --- a/fabric-particles-v1/src/main/java/net/fabricmc/fabric/mixin/client/particle/MixinParticleManager.java +++ b/fabric-particles-v1/src/main/java/net/fabricmc/fabric/mixin/client/particle/MixinParticleManager.java @@ -19,21 +19,22 @@ package net.fabricmc.fabric.mixin.client.particle; import java.util.List; import java.util.Map; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.fabricmc.fabric.impl.client.particle.FabricParticleManager; -import net.fabricmc.fabric.impl.client.particle.VanillaParticleManager; import net.minecraft.client.particle.ParticleFactory; import net.minecraft.client.particle.ParticleManager; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.impl.client.particle.FabricParticleManager; +import net.fabricmc.fabric.impl.client.particle.VanillaParticleManager; + @Mixin(ParticleManager.class) public abstract class MixinParticleManager implements VanillaParticleManager { private final FabricParticleManager fabricParticleManager = new FabricParticleManager(this); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryAddedCallback.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryAddedCallback.java index 803d592d0..553cc19d3 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryAddedCallback.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryAddedCallback.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.api.event.registry; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.impl.registry.ListenableRegistry; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.impl.registry.ListenableRegistry; + @FunctionalInterface public interface RegistryEntryAddedCallback { void onEntryAdded(int rawId, Identifier id, T object); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryRemovedCallback.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryRemovedCallback.java index b7b631f27..cd87c802f 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryRemovedCallback.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryEntryRemovedCallback.java @@ -16,11 +16,12 @@ package net.fabricmc.fabric.api.event.registry; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.impl.registry.ListenableRegistry; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.impl.registry.ListenableRegistry; + @FunctionalInterface public interface RegistryEntryRemovedCallback { void onEntryRemoved(int rawId, Identifier id, T object); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryIdRemapCallback.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryIdRemapCallback.java index e9d5563dd..d285626a5 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryIdRemapCallback.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/RegistryIdRemapCallback.java @@ -17,22 +17,24 @@ package net.fabricmc.fabric.api.event.registry; import it.unimi.dsi.fastutil.ints.Int2IntMap; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.impl.registry.ListenableRegistry; + import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.impl.registry.ListenableRegistry; + /** * The remapping process functions as follows: * - * - RegistryEntryRemovedCallbacks are called to remove any objects culled in the process, with the old numeric ID. - * - RegistryIdRemapCallback is emitted to allow remapping the IDs of objects still present. - * - RegistryEntryAddedCallbacks are called to add any objects added in the process, with the new numeric ID. + *
  • RegistryEntryRemovedCallbacks are called to remove any objects culled in the process, with the old numeric ID. + *
  • RegistryIdRemapCallback is emitted to allow remapping the IDs of objects still present. + *
  • RegistryEntryAddedCallbacks are called to add any objects added in the process, with the new numeric ID.
* - * RegistryIdRemapCallback is called on every remapping operation, if you want to do your own processing in one swoop + *

RegistryIdRemapCallback is called on every remapping operation, if you want to do your own processing in one swoop * (say, rebuild the ID map from scratch). * - * Generally speaking, a remap can only cause object *removals*; object *additions* are necessary to reverse remaps. + *

Generally speaking, a remap can only cause object *removals*; object *additions* are necessary to reverse remaps. * * @param The registry type. */ @@ -52,6 +54,6 @@ public interface RegistryIdRemapCallback { } //noinspection unchecked - return (Event>) ((ListenableRegistry) registry).fabric_getRemapEvent(); + return ((ListenableRegistry) registry).fabric_getRemapEvent(); } } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/FabricRegistryClientInit.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/FabricRegistryClientInit.java index c76d6c220..d71d39d3b 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/FabricRegistryClientInit.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/FabricRegistryClientInit.java @@ -16,13 +16,15 @@ package net.fabricmc.fabric.impl.registry; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.text.LiteralText; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; public class FabricRegistryClientInit implements ClientModInitializer { private static final Logger LOGGER = LogManager.getLogger(); @@ -35,7 +37,7 @@ public class FabricRegistryClientInit implements ClientModInitializer { LOGGER.error("Registry remapping failed!", e); MinecraftClient.getInstance().execute(() -> { ((ClientPlayerEntity) ctx.getPlayer()).networkHandler.getConnection().disconnect( - new LiteralText("Registry remapping failed: " + e.getMessage()) + new LiteralText("Registry remapping failed: " + e.getMessage()) ); }); }); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/ListenableRegistry.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/ListenableRegistry.java index 89f3dc677..3af8cc484 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/ListenableRegistry.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/ListenableRegistry.java @@ -18,8 +18,8 @@ package net.fabricmc.fabric.impl.registry; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; -import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; public interface ListenableRegistry { Event> fabric_getAddObjectEvent(); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RegistrySyncManager.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RegistrySyncManager.java index 4b8439ba2..bab07dcac 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RegistrySyncManager.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RegistrySyncManager.java @@ -16,25 +16,6 @@ package net.fabricmc.fabric.impl.registry; -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; -import io.netty.buffer.Unpooled; -import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.ints.IntSet; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import net.fabricmc.fabric.api.network.PacketContext; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.Packet; -import net.minecraft.util.Identifier; -import net.minecraft.util.PacketByteBuf; -import net.minecraft.util.registry.MutableRegistry; -import net.minecraft.util.registry.Registry; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -45,6 +26,27 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Packet; +import net.minecraft.util.Identifier; +import net.minecraft.util.PacketByteBuf; +import net.minecraft.util.registry.MutableRegistry; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; + public final class RegistrySyncManager { static final boolean DEBUG = System.getProperty("fabric.registry.debug", "false").equalsIgnoreCase("true"); static final Identifier ID = new Identifier("fabric", "registry/sync"); @@ -53,9 +55,7 @@ public final class RegistrySyncManager { private static final Set REGISTRY_BLACKLIST = ImmutableSet.of(); private static final Set REGISTRY_BLACKLIST_NETWORK = ImmutableSet.of(); - private RegistrySyncManager() { - - } + private RegistrySyncManager() { } public static Packet createPacket() { PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); @@ -80,6 +80,7 @@ public final class RegistrySyncManager { } catch (RemapException e) { errorHandler.accept(e); } + return null; }).get(30, TimeUnit.SECONDS); } catch (ExecutionException | InterruptedException | TimeoutException e) { @@ -95,6 +96,7 @@ public final class RegistrySyncManager { if (DEBUG_WRITE_REGISTRY_DATA) { File location = new File(".fabric" + File.separatorChar + "debug" + File.separatorChar + "registry"); boolean c = true; + if (!location.exists()) { if (!location.mkdirs()) { LOGGER.warn("[fabric-registry-sync debug] Could not create " + location.getAbsolutePath() + " directory!"); @@ -103,10 +105,13 @@ public final class RegistrySyncManager { } MutableRegistry registry = Registry.REGISTRIES.get(registryId); + if (c && registry != null) { File file = new File(location, registryId.toString().replace(':', '.').replace('/', '.') + ".csv"); + try (FileOutputStream stream = new FileOutputStream(file)) { StringBuilder builder = new StringBuilder("Raw ID,String ID,Class Type\n"); + for (Object o : registry) { String classType = (o == null) ? "null" : o.getClass().getName(); //noinspection unchecked @@ -118,6 +123,7 @@ public final class RegistrySyncManager { String stringId = id.toString(); builder.append("\"").append(rawId).append("\",\"").append(stringId).append("\",\"").append(classType).append("\"\n"); } + stream.write(builder.toString().getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { LOGGER.warn("[fabric-registry-sync debug] Could not write to " + file.getAbsolutePath() + "!", e); @@ -132,6 +138,7 @@ public final class RegistrySyncManager { } MutableRegistry registry = Registry.REGISTRIES.get(registryId); + if (registry instanceof RemappableRegistry) { CompoundTag registryTag = new CompoundTag(); IntSet rawIdsFound = DEBUG ? new IntOpenHashSet() : null; @@ -186,6 +193,7 @@ public final class RegistrySyncManager { if (registry instanceof RemappableRegistry) { Object2IntMap idMap = new Object2IntOpenHashMap<>(); + for (String key : registryTag.getKeys()) { idMap.put(new Identifier(key), registryTag.getInt(key)); } @@ -202,6 +210,7 @@ public final class RegistrySyncManager { public static void unmap() throws RemapException { for (Identifier registryId : Registry.REGISTRIES.getIds()) { MutableRegistry registry = Registry.REGISTRIES.get(registryId); + if (registry instanceof RemappableRegistry) { ((RemappableRegistry) registry).unmap(registryId.toString()); } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemapStateImpl.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemapStateImpl.java index 825c3982d..84220ca52 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemapStateImpl.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemapStateImpl.java @@ -19,10 +19,12 @@ package net.fabricmc.fabric.impl.registry; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; + import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; + public class RemapStateImpl implements RegistryIdRemapCallback.RemapState { private final Int2IntMap rawIdChangeMap; private final Int2ObjectMap oldIdMap; diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemappableRegistry.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemappableRegistry.java index 18448e9e7..c3d41605c 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemappableRegistry.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/RemappableRegistry.java @@ -17,6 +17,7 @@ package net.fabricmc.fabric.impl.registry; import it.unimi.dsi.fastutil.objects.Object2IntMap; + import net.minecraft.util.Identifier; public interface RemappableRegistry { diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/IdListTracker.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/IdListTracker.java index 5459a6cfe..eba077928 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/IdListTracker.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/IdListTracker.java @@ -16,16 +16,17 @@ package net.fabricmc.fabric.impl.registry.trackers; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; -import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; -import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; -import net.fabricmc.fabric.impl.registry.RemovableIdList; +import java.util.HashMap; +import java.util.Map; + import net.minecraft.util.IdList; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; -import java.util.HashMap; -import java.util.Map; +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; +import net.fabricmc.fabric.impl.registry.RemovableIdList; public class IdListTracker implements RegistryEntryAddedCallback, RegistryIdRemapCallback, RegistryEntryRemovedCallback { private final String name; diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/Int2ObjectMapTracker.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/Int2ObjectMapTracker.java index 78ec9b4e0..2726235fa 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/Int2ObjectMapTracker.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/Int2ObjectMapTracker.java @@ -16,23 +16,25 @@ package net.fabricmc.fabric.impl.registry.trackers; -import com.google.common.base.Joiner; -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; -import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; -import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.google.common.base.Joiner; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; + public class Int2ObjectMapTracker implements RegistryEntryAddedCallback, RegistryIdRemapCallback, RegistryEntryRemovedCallback { private static final Logger LOGGER = LogManager.getLogger(); private final String name; @@ -65,8 +67,10 @@ public class Int2ObjectMapTracker implements RegistryEntryAddedCallback errors = null; mappers.clear(); + for (int i : oldMappers.keySet()) { int newI = remapMap.getOrDefault(i, Integer.MIN_VALUE); + if (newI >= 0) { if (mappers.containsKey(newI)) { if (errors == null) { @@ -91,6 +95,7 @@ public class Int2ObjectMapTracker implements RegistryEntryAddedCallback implements RegistryIdRemapCallback, RegistryEntryAddedCallback { private final Logger logger = LogManager.getLogger(); @@ -86,6 +88,7 @@ public final class StateIdTracker implements RegistryIdRemapCallback, R private void recalcHighestId() { currentHighestId = 0; + for (T object : registry) { currentHighestId = Math.max(currentHighestId, registry.getRawId(object)); } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BiomeParentTracker.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BiomeParentTracker.java index a6071fed6..abfd71c47 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BiomeParentTracker.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BiomeParentTracker.java @@ -16,16 +16,18 @@ package net.fabricmc.fabric.impl.registry.trackers.vanilla; +import java.util.Objects; + import it.unimi.dsi.fastutil.ints.Int2IntMap; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; -import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; -import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; -import net.fabricmc.fabric.impl.registry.RemovableIdList; + import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; -import java.util.Objects; +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; +import net.fabricmc.fabric.impl.registry.RemovableIdList; public final class BiomeParentTracker implements RegistryEntryAddedCallback, RegistryEntryRemovedCallback, RegistryIdRemapCallback { private final Registry registry; diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockInitTracker.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockInitTracker.java index c4bba0f79..51f44045f 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockInitTracker.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockInitTracker.java @@ -16,12 +16,13 @@ package net.fabricmc.fabric.impl.registry.trackers.vanilla; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; + public final class BlockInitTracker implements RegistryEntryAddedCallback { private final Registry registry; diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockItemTracker.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockItemTracker.java index 4c13a1e56..63dd4bb26 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockItemTracker.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/impl/registry/trackers/vanilla/BlockItemTracker.java @@ -16,16 +16,15 @@ package net.fabricmc.fabric.impl.registry.trackers.vanilla; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; -public final class BlockItemTracker implements RegistryEntryAddedCallback { - private BlockItemTracker() { +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; - } +public final class BlockItemTracker implements RegistryEntryAddedCallback { + private BlockItemTracker() { } public static void register(Registry registry) { BlockItemTracker tracker = new BlockItemTracker(); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinBootstrap.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinBootstrap.java index 5cad09f6c..ee85f29a8 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinBootstrap.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinBootstrap.java @@ -16,10 +16,11 @@ package net.fabricmc.fabric.mixin.registry; -import net.fabricmc.fabric.impl.registry.trackers.*; -import net.fabricmc.fabric.impl.registry.trackers.vanilla.BiomeParentTracker; -import net.fabricmc.fabric.impl.registry.trackers.vanilla.BlockInitTracker; -import net.fabricmc.fabric.impl.registry.trackers.vanilla.BlockItemTracker; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import net.minecraft.Bootstrap; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -28,10 +29,11 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.Items; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biomes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.fabricmc.fabric.impl.registry.trackers.StateIdTracker; +import net.fabricmc.fabric.impl.registry.trackers.vanilla.BiomeParentTracker; +import net.fabricmc.fabric.impl.registry.trackers.vanilla.BlockInitTracker; +import net.fabricmc.fabric.impl.registry.trackers.vanilla.BlockItemTracker; @Mixin(Bootstrap.class) public class MixinBootstrap { diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java index 1ef43a18c..e2bd8f971 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.mixin.registry; +import java.util.ArrayList; +import java.util.IdentityHashMap; +import java.util.List; + import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntMaps; -import net.fabricmc.fabric.impl.registry.RemovableIdList; -import net.minecraft.util.IdList; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import java.util.ArrayList; -import java.util.IdentityHashMap; -import java.util.List; +import net.minecraft.util.IdList; + +import net.fabricmc.fabric.impl.registry.RemovableIdList; @Mixin(IdList.class) public class MixinIdList implements RemovableIdList { @@ -48,6 +50,7 @@ public class MixinIdList implements RemovableIdList { private void fabric_removeInner(Object o) { int value = idMap.remove(o); list.set(value, null); + while (nextId > 1 && list.get(nextId - 1) == null) { nextId--; } @@ -66,6 +69,7 @@ public class MixinIdList implements RemovableIdList { for (Object o : idMap.keySet()) { int j = idMap.get(o); + if (i == j) { removals.add(o); } @@ -91,6 +95,7 @@ public class MixinIdList implements RemovableIdList { for (int k = 0; k < oldList.size(); k++) { Object o = oldList.get(k); + if (o != null) { int i = map.getOrDefault(k, k); @@ -99,6 +104,7 @@ public class MixinIdList implements RemovableIdList { } list.set(i, o); + if (nextId <= i) { nextId = i + 1; } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java index d2a2f7a56..712d74f1f 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java @@ -16,23 +16,20 @@ package net.fabricmc.fabric.mixin.registry; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import it.unimi.dsi.fastutil.ints.*; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; -import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; -import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; -import net.fabricmc.fabric.impl.registry.ListenableRegistry; -import net.fabricmc.fabric.impl.registry.RemapStateImpl; -import net.fabricmc.fabric.impl.registry.RemapException; -import net.fabricmc.fabric.impl.registry.RemappableRegistry; -import net.minecraft.util.Identifier; -import net.minecraft.util.Int2ObjectBiMap; -import net.minecraft.util.registry.SimpleRegistry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -42,7 +39,19 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.*; +import net.minecraft.util.Identifier; +import net.minecraft.util.Int2ObjectBiMap; +import net.minecraft.util.registry.SimpleRegistry; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryEntryRemovedCallback; +import net.fabricmc.fabric.api.event.registry.RegistryIdRemapCallback; +import net.fabricmc.fabric.impl.registry.ListenableRegistry; +import net.fabricmc.fabric.impl.registry.RemapException; +import net.fabricmc.fabric.impl.registry.RemapStateImpl; +import net.fabricmc.fabric.impl.registry.RemappableRegistry; @Mixin(SimpleRegistry.class) public abstract class MixinIdRegistry implements RemappableRegistry, ListenableRegistry { @@ -57,32 +66,32 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab @Unique private final Event fabric_addObjectEvent = EventFactory.createArrayBacked(RegistryEntryAddedCallback.class, - (callbacks) -> (rawId, id, object) -> { - for (RegistryEntryAddedCallback callback : callbacks) { - //noinspection unchecked - callback.onEntryAdded(rawId, id, object); + (callbacks) -> (rawId, id, object) -> { + for (RegistryEntryAddedCallback callback : callbacks) { + //noinspection unchecked + callback.onEntryAdded(rawId, id, object); + } } - } ); @Unique private final Event fabric_removeObjectEvent = EventFactory.createArrayBacked(RegistryEntryRemovedCallback.class, - (callbacks) -> (rawId, id, object) -> { - for (RegistryEntryRemovedCallback callback : callbacks) { - //noinspection unchecked - callback.onEntryRemoved(rawId, id, object); + (callbacks) -> (rawId, id, object) -> { + for (RegistryEntryRemovedCallback callback : callbacks) { + //noinspection unchecked + callback.onEntryRemoved(rawId, id, object); + } } - } ); @Unique private final Event fabric_postRemapEvent = EventFactory.createArrayBacked(RegistryIdRemapCallback.class, - (callbacks) -> (a) -> { - for (RegistryIdRemapCallback callback : callbacks) { - //noinspection unchecked - callback.onRemap(a); + (callbacks) -> (a) -> { + for (RegistryIdRemapCallback callback : callbacks) { + //noinspection unchecked + callback.onRemap(a); + } } - } ); @Unique @@ -93,19 +102,19 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab @Override public Event> fabric_getAddObjectEvent() { //noinspection unchecked - return (Event>) (Event) fabric_addObjectEvent; + return (Event) fabric_addObjectEvent; } @Override public Event> fabric_getRemoveObjectEvent() { //noinspection unchecked - return (Event>) (Event) fabric_removeObjectEvent; + return (Event) fabric_removeObjectEvent; } @Override public Event> fabric_getRemapEvent() { //noinspection unchecked - return (Event>) (Event) fabric_postRemapEvent; + return (Event) fabric_postRemapEvent; } // The rest of the registry isn't thread-safe, so this one need not be either. @@ -116,6 +125,7 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab @Inject(method = "set", at = @At("HEAD")) public void setPre(int id, Identifier identifier, Object object, CallbackInfoReturnable info) { int indexedEntriesId = indexedEntries.getId((T) object); + if (indexedEntriesId >= 0) { throw new RuntimeException("Attempted to register object " + object + " twice! (at raw IDs " + indexedEntriesId + " and " + id + " )"); } @@ -124,8 +134,10 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab fabric_isObjectNew = true; } else { T oldObject = entries.get(identifier); + if (oldObject != null && oldObject != object) { int oldId = indexedEntries.getId(oldObject); + if (oldId != id) { throw new RuntimeException("Attempted to register ID " + identifier + " at different raw IDs (" + oldId + ", " + id + ")! If you're trying to override an item, use .set(), not .register()!"); } @@ -153,50 +165,60 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab // Throw on invalid conditions. switch (mode) { - case AUTHORITATIVE: - break; - case REMOTE: { - List strings = null; + case AUTHORITATIVE: + break; + case REMOTE: { + List strings = null; + + for (Identifier remoteId : remoteIndexedEntries.keySet()) { + if (!entries.keySet().contains(remoteId)) { + if (strings == null) { + strings = new ArrayList<>(); + } + + strings.add(" - " + remoteId); + } + } + + if (strings != null) { + StringBuilder builder = new StringBuilder("Received ID map for " + name + " contains IDs unknown to the receiver!"); + + for (String s : strings) { + builder.append('\n').append(s); + } + + throw new RemapException(builder.toString()); + } + + break; + } + case EXACT: { + if (!entries.keySet().equals(remoteIndexedEntries.keySet())) { + List strings = new ArrayList<>(); + for (Identifier remoteId : remoteIndexedEntries.keySet()) { if (!entries.keySet().contains(remoteId)) { - if (strings == null) { - strings = new ArrayList<>(); - } - - strings.add(" - " + remoteId); + strings.add(" - " + remoteId + " (missing on local)"); } } - if (strings != null) { - StringBuilder builder = new StringBuilder("Received ID map for " + name + " contains IDs unknown to the receiver!"); - for (String s : strings) { - builder.append('\n').append(s); + for (Identifier localId : registry.getIds()) { + if (!remoteIndexedEntries.keySet().contains(localId)) { + strings.add(" - " + localId + " (missing on remote)"); } - throw new RemapException(builder.toString()); } - } break; - case EXACT: { - if (!entries.keySet().equals(remoteIndexedEntries.keySet())) { - List strings = new ArrayList<>(); - for (Identifier remoteId : remoteIndexedEntries.keySet()) { - if (!entries.keySet().contains(remoteId)) { - strings.add(" - " + remoteId + " (missing on local)"); - } - } - for (Identifier localId : registry.getIds()) { - if (!remoteIndexedEntries.keySet().contains(localId)) { - strings.add(" - " + localId + " (missing on remote)"); - } - } + StringBuilder builder = new StringBuilder("Local and remote ID sets for " + name + " do not match!"); - StringBuilder builder = new StringBuilder("Local and remote ID sets for " + name + " do not match!"); - for (String s : strings) { - builder.append('\n').append(s); - } - throw new RemapException(builder.toString()); + for (String s : strings) { + builder.append('\n').append(s); } - } break; + + throw new RemapException(builder.toString()); + } + + break; + } } // Make a copy of the previous maps. @@ -208,12 +230,14 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab if (fabric_prevIndexedEntries == null) { fabric_prevIndexedEntries = new Object2IntOpenHashMap<>(); fabric_prevEntries = HashBiMap.create(entries); + for (Object o : registry) { fabric_prevIndexedEntries.put(registry.getId(o), registry.getRawId(o)); } } Int2ObjectMap oldIdMap = new Int2ObjectOpenHashMap<>(); + for (Object o : registry) { oldIdMap.put(registry.getRawId(o), registry.getId(o)); } @@ -221,47 +245,53 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab // If we're AUTHORITATIVE, we append entries which only exist on the // local side to the new entry list. For REMOTE, we instead drop them. switch (mode) { - case AUTHORITATIVE: { - int maxValue = 0; + case AUTHORITATIVE: { + int maxValue = 0; - Object2IntMap oldRemoteIndexedEntries = remoteIndexedEntries; - remoteIndexedEntries = new Object2IntOpenHashMap<>(); - for (Identifier id : oldRemoteIndexedEntries.keySet()) { - int v = oldRemoteIndexedEntries.getInt(id); - remoteIndexedEntries.put(id, v); - if (v > maxValue) maxValue = v; + Object2IntMap oldRemoteIndexedEntries = remoteIndexedEntries; + remoteIndexedEntries = new Object2IntOpenHashMap<>(); + + for (Identifier id : oldRemoteIndexedEntries.keySet()) { + int v = oldRemoteIndexedEntries.getInt(id); + remoteIndexedEntries.put(id, v); + if (v > maxValue) maxValue = v; + } + + for (Identifier id : registry.getIds()) { + if (!remoteIndexedEntries.containsKey(id)) { + FABRIC_LOGGER.warn("Adding " + id + " to saved/remote registry."); + remoteIndexedEntries.put(id, ++maxValue); } + } - for (Identifier id : registry.getIds()) { - if (!remoteIndexedEntries.containsKey(id)) { - FABRIC_LOGGER.warn("Adding " + id + " to saved/remote registry."); - remoteIndexedEntries.put(id, ++maxValue); - } + break; + } + case REMOTE: { + // TODO: Is this what mods really want? + Set droppedIds = new HashSet<>(); + + for (Identifier id : registry.getIds()) { + if (!remoteIndexedEntries.containsKey(id)) { + Object object = registry.get(id); + int rid = registry.getRawId(object); + + droppedIds.add(id); + + // Emit RemoveObject events for removed objects. + //noinspection unchecked + fabric_getRemoveObjectEvent().invoker().onEntryRemoved(rid, id, (T) object); } - } break; - case REMOTE: { - // TODO: Is this what mods really want? - Set droppedIds = new HashSet<>(); + } - for (Identifier id : registry.getIds()) { - if (!remoteIndexedEntries.containsKey(id)) { - Object object = registry.get(id); - int rid = registry.getRawId(object); + // note: indexedEntries cannot be safely remove()d from + entries.keySet().removeAll(droppedIds); - droppedIds.add(id); - - // Emit RemoveObject events for removed objects. - //noinspection unchecked - fabric_getRemoveObjectEvent().invoker().onEntryRemoved(rid, id, (T) object); - } - } - - // note: indexedEntries cannot be safely remove()d from - entries.keySet().removeAll(droppedIds); - } break; + break; + } } Int2IntMap idMap = new Int2IntOpenHashMap(); + for (Object o : indexedEntries) { Identifier id = registry.getId(o); int rid = registry.getRawId(o); @@ -292,11 +322,13 @@ public abstract class MixinIdRegistry implements RemappableRegistry, Listenab } else { FABRIC_LOGGER.warn(identifier + " missing from registry, but requested!"); } + continue; } // Add the new object, increment nextId to match. indexedEntries.put(object, id); + if (nextId <= id) { nextId = id + 1; } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinPlayerManager.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinPlayerManager.java index 5d6a1e6b1..d8aa3a282 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinPlayerManager.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinPlayerManager.java @@ -16,15 +16,17 @@ package net.fabricmc.fabric.mixin.registry; -import net.fabricmc.fabric.impl.registry.RegistrySyncManager; -import net.minecraft.network.ClientConnection; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.network.ClientConnection; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; + +import net.fabricmc.fabric.impl.registry.RegistrySyncManager; + @Mixin(PlayerManager.class) public abstract class MixinPlayerManager { @Inject(method = "onPlayerConnect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/packet/DifficultyS2CPacket;(Lnet/minecraft/world/Difficulty;Z)V")) diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java index 4db8b8669..393157ad5 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java @@ -16,13 +16,12 @@ package net.fabricmc.fabric.mixin.registry; -import net.fabricmc.fabric.impl.registry.RegistrySyncManager; -import net.fabricmc.fabric.impl.registry.RemapException; -import net.fabricmc.fabric.impl.registry.RemappableRegistry; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.world.WorldSaveHandler; -import net.minecraft.world.level.LevelProperties; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -33,7 +32,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.io.*; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.world.WorldSaveHandler; +import net.minecraft.world.level.LevelProperties; + +import net.fabricmc.fabric.impl.registry.RegistrySyncManager; +import net.fabricmc.fabric.impl.registry.RemapException; +import net.fabricmc.fabric.impl.registry.RemappableRegistry; @Mixin(WorldSaveHandler.class) public class MixinWorldSaveHandler { @@ -53,6 +59,7 @@ public class MixinWorldSaveHandler { FileInputStream fileInputStream = new FileInputStream(file); CompoundTag tag = NbtIo.readCompressed(fileInputStream); fileInputStream.close(); + if (tag != null) { RegistrySyncManager.apply(tag, RemappableRegistry.RemapMode.AUTHORITATIVE); return true; @@ -70,9 +77,11 @@ public class MixinWorldSaveHandler { @Unique private void fabric_saveRegistryData() { CompoundTag newIdMap = RegistrySyncManager.toTag(false); + if (!newIdMap.equals(fabric_lastSavedIdMap)) { for (int i = FABRIC_ID_REGISTRY_BACKUPS - 1; i >= 0; i--) { File file = fabric_getWorldIdMapFile(i); + if (file.exists()) { if (i == FABRIC_ID_REGISTRY_BACKUPS - 1) { file.delete(); @@ -86,6 +95,7 @@ public class MixinWorldSaveHandler { try { File file = fabric_getWorldIdMapFile(0); File parentFile = file.getParentFile(); + if (!parentFile.exists()) { if (!parentFile.mkdirs()) { FABRIC_LOGGER.warn("[fabric-registry-sync] Could not create directory " + parentFile + "!"); @@ -118,6 +128,7 @@ public class MixinWorldSaveHandler { // Load for (int i = 0; i < FABRIC_ID_REGISTRY_BACKUPS; i++) { FABRIC_LOGGER.trace("[fabric-registry-sync] Loading Fabric registry [file " + (i + 1) + "/" + (FABRIC_ID_REGISTRY_BACKUPS + 1) + "]"); + try { if (fabric_readIdMapFile(fabric_getWorldIdMapFile(i))) { FABRIC_LOGGER.info("[fabric-registry-sync] Loaded registry data [file " + (i + 1) + "/" + (FABRIC_ID_REGISTRY_BACKUPS + 1) + "]"); diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinBlockColorMap.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinBlockColorMap.java index ea4610da9..04f1e0285 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinBlockColorMap.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinBlockColorMap.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.mixin.registry.client; -import net.fabricmc.fabric.impl.registry.trackers.IdListTracker; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.util.IdList; -import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.util.IdList; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.impl.registry.trackers.IdListTracker; + @Mixin(BlockColors.class) public class MixinBlockColorMap { @Shadow diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemColorMap.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemColorMap.java index 05009a32d..451d5d769 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemColorMap.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemColorMap.java @@ -16,17 +16,19 @@ package net.fabricmc.fabric.mixin.registry.client; -import net.fabricmc.fabric.impl.registry.trackers.IdListTracker; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.client.color.item.ItemColors; -import net.minecraft.util.IdList; -import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.client.color.item.ItemColors; +import net.minecraft.util.IdList; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.impl.registry.trackers.IdListTracker; + @Mixin(ItemColors.class) public class MixinItemColorMap { @Shadow diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemModelMap.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemModelMap.java index 5a0996ab4..814a5125d 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemModelMap.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinItemModelMap.java @@ -17,18 +17,20 @@ package net.fabricmc.fabric.mixin.registry.client; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.fabricmc.fabric.impl.registry.trackers.Int2ObjectMapTracker; -import net.minecraft.client.render.item.ItemModels; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedModelManager; -import net.minecraft.client.util.ModelIdentifier; -import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.render.item.ItemModels; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedModelManager; +import net.minecraft.client.util.ModelIdentifier; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.impl.registry.trackers.Int2ObjectMapTracker; + @Mixin(ItemModels.class) public class MixinItemModelMap { @Shadow diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinMinecraftClient.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinMinecraftClient.java index 411d0088e..b62b17d3c 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinMinecraftClient.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinMinecraftClient.java @@ -16,10 +16,6 @@ package net.fabricmc.fabric.mixin.registry.client; -import net.fabricmc.fabric.impl.registry.RegistrySyncManager; -import net.fabricmc.fabric.impl.registry.RemapException; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -28,6 +24,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; + +import net.fabricmc.fabric.impl.registry.RegistrySyncManager; +import net.fabricmc.fabric.impl.registry.RemapException; + @Mixin(MinecraftClient.class) public class MixinMinecraftClient { @Unique diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinParticleManager.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinParticleManager.java index b68347ebe..5480b0d83 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinParticleManager.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/client/MixinParticleManager.java @@ -17,18 +17,20 @@ package net.fabricmc.fabric.mixin.registry.client; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.fabricmc.fabric.impl.registry.trackers.Int2ObjectMapTracker; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.texture.TextureManager; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; + +import net.fabricmc.fabric.impl.registry.trackers.Int2ObjectMapTracker; + @Mixin(ParticleManager.class) public class MixinParticleManager { @Shadow diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/Renderer.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/Renderer.java index dac24072e..da3b8749e 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/Renderer.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/Renderer.java @@ -16,31 +16,32 @@ package net.fabricmc.fabric.api.renderer.v1; +import net.minecraft.util.Identifier; + import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; -import net.minecraft.util.Identifier; /** * Interface for rendering plug-ins that provide enhanced capabilities * for model lighting, buffering and rendering. Such plug-ins implement the - * enhanced model rendering interfaces specified by the Fabric API.

+ * enhanced model rendering interfaces specified by the Fabric API. */ public interface Renderer { /** - * Obtain a new {@link MeshBuilder} instance used to create - * baked models with enhanced features.

- * - * Renderer does not retain a reference to returned instances and they should be re-used for + * Obtain a new {@link MeshBuilder} instance used to create + * baked models with enhanced features. + * + *

Renderer does not retain a reference to returned instances and they should be re-used for * multiple models when possible to avoid memory allocation overhead. */ MeshBuilder meshBuilder(); /** * Obtain a new {@link MaterialFinder} instance used to retrieve - * standard {@link RenderMaterial} instances.

- * - * Renderer does not retain a reference to returned instances and they should be re-used for + * standard {@link RenderMaterial} instances. + * + *

Renderer does not retain a reference to returned instances and they should be re-used for * multiple materials when possible to avoid memory allocation overhead. */ MaterialFinder materialFinder(); @@ -53,10 +54,10 @@ public interface Renderer { /** * Register a material for re-use by other mods or models within a mod. - * The registry does not persist registrations - mods must create and register - * all materials at game initialization.

- * - * Returns false if a material with the given identifier is already present, + * The registry does not persist registrations - mods must create and register + * all materials at game initialization. + * + *

Returns false if a material with the given identifier is already present, * leaving the existing material intact. */ boolean registerMaterial(Identifier id, RenderMaterial material); diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/RendererAccess.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/RendererAccess.java index da1cc2232..565b6db4a 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/RendererAccess.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/RendererAccess.java @@ -25,22 +25,22 @@ public interface RendererAccess { RendererAccess INSTANCE = RendererAccessImpl.INSTANCE; /** - * Rendering extension mods must implement {@link Renderer} and - * call this method during initialization.

- * - * Only one {@link Renderer} plug-in can be active in any game instance. + * Rendering extension mods must implement {@link Renderer} and + * call this method during initialization. + * + *

Only one {@link Renderer} plug-in can be active in any game instance. * If a second mod attempts to register this method will throw an UnsupportedOperationException. */ void registerRenderer(Renderer plugin); /** - * Access to the current {@link Renderer} for creating and retrieving model builders + * Access to the current {@link Renderer} for creating and retrieving model builders * and materials. Will return null if no render plug in is active. */ Renderer getRenderer(); /** - * Performant test for {@link #getRenderer()} != null; + * Performant test for {@link #getRenderer()} != null. */ boolean hasRenderer(); } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java index b04791e67..4e71ddc53 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java @@ -52,7 +52,7 @@ public enum BlendMode { public final RenderLayer blockRenderLayer; - private BlendMode(RenderLayer blockRenderLayer) { + BlendMode(RenderLayer blockRenderLayer) { this.blockRenderLayer = blockRenderLayer; } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/MaterialFinder.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/MaterialFinder.java index b2e24bc71..bd9808e11 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/MaterialFinder.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/MaterialFinder.java @@ -16,24 +16,25 @@ package net.fabricmc.fabric.api.renderer.v1.material; +import net.minecraft.client.render.RenderLayer; + import net.fabricmc.fabric.api.renderer.v1.Renderer; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.minecraft.client.render.RenderLayer; /** * Finds standard {@link RenderMaterial} instances used to communicate - * quad rendering characteristics to a {@link RenderContext}.

+ * quad rendering characteristics to a {@link RenderContext}. * - * Must be obtained via {@link Renderer#materialFinder()}. + *

Must be obtained via {@link Renderer#materialFinder()}. */ public interface MaterialFinder { /** * Returns the standard material encoding all * of the current settings in this finder. The settings in - * this finder are not changed.

- * - * Resulting instances can and should be re-used to prevent + * this finder are not changed. + * + *

Resulting instances can and should be re-used to prevent * needless memory allocation. {@link Renderer} implementations * may or may not cache standard material instances. */ @@ -46,7 +47,6 @@ public interface MaterialFinder { MaterialFinder clear(); /** - * * Reserved for future use. Behavior for values > 1 is currently undefined. */ MaterialFinder spriteDepth(int depth); @@ -54,14 +54,14 @@ public interface MaterialFinder { /** * Defines how sprite pixels will be blended with the scene. * Accepts {link @BlockRenderLayer} values and blending behavior - * will emulate the way that Minecraft renders those instances. This does + * will emulate the way that Minecraft renders those instances. This does * NOT mean the sprite will be rendered in a specific render pass - some - * implementations may not use the standard vanilla render passes.

- * - * CAN be null and is null by default. A null value means the renderer + * implementations may not use the standard vanilla render passes. + * + *

CAN be null and is null by default. A null value means the renderer * will use the value normally associated with the block being rendered, or * {@code TRANSLUCENT} for item renders. (Normal Minecraft rendering) - * + * * @deprecated Use {@code BlendMode} version instead. */ @Deprecated @@ -70,14 +70,14 @@ public interface MaterialFinder { } /** - * Defines how sprite pixels will be blended with the scene.

- * - * See {@link BlendMode} for more information. + * Defines how sprite pixels will be blended with the scene. + * + *

See {@link BlendMode} for more information. */ MaterialFinder blendMode(int spriteIndex, BlendMode blendMode); /** - * Vertex color(s) will be modified for quad color index unless disabled.

+ * Vertex color(s) will be modified for quad color index unless disabled. */ MaterialFinder disableColorIndex(int spriteIndex, boolean disable); @@ -94,13 +94,13 @@ public interface MaterialFinder { /** * When true, sprite texture and color will be rendered at full brightness. * Lightmap values provided via {@link QuadEmitter#lightmap(int)} will be ignored. - * False by default

- * - * This is the preferred method for emissive lighting effects. Some renderers + * False by default + * + *

This is the preferred method for emissive lighting effects. Some renderers * with advanced lighting models may not use block lightmaps and this method will - * allow per-sprite emissive lighting in future extensions that support overlay sprites.

- * - * Note that color will still be modified by diffuse shading and ambient occlusion, + * allow per-sprite emissive lighting in future extensions that support overlay sprites. + * + *

Note that color will still be modified by diffuse shading and ambient occlusion, * unless disabled via {@link #disableAo(int, boolean)} and {@link #disableDiffuse(int, boolean)}. */ MaterialFinder emissive(int spriteIndex, boolean isEmissive); diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/RenderMaterial.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/RenderMaterial.java index 298f83f91..33cde63dc 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/RenderMaterial.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/RenderMaterial.java @@ -16,65 +16,66 @@ package net.fabricmc.fabric.api.renderer.v1.material; -import net.fabricmc.fabric.api.renderer.v1.Renderer; -import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.minecraft.block.Block; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; + /** * All model quads have an associated render material governing - * how the quad will be rendered.

- * - * A material instance is always immutable and thread-safe. References to a material - * remain valid until the end of the current game session.

- * - * Materials can be registered and shared between mods using {@link Renderer#registerMaterial(net.minecraft.util.Identifier, RenderMaterial)}. - * The registering mod is responsible for creating each registered material at startup.

- * - * Materials are not required to know their registration identity, and two materials - * with the same attributes may or may not satisfy equality and identity tests. Model + * how the quad will be rendered. + * + *

A material instance is always immutable and thread-safe. References to a material + * remain valid until the end of the current game session. + * + *

Materials can be registered and shared between mods using {@link Renderer#registerMaterial(net.minecraft.util.Identifier, RenderMaterial)}. + * The registering mod is responsible for creating each registered material at startup. + * + *

Materials are not required to know their registration identity, and two materials + * with the same attributes may or may not satisfy equality and identity tests. Model * implementations should never attempt to analyze materials or implement control logic based on them. - * They are only tokens for communicating quad attributes to the ModelRenderer.

- * - * There are three classes of materials...

- * - * STANDARD MATERIALS

- * - * Standard materials have "normal" rendering with control over lighting, + * They are only tokens for communicating quad attributes to the ModelRenderer. + * + *

There are three classes of materials... + * + *

STANDARD MATERIALS + * + *

Standard materials have "normal" rendering with control over lighting, * color, and texture blending. In the default renderer, "normal" rendering - * emulates unmodified Minecraft. Other renderers may offer a different aesthetic.

- * - * The number of standard materials is finite, but not necessarily small. - * To find a standard material, use {@link Renderer#materialFinder()}.

- * - * All renderer implementations should support standard materials.

- * - * SPECIAL MATERIALS

- * - * Special materials are implemented directly by the Renderer implementation, typically + * emulates unmodified Minecraft. Other renderers may offer a different aesthetic. + * + *

The number of standard materials is finite, but not necessarily small. + * To find a standard material, use {@link Renderer#materialFinder()}. + * + *

All renderer implementations should support standard materials. + * + *

SPECIAL MATERIALS + * + *

Special materials are implemented directly by the Renderer implementation, typically * with the aim of providing advanced/extended features. Such materials may offer additional - * vertex attributes via extensions to {@link MeshBuilder} and {@link MutableQuadView}.

- * - * Special materials can be obtained using {@link Renderer#materialById(Identifier)} - * with a known identifier. Renderers may provide other means of access. Popular - * special materials could be implemented by multiple renderers, however there is + * vertex attributes via extensions to {@link MeshBuilder} and {@link MutableQuadView}. + * + *

Special materials can be obtained using {@link Renderer#materialById(Identifier)} + * with a known identifier. Renderers may provide other means of access. Popular + * special materials could be implemented by multiple renderers, however there is * no requirement that special materials be cross-compatible. */ public interface RenderMaterial { /** * This will be identical to the material that would be obtained by calling {@link MaterialFinder#find()} * on a new, unaltered, {@link MaterialFinder} instance. It is defined here for clarity and convenience. - * - * Quads using this material use {@link Block#getRenderLayer()} of the associated block to determine texture blending, - * honor block color index, are non-emissive, and apply both diffuse and ambient occlusion shading to vertex colors.

- * - * All standard, non-fluid baked models are rendered using this material. + * + *

Quads using this material use {@link Block#getRenderLayer()} of the associated block to determine texture blending, + * honor block color index, are non-emissive, and apply both diffuse and ambient occlusion shading to vertex colors. + * + *

All standard, non-fluid baked models are rendered using this material. */ Identifier MATERIAL_STANDARD = new Identifier("fabric", "standard"); /** - * How many sprite color/uv coordinates are in the material. + * How many sprite color/uv coordinates are in the material. * Behavior for values > 1 is currently undefined. * See {@link MaterialFinder#spriteDepth(int)} */ diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/Mesh.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/Mesh.java index f65bd0d0c..a57cd293f 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/Mesh.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/Mesh.java @@ -22,13 +22,13 @@ import net.fabricmc.fabric.api.renderer.v1.Renderer; /** * A bundle of one or more {@link QuadView} instances encoded by the renderer, - * typically via {@link Renderer#meshBuilder()}.

- * - * Similar in purpose to the {@code List} instances returned by BakedModel, but + * typically via {@link Renderer#meshBuilder()}. + * + *

Similar in purpose to the {@code List} instances returned by BakedModel, but * affords the renderer the ability to optimize the format for performance - * and memory allocation.

- * - * Only the renderer should implement or extend this interface. + * and memory allocation. + * + *

Only the renderer should implement or extend this interface. */ public interface Mesh { /** @@ -36,5 +36,5 @@ public interface Mesh { * sent to the consumer will likely be threadlocal/reused and should never * be retained by the consumer. */ - public void forEach(Consumer consumer); + void forEach(Consumer consumer); } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MeshBuilder.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MeshBuilder.java index 3360686ef..775042de4 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MeshBuilder.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MeshBuilder.java @@ -21,14 +21,14 @@ import net.minecraft.client.render.BufferBuilder; /** * Similar in purpose to {@link BufferBuilder} but simpler * and not tied to NIO or any other specific implementation, - * plus designed to handle both static and dynamic building.

- * - * Decouples models from the vertex format(s) used by - * ModelRenderer to allow compatibility across diverse implementations.

+ * plus designed to handle both static and dynamic building. + * + *

Decouples models from the vertex format(s) used by + * ModelRenderer to allow compatibility across diverse implementations. */ public interface MeshBuilder { /** - * Returns the {@link QuadEmitter} used to append quad to this mesh. + * Returns the {@link QuadEmitter} used to append quad to this mesh. * Calling this method a second time invalidates any prior result. * Do not retain references outside the context of building the mesh. */ @@ -36,7 +36,7 @@ public interface MeshBuilder { /** * Returns a new {@link Mesh} instance containing all - * quads added to this builder and resets the builder to an empty state

+ * quads added to this builder and resets the builder to an empty state. */ Mesh build(); } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MutableQuadView.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MutableQuadView.java index e529299d5..7edef604f 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MutableQuadView.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/MutableQuadView.java @@ -16,22 +16,23 @@ package net.fabricmc.fabric.api.renderer.v1.mesh; -import net.fabricmc.fabric.api.renderer.v1.Renderer; -import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; -import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; + /** - * A mutable {@link QuadView} instance. The base interface for - * {@link QuadEmitter} and for dynamic renders/mesh transforms.

- * - * Instances of {@link MutableQuadView} will practically always be - * threadlocal and/or reused - do not retain references.

- * - * Only the renderer should implement or extend this interface. + * A mutable {@link QuadView} instance. The base interface for + * {@link QuadEmitter} and for dynamic renders/mesh transforms. + * + *

Instances of {@link MutableQuadView} will practically always be + * threadlocal and/or reused - do not retain references. + * + *

Only the renderer should implement or extend this interface. */ public interface MutableQuadView extends QuadView { /** @@ -61,17 +62,17 @@ public interface MutableQuadView extends QuadView { /** * When enabled, texture coordinate are assigned based on vertex position. * Any existing uv coordinates will be replaced. - * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}.

- * - * UV lock always derives texture coordinates based on nominal face, even + * Pass in bakeFlags parameter to {@link #spriteBake(int, Sprite, int)}. + * + *

UV lock always derives texture coordinates based on nominal face, even * when the quad is not co-planar with that face, and the result is * the same as if the quad were projected onto the nominal face, which - * is usually the desired result.

+ * is usually the desired result. */ int BAKE_LOCK_UV = 4; /** - * When set, U texture coordinates for the given sprite are + * When set, U texture coordinates for the given sprite are * flipped as part of baking. Can be useful for some randomization * and texture mapping scenarios. Results are different than what * can be obtained via rotation and both can be applied. @@ -94,23 +95,23 @@ public interface MutableQuadView extends QuadView { int BAKE_NORMALIZED = 32; /** - * Assigns a different material to this quad. Useful for transformation of - * existing meshes because lighting and texture blending are controlled by material.

+ * Assigns a different material to this quad. Useful for transformation of + * existing meshes because lighting and texture blending are controlled by material. */ MutableQuadView material(RenderMaterial material); /** * If non-null, quad is coplanar with a block face which, if known, simplifies * or shortcuts geometric analysis that might otherwise be needed. - * Set to null if quad is not coplanar or if this is not known. - * Also controls face culling during block rendering.

- * - * Null by default.

- * - * When called with a non-null value, also sets {@link #nominalFace(Direction)} - * to the same value.

- * - * This is different than the value reported by {@link BakedQuad#getFace()}. That value + * Set to null if quad is not coplanar or if this is not known. + * Also controls face culling during block rendering. + * + *

Null by default. + * + *

When called with a non-null value, also sets {@link #nominalFace(Direction)} + * to the same value. + * + *

This is different than the value reported by {@link BakedQuad#getFace()}. That value * is computed based on face geometry and must be non-null in vanilla quads. * That computed value is returned by {@link #lightFace()}. */ @@ -118,15 +119,15 @@ public interface MutableQuadView extends QuadView { /** * Provides a hint to renderer about the facing of this quad. Not required, - * but if provided can shortcut some geometric analysis if the quad is parallel to a block face. + * but if provided can shortcut some geometric analysis if the quad is parallel to a block face. * Should be the expected value of {@link #lightFace()}. Value will be confirmed - * and if invalid the correct light face will be calculated.

- * - * Null by default, and set automatically by {@link #cullFace()}.

- * - * Models may also find this useful as the face for texture UV locking and rotation semantics.

- * - * NOTE: This value is not persisted independently when the quad is encoded. + * and if invalid the correct light face will be calculated. + * + *

Null by default, and set automatically by {@link #cullFace()}. + * + *

Models may also find this useful as the face for texture UV locking and rotation semantics. + * + * @note This value is not persisted independently when the quad is encoded. * When reading encoded quads, this value will always be the same as {@link #lightFace()}. */ MutableQuadView nominalFace(Direction face); @@ -139,9 +140,9 @@ public interface MutableQuadView extends QuadView { /** * Enables bulk vertex data transfer using the standard Minecraft vertex formats. - * This method should be performant whenever caller's vertex representation makes it feasible.

- * - * Calling this method does not emit the quad. + * This method should be performant whenever caller's vertex representation makes it feasible. + * + *

Calling this method does not emit the quad. */ MutableQuadView fromVanilla(int[] quadData, int startIndex, boolean isItem); @@ -153,9 +154,9 @@ public interface MutableQuadView extends QuadView { MutableQuadView tag(int tag); /** - * Sets the geometric vertex position for the given vertex, + * Sets the geometric vertex position for the given vertex, * relative to block origin. (0,0,0). Minecraft rendering is designed - * for models that fit within a single block space and is recommended + * for models that fit within a single block space and is recommended * that coordinates remain in the 0-1 range, with multi-block meshes * split into multiple per-block models. */ @@ -171,10 +172,10 @@ public interface MutableQuadView extends QuadView { /** * Adds a vertex normal. Models that have per-vertex * normals should include them to get correct lighting when it matters. - * Computed face normal is used when no vertex normal is provided.

- * - * {@link Renderer} implementations should honor vertex normals for - * diffuse lighting - modifying vertex color(s) or packing normals in the vertex + * Computed face normal is used when no vertex normal is provided. + * + *

{@link Renderer} implementations should honor vertex normals for + * diffuse lighting - modifying vertex color(s) or packing normals in the vertex * buffer as appropriate for the rendering method/vertex format in effect. */ MutableQuadView normal(int vertexIndex, float x, float y, float z); @@ -189,17 +190,17 @@ public interface MutableQuadView extends QuadView { /** * Accept vanilla lightmap values. Input values will override lightmap values * computed from world state if input values are higher. Exposed for completeness - * but some rendering implementations with non-standard lighting model may not honor it.

- * - * For emissive rendering, it is better to use {@link MaterialFinder#emissive(int, boolean)}. + * but some rendering implementations with non-standard lighting model may not honor it. + * + *

For emissive rendering, it is better to use {@link MaterialFinder#emissive(int, boolean)}. */ MutableQuadView lightmap(int vertexIndex, int lightmap); - /** - * Convenience: set lightmap for all vertices at once.

- * - * For emissive rendering, it is better to use {@link MaterialFinder#emissive(int, boolean)}. - * See {@link #lightmap(int, int)}. + /** + * Convenience: set lightmap for all vertices at once. + * + *

For emissive rendering, it is better to use {@link MaterialFinder#emissive(int, boolean)}. + * See {@link #lightmap(int, int)}. */ default MutableQuadView lightmap(int b0, int b1, int b2, int b3) { lightmap(0, b0); @@ -214,7 +215,7 @@ public interface MutableQuadView extends QuadView { */ MutableQuadView spriteColor(int vertexIndex, int spriteIndex, int color); - /** + /** * Convenience: set sprite color for all vertices at once. Behavior for {@code spriteIndex > 0} is currently undefined. */ default MutableQuadView spriteColor(int spriteIndex, int c0, int c1, int c2, int c3) { @@ -233,7 +234,7 @@ public interface MutableQuadView extends QuadView { /** * Assigns sprite atlas u,v coordinates to this quad for the given sprite. * Can handle UV locking, rotation, interpolation, etc. Control this behavior - * by passing additive combinations of the BAKE_ flags defined in this interface. + * by passing additive combinations of the BAKE_ flags defined in this interface. * Behavior for {@code spriteIndex > 0} is currently undefined. */ MutableQuadView spriteBake(int spriteIndex, Sprite sprite, int bakeFlags); diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadEmitter.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadEmitter.java index dd1b805df..30a84abbc 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadEmitter.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadEmitter.java @@ -16,23 +16,24 @@ package net.fabricmc.fabric.api.renderer.v1.mesh; -import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; + /** * Specialized {@link MutableQuadView} obtained via {@link MeshBuilder#getEmitter()} - * to append quads during mesh building.

- * - * Also obtained from {@link RenderContext#getEmitter()} to submit - * dynamic quads one-by-one at render time.

- * - * Instances of {@link QuadEmitter} will practically always be - * threadlocal and/or reused - do not retain references.

- * - * Only the renderer should implement or extend this interface. + * to append quads during mesh building. + * + *

Also obtained from {@link RenderContext#getEmitter()} to submit + * dynamic quads one-by-one at render time. + * + *

Instances of {@link QuadEmitter} will practically always be + * threadlocal and/or reused - do not retain references. + * + *

Only the renderer should implement or extend this interface. */ public interface QuadEmitter extends MutableQuadView { @Override @@ -101,20 +102,20 @@ public interface QuadEmitter extends MutableQuadView { QuadEmitter spriteBake(int spriteIndex, Sprite sprite, int bakeFlags); /** - * Tolerance for determining if the depth parameter to {@link #square(Direction, float, float, float, float, float)} + * Tolerance for determining if the depth parameter to {@link #square(Direction, float, float, float, float, float)} * is effectively zero - meaning the face is a cull face. */ - final float CULL_FACE_EPSILON = 0.00001f; + float CULL_FACE_EPSILON = 0.00001f; /** * Helper method to assign vertex coordinates for a square aligned with the given face. * Ensures that vertex order is consistent with vanilla convention. (Incorrect order can - * lead to bad AO lighting unless enhanced lighting logic is available/enabled.)

- * - * Square will be parallel to the given face and coplanar with the face (and culled if the - * face is occluded) if the depth parameter is approximately zero. See {@link #CULL_FACE_EPSILON}.

- * - * All coordinates should be normalized (0-1). + * lead to bad AO lighting unless enhanced lighting logic is available/enabled.) + * + *

Square will be parallel to the given face and coplanar with the face (and culled if the + * face is occluded) if the depth parameter is approximately zero. See {@link #CULL_FACE_EPSILON}. + * + *

All coordinates should be normalized (0-1). */ default QuadEmitter square(Direction nominalFace, float left, float bottom, float right, float top, float depth) { if (Math.abs(depth) < CULL_FACE_EPSILON) { @@ -162,6 +163,7 @@ public interface QuadEmitter extends MutableQuadView { pos(3, left, top, depth); break; } + return this; } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadView.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadView.java index e75a52635..3ec71df8a 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadView.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/mesh/QuadView.java @@ -16,39 +16,40 @@ package net.fabricmc.fabric.api.renderer.v1.mesh; -import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; + /** * Interface for reading quad data encoded by {@link MeshBuilder}. * Enables models to do analysis, re-texturing or translation without knowing the - * renderer's vertex formats and without retaining redundant information.

- * - * Only the renderer should implement or extend this interface. + * renderer's vertex formats and without retaining redundant information. + * + *

Only the renderer should implement or extend this interface. */ public interface QuadView { - /** Count of integers in a conventional (un-modded) block or item vertex */ + /** Count of integers in a conventional (un-modded) block or item vertex. */ int VANILLA_VERTEX_STRIDE = VertexFormats.POSITION_COLOR_UV_NORMAL.getVertexSizeInteger(); - /** Count of integers in a conventional (un-modded) block or item quad */ + /** Count of integers in a conventional (un-modded) block or item quad. */ int VANILLA_QUAD_STRIDE = VANILLA_VERTEX_STRIDE * 4; /** - * Reads baked vertex data and outputs standard baked quad - * vertex data in the given array and location.

- * + * Reads baked vertex data and outputs standard baked quad + * vertex data in the given array and location. + * * @param spriteIndex The sprite to be used for the quad. * Behavior for values > 0 is currently undefined. - * + * * @param target Target array for the baked quad data. - * + * * @param targetIndex Starting position in target array - array must have * at least 28 elements available at this index. - * + * * @param isItem If true, will output vertex normals. Otherwise will output * lightmaps, per Minecraft vertex formats for baked models. */ @@ -74,15 +75,15 @@ public interface QuadView { /** * Equivalent to {@link BakedQuad#getFace()}. This is the face used for vanilla lighting * calculations and will be the block face to which the quad is most closely aligned. Always - * the same as cull face for quads that are on a block face, but never null.

+ * the same as cull face for quads that are on a block face, but never null. */ Direction lightFace(); /** - * If non-null, quad should not be rendered in-world if the - * opposite face of a neighbor block occludes it.

- * - * See {@link MutableQuadView#cullFace(Direction)}. + * If non-null, quad should not be rendered in-world if the + * opposite face of a neighbor block occludes it. + * + * @see MutableQuadView#cullFace(Direction) */ Direction cullFace(); @@ -94,36 +95,32 @@ public interface QuadView { /** * Normal of the quad as implied by geometry. Will be invalid * if quad vertices are not co-planar. Typically computed lazily - * on demand and not encoded.

- * - * Not typically needed by models. Exposed to enable standard lighting + * on demand and not encoded. + * + *

Not typically needed by models. Exposed to enable standard lighting * utility functions for use by renderers. */ Vector3f faceNormal(); /** * Generates a new BakedQuad instance with texture - * coordinates and colors from the given sprite.

- * - * param source Data previously packed by {@link MeshBuilder}. - * - * param sourceIndex Index where packed data starts. - * + * coordinates and colors from the given sprite. + * * @param spriteIndex The sprite to be used for the quad. * Behavior for {@code spriteIndex > 0} is currently undefined. - * + * * @param sprite {@link MutableQuadView} does not serialize sprites * so the sprite must be provided by the caller. - * + * * @param isItem If true, will output vertex normals. Otherwise will output * lightmaps, per Minecraft vertex formats for baked models. - * + * * @return A new baked quad instance with the closest-available appearance * supported by vanilla features. Will retain emissive light maps, for example, * but the standard Minecraft renderer will not use them. */ default BakedQuad toBakedQuad(int spriteIndex, Sprite sprite, boolean isItem) { - int vertexData[] = new int[VANILLA_QUAD_STRIDE]; + int[] vertexData = new int[VANILLA_QUAD_STRIDE]; toVanilla(spriteIndex, vertexData, 0, isItem); return new BakedQuad(vertexData, colorIndex(), lightFace(), sprite); } @@ -141,7 +138,7 @@ public interface QuadView { Vector3f copyPos(int vertexIndex, Vector3f target); /** - * Convenience: access x, y, z by index 0-2 + * Convenience: access x, y, z by index 0-2. */ float posByIndex(int vertexIndex, int coordinateIndex); @@ -203,7 +200,7 @@ public interface QuadView { float spriteU(int vertexIndex, int spriteIndex); /** - * Retrieve vertical sprite atlas coordinates + * Retrieve vertical sprite atlas coordinates. */ float spriteV(int vertexIndex, int spriteIndex); } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/FabricBakedModel.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/FabricBakedModel.java index 637fb6b1d..f51b03453 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/FabricBakedModel.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/FabricBakedModel.java @@ -19,8 +19,6 @@ package net.fabricmc.fabric.api.renderer.v1.model; import java.util.Random; import java.util.function.Supplier; -import net.fabricmc.fabric.api.renderer.v1.Renderer; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.minecraft.block.BlockState; import net.minecraft.client.render.block.BlockModelRenderer; import net.minecraft.client.render.model.BakedModel; @@ -28,63 +26,66 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.Renderer; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; + /** * Interface for baked models that output meshes with enhanced rendering features. * Can also be used to generate or customize outputs based on world state instead of - * or in addition to block state when render chunks are rebuilt.

- * - * Note for {@link Renderer} implementors: Fabric causes BakedModel to extend this - * interface with {@link #isVanillaAdapter()} == true and to produce standard vertex data. + * or in addition to block state when render chunks are rebuilt. + * + *

Note for {@link Renderer} implementors: Fabric causes BakedModel to extend this + * interface with {@link #isVanillaAdapter()} == true and to produce standard vertex data. * This means any BakedModel instance can be safely cast to this interface without an instanceof check. */ public interface FabricBakedModel { /** * When true, signals renderer this producer is implemented through {@link BakedModel#getQuads(BlockState, net.minecraft.util.math.Direction, Random)}. - * Also means the model does not rely on any non-vanilla features. - * Allows the renderer to optimize or route vanilla models through the unmodified vanilla pipeline if desired.

- - * Fabric overrides to true for vanilla baked models. + * Also means the model does not rely on any non-vanilla features. + * Allows the renderer to optimize or route vanilla models through the unmodified vanilla pipeline if desired. + * + *

Fabric overrides to true for vanilla baked models. * Enhanced models that use this API should return false, - * otherwise the API will not recognize the model.

+ * otherwise the API will not recognize the model. */ boolean isVanillaAdapter(); /** * This method will be called during chunk rebuilds to generate both the static and * dynamic portions of a block model when the model implements this interface and - * {@link #isVanillaAdapter()} returns false.

- * - * During chunk rebuild, this method will always be called exactly one time per block - * position, irrespective of which or how many faces or block render layers are included - * in the model. Models must output all quads/meshes in a single pass.

- * - * Also called to render block models outside of chunk rebuild or block entity rendering. + * {@link #isVanillaAdapter()} returns false. + * + *

During chunk rebuild, this method will always be called exactly one time per block + * position, irrespective of which or how many faces or block render layers are included + * in the model. Models must output all quads/meshes in a single pass. + * + *

Also called to render block models outside of chunk rebuild or block entity rendering. * Typically this happens when the block is being rendered as an entity, not as a block placed in the world. * Currently this happens for falling blocks and blocks being pushed by a piston, but renderers * should invoke this for all calls to {@link BlockModelRenderer#tesselate(ExtendedBlockView, BakedModel, BlockState, BlockPos, net.minecraft.client.render.BufferBuilder, boolean, Random, long)} - * that occur outside of chunk rebuilds to allow for features added by mods, unless - * {@link #isVanillaAdapter()} returns true.

- * - * Outside of chunk rebuilds, this method will be called every frame. Model implementations should - * rely on pre-baked meshes as much as possible and keep transformation to a minimum. The provided + * that occur outside of chunk rebuilds to allow for features added by mods, unless + * {@link #isVanillaAdapter()} returns true. + * + *

Outside of chunk rebuilds, this method will be called every frame. Model implementations should + * rely on pre-baked meshes as much as possible and keep transformation to a minimum. The provided * block position may be the nearest block position and not actual. For this reason, neighbor - * state lookups are best avoided or will require special handling. Block entity lookups are - * likely to fail and/or give meaningless results.

- * - * In all cases, renderer will handle face occlusion and filter quads on faces obscured by + * state lookups are best avoided or will require special handling. Block entity lookups are + * likely to fail and/or give meaningless results. + * + *

In all cases, renderer will handle face occlusion and filter quads on faces obscured by * neighboring blocks (if appropriate). Models only need to consider "sides" to the - * extent the model is driven by connection with neighbor blocks or other world state.

- * - * Note: with {@link BakedModel#getQuads(BlockState, net.minecraft.util.math.Direction, Random)}, the random + * extent the model is driven by connection with neighbor blocks or other world state. + * + * @note with {@link BakedModel#getQuads(BlockState, net.minecraft.util.math.Direction, Random)}, the random * parameter is normally initialized with the same seed prior to each face layer. * Model authors should note this method is called only once per block, and call the provided - * Random supplier multiple times if re-seeding is necessary. For wrapped vanilla baked models, + * Random supplier multiple times if re-seeding is necessary. For wrapped vanilla baked models, * it will probably be easier to use {@link RenderContext#fallbackConsumer} which handles - * re-seeding per face automatically.

- * + * re-seeding per face automatically. + * * @param blockView Access to world state. Using {@link net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView#getBlockEntityRenderAttachment(BlockPos)} to * retrieve block entity state unless thread safety can be guaranteed. - * param safeBlockEntityAccessor Thread-safe access to block entity data + * param safeBlockEntityAccessor Thread-safe access to block entity data * @param state Block state for model being rendered. * @param pos Position of block for model being rendered. * @param randomSupplier Random object seeded per vanilla conventions. Call multiple times to re-seed. @@ -96,26 +97,26 @@ public interface FabricBakedModel { /** * This method will be called during item rendering to generate both the static and * dynamic portions of an item model when the model implements this interface and - * {@link #isVanillaAdapter()} returns false.

- * - * Vanilla item rendering is normally very limited. It ignores lightmaps, vertex colors, - * and vertex normals. Renderers are expected to implement enhanced features for item + * {@link #isVanillaAdapter()} returns false. + * + *

Vanilla item rendering is normally very limited. It ignores lightmaps, vertex colors, + * and vertex normals. Renderers are expected to implement enhanced features for item * models. If a feature is impractical due to performance or other concerns, then the * renderer must at least give acceptable visual results without the need for special- - * case handling in model implementations.

- * - * Calls to this method will generally happen on the main client thread but nothing - * prevents a mod or renderer from calling this method concurrently. Implementations - * should not mutate the ItemStack parameter, and best practice will be to make the - * method thread-safe.

- * - * Implementing this method does NOT mitigate the need to implement a functional - * {@link BakedModel#getItemPropertyOverrides()} method, because this method will be called - * on the result of {@link BakedModel#getItemPropertyOverrides}. However, that + * case handling in model implementations. + * + *

Calls to this method will generally happen on the main client thread but nothing + * prevents a mod or renderer from calling this method concurrently. Implementations + * should not mutate the ItemStack parameter, and best practice will be to make the + * method thread-safe. + * + *

Implementing this method does NOT mitigate the need to implement a functional + * {@link BakedModel#getItemPropertyOverrides()} method, because this method will be called + * on the result of {@link BakedModel#getItemPropertyOverrides}. However, that * method can simply return the base model because the output from this method will - * be used for rendering.

- * - * Renderer implementations should also use this method to obtain the quads used + * be used for rendering. + * + *

Renderer implementations should also use this method to obtain the quads used * for item enchantment glint rendering. This means models can put geometric variation * logic here, instead of returning every possible shape from {@link BakedModel#getItemPropertyOverrides} * as vanilla baked models. diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ForwardingBakedModel.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ForwardingBakedModel.java index 2b4a38110..7cf1f26a1 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ForwardingBakedModel.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ForwardingBakedModel.java @@ -20,8 +20,6 @@ import java.util.List; import java.util.Random; import java.util.function.Supplier; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.fabricmc.fabric.impl.renderer.DamageModel; import net.minecraft.block.BlockState; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedQuad; @@ -33,12 +31,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.fabric.impl.renderer.DamageModel; + /** * Base class for specialized model implementations that need to wrap other baked models. * Avoids boilerplate code for pass-through methods. For example usage see {@link DamageModel}. */ public abstract class ForwardingBakedModel implements BakedModel, FabricBakedModel { - /** implementations must set this somehow */ + /** implementations must set this somehow. */ protected BakedModel wrapped; @Override diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java index 39da668df..946ea7961 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java @@ -21,7 +21,6 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.render.model.json.ModelTransformation; @@ -29,19 +28,20 @@ import net.minecraft.client.render.model.json.Transformation; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; + /** * Collection of utilities for model implementations. */ public abstract class ModelHelper { - private ModelHelper() { - } + private ModelHelper() { } /** Result from {@link #toFaceIndex(Direction)} for null values. */ public static final int NULL_FACE_ID = 6; /** * Convenient way to encode faces that may be null. - * Null is returned as {@link #NULL_FACE_ID}. + * Null is returned as {@link #NULL_FACE_ID}. * Use {@link #faceFromIndex(int)} to retrieve encoded face. */ public static int toFaceIndex(Direction face) { @@ -49,7 +49,7 @@ public abstract class ModelHelper { } /** - * Use to decode a result from {@link #toFaceIndex(Direction)}. + * Use to decode a result from {@link #toFaceIndex(Direction)}. * Return value will be null if encoded value was null. * Can also be used for no-allocation iteration of {@link Direction#values()}, * optionally including the null face. (Use < or <= {@link #NULL_FACE_ID} @@ -59,16 +59,16 @@ public abstract class ModelHelper { return FACES[faceIndex]; } - /** see {@link #faceFromIndex(int)} */ + /** @see #faceFromIndex(int) */ private static final Direction[] FACES = Arrays.copyOf(Direction.values(), 7); /** * Converts a mesh into an array of lists of vanilla baked quads. * Useful for creating vanilla baked models when required for compatibility. - * The array indexes correspond to {@link Direction#getId()} with the - * addition of {@link #NULL_FACE_ID}.

- * - * Retrieves sprites from the block texture atlas via {@link SpriteFinder}. + * The array indexes correspond to {@link Direction#getId()} with the + * addition of {@link #NULL_FACE_ID}. + * + *

Retrieves sprites from the block texture atlas via {@link SpriteFinder}. */ public static List[] toQuadLists(Mesh mesh) { SpriteFinder finder = SpriteFinder.get(MinecraftClient.getInstance().getSpriteAtlas()); @@ -93,16 +93,18 @@ public abstract class ModelHelper { @SuppressWarnings("unchecked") List[] result = new List[7]; + for (int i = 0; i < 7; i++) { result[i] = builders[i].build(); } + return result; } /** * The vanilla model transformation logic is closely coupled with model deserialization. * That does little good for modded model loaders and procedurally generated models. - * This convenient construction method applies the same scaling factors used for vanilla models. + * This convenient construction method applies the same scaling factors used for vanilla models. * This means you can use values from a vanilla JSON file as inputs to this method. */ private static Transformation makeTransform(float rotationX, float rotationY, float rotationZ, float translationX, float translationY, float translationZ, float scaleX, float scaleY, float scaleZ) { @@ -121,7 +123,7 @@ public abstract class ModelHelper { /** * Mimics the vanilla model transformation used for most vanilla blocks, - * and should be suitable for most custom block-like models. + * and should be suitable for most custom block-like models. */ public static final ModelTransformation MODEL_TRANSFORM_BLOCK = new ModelTransformation(TRANSFORM_BLOCK_3RD_PERSON_RIGHT, TRANSFORM_BLOCK_3RD_PERSON_RIGHT, TRANSFORM_BLOCK_1ST_PERSON_LEFT, TRANSFORM_BLOCK_1ST_PERSON_RIGHT, Transformation.NONE, TRANSFORM_BLOCK_GUI, TRANSFORM_BLOCK_GROUND, TRANSFORM_BLOCK_FIXED); } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/SpriteFinder.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/SpriteFinder.java index 6d31289bb..2fc0d5adc 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/SpriteFinder.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/SpriteFinder.java @@ -16,18 +16,19 @@ package net.fabricmc.fabric.api.renderer.v1.model; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.texture.SpriteAtlasTexture; + import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.fabricmc.fabric.impl.renderer.SpriteFinderImpl; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.SpriteAtlasTexture; /** * Indexes a texture atlas to allow fast lookup of Sprites from * baked vertex coordinates. Main use is for {@link Mesh}-based models * to generate vanilla quads on demand without tracking and retaining - * the sprites that were baked into the mesh. In other words, this class + * the sprites that were baked into the mesh. In other words, this class * supplies the sprite parameter for {@link QuadView#toBakedQuad(int, Sprite, boolean)}. */ public interface SpriteFinder { @@ -37,16 +38,16 @@ public interface SpriteFinder { * refreshed whenever there is a resource reload or other event * that causes atlas textures to be re-stitched. */ - public static SpriteFinder get(SpriteAtlasTexture atlas) { + static SpriteFinder get(SpriteAtlasTexture atlas) { return SpriteFinderImpl.get(atlas); } /** * Finds the atlas sprite containing the vertex centroid of the quad. * Vertex centroid is essentially the mean u,v coordinate - the intent being - * to find a point that is unambiguously inside the sprite (vs on an edge.)

- * - * Should be reliable for any convex quad or triangle. May fail for non-convex quads. + * to find a point that is unambiguously inside the sprite (vs on an edge.) + * + *

Should be reliable for any convex quad or triangle. May fail for non-convex quads. * Note that all the above refers to u,v coordinates. Geometric vertex does not matter, * except to the extent it was used to determine u,v. */ @@ -55,12 +56,12 @@ public interface SpriteFinder { /** * Alternative to {@link #find(QuadView, int)} when vertex centroid is already * known or unsuitable. Expects normalized (0-1) coordinates on the atlas texture, - * which should already be the case for u,v values in vanilla baked quads and in - * {@link QuadView} after calling {@link MutableQuadView#spriteBake(int, Sprite, int)}.

- * - * Coordinates must be in the sprite interior for reliable results. Generally will + * which should already be the case for u,v values in vanilla baked quads and in + * {@link QuadView} after calling {@link MutableQuadView#spriteBake(int, Sprite, int)}. + * + *

Coordinates must be in the sprite interior for reliable results. Generally will * be easier to use {@link #find(QuadView, int)} unless you know the vertex - * centroid will somehow not be in the quad interior. This method will be slightly + * centroid will somehow not be in the quad interior. This method will be slightly * faster if you already have the centroid or another appropriate value. */ Sprite find(float u, float v); diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/render/RenderContext.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/render/RenderContext.java index a87c6f649..0883992c2 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/render/RenderContext.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/render/RenderContext.java @@ -18,25 +18,26 @@ package net.fabricmc.fabric.api.renderer.v1.render; import java.util.function.Consumer; +import net.minecraft.client.render.model.BakedModel; + import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.minecraft.client.render.model.BakedModel; /** * This defines the instance made available to models for buffering vertex data at render time. */ public interface RenderContext { /** - * Used by models to send vertex data previously baked via {@link MeshBuilder}. + * Used by models to send vertex data previously baked via {@link MeshBuilder}. * The fastest option and preferred whenever feasible. */ Consumer meshConsumer(); /** - * Fabric causes vanilla baked models to send themselves + * Fabric causes vanilla baked models to send themselves * via this interface. Can also be used by compound models that contain a mix * of vanilla baked models, packaged quads and/or dynamic elements. */ @@ -44,33 +45,33 @@ public interface RenderContext { /** * Returns a {@link QuadEmitter} instance that emits directly to the render buffer. - * It remains necessary to call {@link QuadEmitter#emit()} to output the quad.

- * - * This method will always be less performant than passing pre-baked meshes + * It remains necessary to call {@link QuadEmitter#emit()} to output the quad. + * + *

This method will always be less performant than passing pre-baked meshes * via {@link #meshConsumer()}. It should be used sparingly for model components that - * demand it - text, icons, dynamic indicators, or other elements that vary too - * much for static baking to be feasible.

- * - * Calling this method invalidates any {@link QuadEmitter} returned earlier. + * demand it - text, icons, dynamic indicators, or other elements that vary too + * much for static baking to be feasible. + * + *

Calling this method invalidates any {@link QuadEmitter} returned earlier. * Will be threadlocal/re-used - do not retain references. */ QuadEmitter getEmitter(); /** * Causes all models/quads/meshes sent to this consumer to be transformed by the provided - * {@link QuadTransform} that edits each quad before buffering. Quads in the mesh will - * be passed to the {@link QuadTransform} for modification before offsets, face culling or lighting are applied. - * Meant for animation and mesh customization.

- * - * You MUST call {@link #popTransform()} after model is done outputting quads. - * - * More than one transformer can be added to the context. Transformers are applied in reverse order. - * (Last pushed is applied first.)

- * - * Meshes are never mutated by the transformer - only buffered quads. This ensures thread-safe - * use of meshes/models across multiple chunk builders.

- * - * Only the renderer should implement or extend this interface. + * {@link QuadTransform} that edits each quad before buffering. Quads in the mesh will + * be passed to the {@link QuadTransform} for modification before offsets, face culling or lighting are applied. + * Meant for animation and mesh customization. + * + *

You MUST call {@link #popTransform()} after model is done outputting quads. + * + *

More than one transformer can be added to the context. Transformers are applied in reverse order. + * (Last pushed is applied first.) + * + *

Meshes are never mutated by the transformer - only buffered quads. This ensures thread-safe + * use of meshes/models across multiple chunk builders. + * + *

Only the renderer should implement or extend this interface. */ void pushTransform(QuadTransform transform); @@ -81,7 +82,7 @@ public interface RenderContext { void popTransform(); @FunctionalInterface - public static interface QuadTransform { + public interface QuadTransform { /** * Return false to filter out quads from rendering. When more than one transform * is in effect, returning false means unapplied transforms will not receive the quad. diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/DamageModel.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/DamageModel.java index bcc7471d6..cc71baabf 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/DamageModel.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/DamageModel.java @@ -19,23 +19,24 @@ package net.fabricmc.fabric.impl.renderer; import java.util.Random; import java.util.function.Supplier; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.fabricmc.fabric.api.renderer.v1.RendererAccess; -import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; import net.minecraft.block.BlockState; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.texture.Sprite; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; + /** - * Specialized model wrapper that implements a general-purpose - * block-breaking render for enhanced models.

- * - * Works by intercepting all model output and redirecting to dynamic + * Specialized model wrapper that implements a general-purpose + * block-breaking render for enhanced models. + * + *

Works by intercepting all model output and redirecting to dynamic * quads that are baked with single-layer, UV-locked damage texture. */ public class DamageModel extends ForwardingBakedModel { diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/RendererAccessImpl.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/RendererAccessImpl.java index 67a9ef46a..d1daf29ed 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/RendererAccessImpl.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/RendererAccessImpl.java @@ -26,7 +26,7 @@ public final class RendererAccessImpl implements RendererAccess { private RendererAccessImpl() { } @Override - public final void registerRenderer(Renderer renderer) { + public void registerRenderer(Renderer renderer) { if (renderer == null) { throw new NullPointerException("Attempt to register a NULL rendering plug-in."); } else if (activeRenderer != null) { @@ -39,16 +39,16 @@ public final class RendererAccessImpl implements RendererAccess { private Renderer activeRenderer = null; - /** avoids null test every call to {@link #hasRenderer()} */ + /** avoids null test every call to {@link #hasRenderer()}. */ private boolean hasActiveRenderer = false; @Override - public final Renderer getRenderer() { + public Renderer getRenderer() { return activeRenderer; } @Override - public final boolean hasRenderer() { + public boolean hasRenderer() { return hasActiveRenderer; } } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/SpriteFinderImpl.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/SpriteFinderImpl.java index afd9b9014..d501d79b0 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/SpriteFinderImpl.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/impl/renderer/SpriteFinderImpl.java @@ -19,16 +19,17 @@ package net.fabricmc.fabric.impl.renderer; import java.util.Map; import java.util.function.Consumer; -import net.fabricmc.fabric.api.renderer.v1.model.SpriteFinder; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.minecraft.client.texture.MissingSprite; import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.fabricmc.fabric.api.renderer.v1.model.SpriteFinder; + /** * Indexes an atlas sprite to allow fast lookup of Sprites from - * baked vertex coordinates. Implementation is a straightforward + * baked vertex coordinates. Implementation is a straightforward * quad tree. Other options that were considered were linear search * (slow) and direct indexing of fixed-size cells. Direct indexing * would be fastest but would be memory-intensive for large atlases @@ -141,7 +142,7 @@ public class SpriteFinderImpl implements SpriteFinder { return ((SpriteFinderAccess) atlas).fabric_spriteFinder(); } - public static interface SpriteFinderAccess { + public interface SpriteFinderAccess { SpriteFinderImpl fabric_spriteFinder(); } } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBakedModel.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBakedModel.java index 1e4c1ae60..d76678150 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBakedModel.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBakedModel.java @@ -19,15 +19,16 @@ package net.fabricmc.fabric.mixin.renderer.client; import java.util.Random; import java.util.function.Supplier; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.minecraft.world.BlockRenderView; import org.spongepowered.asm.mixin.Mixin; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; import net.minecraft.block.BlockState; import net.minecraft.client.render.model.BakedModel; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockRenderView; + +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; /** * Avoids instanceof checks and enables consistent code path for all baked models. @@ -35,12 +36,12 @@ import net.minecraft.util.math.BlockPos; @Mixin(BakedModel.class) public interface MixinBakedModel extends FabricBakedModel { @Override - public default boolean isVanillaAdapter() { + default boolean isVanillaAdapter() { return true; } @Override - public default void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { + default void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { context.fallbackConsumer().accept((BakedModel) this); } diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinDebugHud.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinDebugHud.java index d2cda9d7a..f5b694887 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinDebugHud.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinDebugHud.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.mixin.renderer.client; -import net.fabricmc.fabric.api.renderer.v1.RendererAccess; -import net.minecraft.client.gui.hud.DebugHud; +import java.util.List; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.List; +import net.minecraft.client.gui.hud.DebugHud; + +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; @Mixin(DebugHud.class) public class MixinDebugHud { diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinSpriteAtlasTexture.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinSpriteAtlasTexture.java index 15ed18546..b4582a19a 100644 --- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinSpriteAtlasTexture.java +++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinSpriteAtlasTexture.java @@ -18,7 +18,6 @@ package net.fabricmc.fabric.mixin.renderer.client; import java.util.Map; -import net.fabricmc.fabric.impl.renderer.SpriteFinderImpl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -29,6 +28,8 @@ import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.impl.renderer.SpriteFinderImpl; + @Mixin(SpriteAtlasTexture.class) public class MixinSpriteAtlasTexture implements SpriteFinderImpl.SpriteFinderAccess { @Shadow @@ -49,6 +50,7 @@ public class MixinSpriteAtlasTexture implements SpriteFinderImpl.SpriteFinderAcc result = new SpriteFinderImpl(sprites); fabric_spriteFinder = result; } + return result; } } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/Indigo.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/Indigo.java index b52c94f5a..c62bface3 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/Indigo.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/Indigo.java @@ -16,15 +16,6 @@ package net.fabricmc.indigo; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.renderer.v1.RendererAccess; -import net.fabricmc.fabric.api.util.TriState; -import net.fabricmc.indigo.renderer.IndigoRenderer; -import net.fabricmc.indigo.renderer.aocalc.AoConfig; -import net.fabricmc.loader.api.FabricLoader; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -32,11 +23,21 @@ import java.io.IOException; import java.util.Locale; import java.util.Properties; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.util.TriState; +import net.fabricmc.indigo.renderer.IndigoRenderer; +import net.fabricmc.indigo.renderer.aocalc.AoConfig; +import net.fabricmc.loader.api.FabricLoader; + public class Indigo implements ClientModInitializer { public static final boolean ALWAYS_TESSELATE_INDIGO; public static final boolean ENSURE_VERTEX_FORMAT_COMPATIBILITY; public static final AoConfig AMBIENT_OCCLUSION_MODE; - /** Set true in dev env to confirm results match vanilla when they should */ + /** Set true in dev env to confirm results match vanilla when they should. */ public static final boolean DEBUG_COMPARE_LIGHTING; public static final boolean FIX_SMOOTH_LIGHTING_OFFSET; public static final boolean FIX_EXTERIOR_VERTEX_LIGHTING; @@ -89,6 +90,7 @@ public class Indigo implements ClientModInitializer { static { File configDir = new File(FabricLoader.getInstance().getConfigDirectory(), "fabric"); + if (!configDir.exists()) { if (!configDir.mkdir()) { LOGGER.warn("[Indigo] Could not create configuration directory: " + configDir.getAbsolutePath()); @@ -97,6 +99,7 @@ public class Indigo implements ClientModInitializer { File configFile = new File(configDir, "indigo-renderer.properties"); Properties properties = new Properties(); + if (configFile.exists()) { try (FileInputStream stream = new FileInputStream(configFile)) { properties.load(stream); @@ -126,9 +129,11 @@ public class Indigo implements ClientModInitializer { public void onInitializeClient() { if (IndigoMixinConfigPlugin.shouldApplyIndigo()) { LOGGER.info("[Indigo] Registering Indigo renderer!"); + if (IndigoMixinConfigPlugin.shouldForceCompatibility()) { LOGGER.info("[Indigo] Compatibility mode enabled."); } + RendererAccess.INSTANCE.registerRenderer(IndigoRenderer.INSTANCE); } else { LOGGER.info("[Indigo] Different rendering plugin detected; not applying Indigo."); diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoConfig.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoConfig.java index 1f20ae57d..9969e6885 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoConfig.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoConfig.java @@ -16,6 +16,4 @@ package net.fabricmc.indigo; -public class IndigoConfig { - -} +public class IndigoConfig { } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java index c31b4811c..da32c832d 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/IndigoMixinConfigPlugin.java @@ -16,22 +16,22 @@ package net.fabricmc.indigo; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.fabricmc.loader.api.metadata.ModMetadata; +import java.util.List; +import java.util.Set; import org.spongepowered.asm.lib.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -import java.util.List; -import java.util.Set; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; +import net.fabricmc.loader.api.metadata.ModMetadata; public class IndigoMixinConfigPlugin implements IMixinConfigPlugin { - /** Set by other renderers to disable loading of Indigo */ + /** Set by other renderers to disable loading of Indigo. */ private static final String JSON_KEY_DISABLE_INDIGO = "fabric-renderer-api-v1:contains_renderer"; /** - * Disables vanilla block tesselation and ensures vertex format compatibility + * Disables vanilla block tesselation and ensures vertex format compatibility. */ private static final String JSON_KEY_FORCE_COMPATIBILITY = "fabric-renderer-indigo:force_compatibility"; @@ -44,13 +44,14 @@ public class IndigoMixinConfigPlugin implements IMixinConfigPlugin { if (needsLoad) { for (ModContainer container : FabricLoader.getInstance().getAllMods()) { final ModMetadata meta = container.getMetadata(); - + if (meta.containsCustomValue(JSON_KEY_DISABLE_INDIGO)) { indigoApplicable = false; } else if (meta.containsCustomValue(JSON_KEY_FORCE_COMPATIBILITY)) { forceCompatibility = true; } } + needsLoad = false; } } @@ -66,9 +67,7 @@ public class IndigoMixinConfigPlugin implements IMixinConfigPlugin { } @Override - public void onLoad(String mixinPackage) { - - } + public void onLoad(String mixinPackage) { } @Override public String getRefMapperConfig() { @@ -81,9 +80,7 @@ public class IndigoMixinConfigPlugin implements IMixinConfigPlugin { } @Override - public void acceptTargets(Set myTargets, Set otherTargets) { - - } + public void acceptTargets(Set myTargets, Set otherTargets) { } @Override public List getMixins() { @@ -91,12 +88,8 @@ public class IndigoMixinConfigPlugin implements IMixinConfigPlugin { } @Override - public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { } @Override - public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { } } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/IndigoRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/IndigoRenderer.java index c02a8addc..fa005f0ec 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/IndigoRenderer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/IndigoRenderer.java @@ -18,13 +18,14 @@ package net.fabricmc.indigo.renderer; import java.util.HashMap; +import net.minecraft.util.Identifier; + import net.fabricmc.fabric.api.renderer.v1.Renderer; import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; import net.fabricmc.indigo.renderer.RenderMaterialImpl.Value; import net.fabricmc.indigo.renderer.mesh.MeshBuilderImpl; -import net.minecraft.util.Identifier; /** * The Fabric default renderer implementation. Supports all @@ -41,8 +42,7 @@ public class IndigoRenderer implements Renderer { private final HashMap materialMap = new HashMap<>(); - private IndigoRenderer() { - }; + private IndigoRenderer() { } @Override public MeshBuilder meshBuilder() { @@ -62,7 +62,7 @@ public class IndigoRenderer implements Renderer { @Override public boolean registerMaterial(Identifier id, RenderMaterial material) { if (materialMap.containsKey(id)) return false; - + // cast to prevent acceptance of impostor implementations materialMap.put(id, material); return true; diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/RenderMaterialImpl.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/RenderMaterialImpl.java index 983da32b3..1fa71bede 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/RenderMaterialImpl.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/RenderMaterialImpl.java @@ -18,10 +18,11 @@ package net.fabricmc.indigo.renderer; import com.google.common.base.Preconditions; +import net.minecraft.util.math.MathHelper; + import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; -import net.minecraft.util.math.MathHelper; /** * Default implementation of the standard render materials. @@ -39,7 +40,7 @@ public abstract class RenderMaterialImpl { private static final int AO_FLAG = DIFFUSE_FLAG << 1; public static final int VALUE_COUNT = (AO_FLAG << 1); - static private final Value[] VALUES = new Value[VALUE_COUNT]; + private static final Value[] VALUES = new Value[VALUE_COUNT]; static { for (int i = 0; i < VALUE_COUNT; i++) { @@ -104,6 +105,7 @@ public abstract class RenderMaterialImpl { if (blendMode == null) { blendMode = BlendMode.DEFAULT; } + bits = (bits & ~BLEND_MODE_MASK) | blendMode.ordinal(); return this; } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRendererData.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRendererData.java index c2f0ec123..0f2a387c9 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRendererData.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRendererData.java @@ -21,7 +21,7 @@ import net.minecraft.client.render.RenderLayer; public interface AccessChunkRendererData { /** * Mark internal tracking set that buffer has been initialized. - * + * * @param renderLayer Layer to be initialized. * @return {@code true} if layer was not already initialized. */ @@ -29,7 +29,7 @@ public interface AccessChunkRendererData { /** * Mark internal tracking set that buffer has content. - * + * * @param renderLayer Layer with content. */ void fabric_markPopulated(RenderLayer renderLayer); diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoCalculator.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoCalculator.java index 2b86c3713..0ac4c9853 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoCalculator.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoCalculator.java @@ -33,6 +33,13 @@ import java.util.function.ToIntFunction; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import net.minecraft.block.Block; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.BlockRenderView; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.indigo.Indigo; @@ -42,13 +49,6 @@ import net.fabricmc.indigo.renderer.mesh.EncodingFormat; import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; import net.fabricmc.indigo.renderer.mesh.QuadViewImpl; import net.fabricmc.indigo.renderer.render.BlockRenderInfo; -import net.minecraft.block.Block; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3i; -import net.minecraft.world.BlockRenderView; /** * Adaptation of inner, non-static class in BlockModelRenderer that serves same purpose. @@ -57,11 +57,11 @@ import net.minecraft.world.BlockRenderView; public class AoCalculator { /** Used to receive a method reference in constructor for ao value lookup. */ @FunctionalInterface - public static interface AoFunc { + public interface AoFunc { float apply(BlockPos pos); } - /** + /** * Vanilla models with cubic quads have vertices in a certain order, which allows * us to map them using a lookup. Adapted from enum in vanilla AoCalculator. */ @@ -84,13 +84,13 @@ public class AoCalculator { private final ToIntFunction brightnessFunc; private final AoFunc aoFunc; - /** caches results of {@link #computeFace(Direction, boolean)} for the current block */ + /** caches results of {@link #computeFace(Direction, boolean)} for the current block. */ private final AoFaceData[] faceData = new AoFaceData[12]; - /** indicates which elements of {@link #faceData} have been computed for the current block*/ + /** indicates which elements of {@link #faceData} have been computed for the current block. */ private int completionFlags = 0; - /** holds per-corner weights - used locally to avoid new allocation */ + /** holds per-corner weights - used locally to avoid new allocation. */ private final float[] w = new float[4]; // outputs @@ -108,7 +108,7 @@ public class AoCalculator { } } - /** call at start of each new block */ + /** call at start of each new block. */ public void clear() { completionFlags = 0; } @@ -135,8 +135,8 @@ public class AoCalculator { shouldCompare = Indigo.DEBUG_COMPARE_LIGHTING && isVanilla; break; - default: case HYBRID: + default: if (isVanilla) { shouldCompare = Indigo.DEBUG_COMPARE_LIGHTING; calcFastVanilla(quad); @@ -144,6 +144,7 @@ public class AoCalculator { shouldCompare = false; calcEnhanced(quad); } + break; case ENHANCED: @@ -244,17 +245,17 @@ public class AoCalculator { } } - /** used in {@link #blendedInsetFace(QuadViewImpl quad, int vertexIndex, Direction lightFace)} as return variable to avoid new allocation */ + /** used in {@link #blendedInsetFace(QuadViewImpl quad, int vertexIndex, Direction lightFace)} as return variable to avoid new allocation. */ AoFaceData tmpFace = new AoFaceData(); - /** Returns linearly interpolated blend of outer and inner face based on depth of vertex in face */ + /** Returns linearly interpolated blend of outer and inner face based on depth of vertex in face. */ private AoFaceData blendedInsetFace(QuadViewImpl quad, int vertexIndex, Direction lightFace) { final float w1 = AoFace.get(lightFace).depthFunc.apply(quad, vertexIndex); final float w0 = 1 - w1; return AoFaceData.weightedMean(computeFace(lightFace, true), w0, computeFace(lightFace, false), w1, tmpFace); } - /** + /** * Like {@link #blendedInsetFace(QuadViewImpl quad, int vertexIndex, Direction lightFace)} but optimizes if depth is 0 or 1. * Used for irregular faces when depth varies by vertex to avoid unneeded interpolation. */ @@ -290,7 +291,7 @@ public class AoCalculator { final Vector3f faceNorm = quad.faceNormal(); Vector3f normal; final float[] w = this.w; - final float aoResult[] = this.ao; + final float[] aoResult = this.ao; final int[] lightResult = this.light; for (int i = 0; i < 4; i++) { @@ -360,7 +361,7 @@ public class AoCalculator { /** * Computes smoothed brightness and Ao shading for four corners of a block face. * Outer block face is what you normally see and what you get get when second - * parameter is true. Inner is light *within* the block and usually darker. + * parameter is true. Inner is light *within* the block and usually darker. * It is blended with the outer face for inset surfaces, but is also used directly * in vanilla logic for some blocks that aren't full opaque cubes. * Except for parameterization, the logic itself is practically identical to vanilla. @@ -396,16 +397,16 @@ public class AoCalculator { // vanilla was further offsetting these in the direction of the light face // but it was actually mis-sampling and causing visible artifacts in certain situation - searchPos.set(lightPos).setOffset(aoFace.neighbors[0]);//.setOffset(lightFace); + searchPos.set(lightPos).setOffset(aoFace.neighbors[0]); //.setOffset(lightFace); if (!Indigo.FIX_SMOOTH_LIGHTING_OFFSET) searchPos.setOffset(lightFace); final boolean isClear0 = world.getBlockState(searchPos).getOpacity(world, searchPos) == 0; - searchPos.set(lightPos).setOffset(aoFace.neighbors[1]);//.setOffset(lightFace); + searchPos.set(lightPos).setOffset(aoFace.neighbors[1]); //.setOffset(lightFace); if (!Indigo.FIX_SMOOTH_LIGHTING_OFFSET) searchPos.setOffset(lightFace); final boolean isClear1 = world.getBlockState(searchPos).getOpacity(world, searchPos) == 0; - searchPos.set(lightPos).setOffset(aoFace.neighbors[2]);//.setOffset(lightFace); + searchPos.set(lightPos).setOffset(aoFace.neighbors[2]); //.setOffset(lightFace); if (!Indigo.FIX_SMOOTH_LIGHTING_OFFSET) searchPos.setOffset(lightFace); final boolean isClear2 = world.getBlockState(searchPos).getOpacity(world, searchPos) == 0; - searchPos.set(lightPos).setOffset(aoFace.neighbors[3]);//.setOffset(lightFace); + searchPos.set(lightPos).setOffset(aoFace.neighbors[3]); //.setOffset(lightFace); if (!Indigo.FIX_SMOOTH_LIGHTING_OFFSET) searchPos.setOffset(lightFace); final boolean isClear3 = world.getBlockState(searchPos).getOpacity(world, searchPos) == 0; @@ -455,7 +456,7 @@ public class AoCalculator { // If on block face or neighbor isn't occluding, "center" will be neighbor brightness // Doesn't use light pos because logic not based solely on this block's geometry int lightCenter; - searchPos.set((Vec3i) pos).setOffset(lightFace); + searchPos.set(pos).setOffset(lightFace); if (isOnBlockFace || !world.getBlockState(searchPos).isFullOpaque(world, searchPos)) { lightCenter = brightnessFunc.applyAsInt(searchPos); @@ -475,12 +476,13 @@ public class AoCalculator { result.l2(meanBrightness(light2, light1, cLight2, lightCenter)); result.l3(meanBrightness(light3, light1, cLight3, lightCenter)); } + return result; } - /** + /** * Vanilla code excluded missing light values from mean but was not isotropic. - * Still need to substitute or edges are too dark but consistently use the min + * Still need to substitute or edges are too dark but consistently use the min * value from all four samples. */ private static int meanBrightness(int a, int b, int c, int d) { @@ -491,7 +493,7 @@ public class AoCalculator { } } - /** vanilla logic - excludes missing light values from mean and has anisotropy defect mentioned above */ + /** vanilla logic - excludes missing light values from mean and has anisotropy defect mentioned above. */ private static int vanillaMeanBrightness(int a, int b, int c, int d) { if (a == 0) a = d; if (b == 0) b = d; diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoConfig.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoConfig.java index 70f179c18..95b9f8225 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoConfig.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoConfig.java @@ -22,9 +22,9 @@ package net.fabricmc.indigo.renderer.aocalc; */ public enum AoConfig { /** - * Quads will be lit with a slightly modified copy of the vanilla ambient - * occlusion calculator. Quads with triangles, non-square or slopes will - * not look good in this model. This model also requires a fixed vertex + * Quads will be lit with a slightly modified copy of the vanilla ambient + * occlusion calculator. Quads with triangles, non-square or slopes will + * not look good in this model. This model also requires a fixed vertex * winding order for all quads. */ VANILLA, @@ -34,18 +34,18 @@ public enum AoConfig { * similar to vanilla lighting for face-aligned quads, and will be different * (generally better) for triangles, non-square and sloped quads. Axis- * aligned quads not on the block face will have interpolated brightness based - * on depth instead of the all-or-nothing brightness of vanilla.

- * - * Non-vanilla quads can have vertices in any (counter-clockwise) order.

+ * on depth instead of the all-or-nothing brightness of vanilla. + * + *

Non-vanilla quads can have vertices in any (counter-clockwise) order. */ ENHANCED, /** * Enhanced lighting is configured to mimic vanilla lighting. Results will be - * identical to vanilla except that non-square quads, triangles, etc. will + * identical to vanilla except that non-square quads, triangles, etc. will * not be sensitive to vertex order. However shading will not be interpolated * as it is with enhanced. These quads do not occur in vanilla models. - * Not recommended for models with complex geometry, but may be faster than + * Not recommended for models with complex geometry, but may be faster than * the vanilla calculator when vanilla lighting is desired. */ EMULATE, @@ -53,7 +53,7 @@ public enum AoConfig { /** * Quads from vanilla models are lit using {@link #EMULATE} mode and all * other quads are lit using {@link #ENHANCED} mode. This mode ensures - * all vanilla models retain their normal appearance while providing + * all vanilla models retain their normal appearance while providing * better lighting for models with more complex geometry. However, * inconsistencies may be visible when vanilla and non-vanilla models are * near each other. diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFace.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFace.java index fb1e03bc4..aed2e8c5c 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFace.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFace.java @@ -16,13 +16,19 @@ package net.fabricmc.indigo.renderer.aocalc; -import static net.minecraft.util.math.Direction.*; import static net.fabricmc.indigo.renderer.aocalc.AoVertexClampFunction.CLAMP_FUNC; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import static net.minecraft.util.math.Direction.DOWN; +import static net.minecraft.util.math.Direction.EAST; +import static net.minecraft.util.math.Direction.NORTH; +import static net.minecraft.util.math.Direction.SOUTH; +import static net.minecraft.util.math.Direction.UP; +import static net.minecraft.util.math.Direction.WEST; + import net.minecraft.util.SystemUtil; import net.minecraft.util.math.Direction; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.indigo.renderer.mesh.QuadViewImpl; /** @@ -36,35 +42,40 @@ enum AoFace { w[0] = (1 - u) * v; w[1] = (1 - u) * (1 - v); w[2] = u * (1 - v); - w[3] = u * v;}), + w[3] = u * v; + }), AOF_UP(new Direction[] { EAST, WEST, NORTH, SOUTH }, (q, i) -> 1 - CLAMP_FUNC.clamp(q.y(i)), (q, i, w) -> { final float u = CLAMP_FUNC.clamp(q.x(i)); final float v = CLAMP_FUNC.clamp(q.z(i)); w[0] = u * v; w[1] = u * (1 - v); w[2] = (1 - u) * (1 - v); - w[3] = (1 - u) * v;}), + w[3] = (1 - u) * v; + }), AOF_NORTH(new Direction[] { UP, DOWN, EAST, WEST }, (q, i) -> CLAMP_FUNC.clamp(q.z(i)), (q, i, w) -> { final float u = CLAMP_FUNC.clamp(q.y(i)); final float v = CLAMP_FUNC.clamp(q.x(i)); w[0] = u * (1 - v); w[1] = u * v; w[2] = (1 - u) * v; - w[3] = (1 - u) * (1 - v);}), + w[3] = (1 - u) * (1 - v); + }), AOF_SOUTH(new Direction[] { WEST, EAST, DOWN, UP }, (q, i) -> 1 - CLAMP_FUNC.clamp(q.z(i)), (q, i, w) -> { final float u = CLAMP_FUNC.clamp(q.y(i)); final float v = CLAMP_FUNC.clamp(q.x(i)); w[0] = u * (1 - v); w[1] = (1 - u) * (1 - v); w[2] = (1 - u) * v; - w[3] = u * v;}), + w[3] = u * v; + }), AOF_WEST(new Direction[] { UP, DOWN, NORTH, SOUTH }, (q, i) -> CLAMP_FUNC.clamp(q.x(i)), (q, i, w) -> { final float u = CLAMP_FUNC.clamp(q.y(i)); final float v = CLAMP_FUNC.clamp(q.z(i)); w[0] = u * v; w[1] = u * (1 - v); w[2] = (1 - u) * (1 - v); - w[3] = (1 - u) * v;}), + w[3] = (1 - u) * v; + }), AOF_EAST(new Direction[] { DOWN, UP, NORTH, SOUTH }, (q, i) -> 1 - CLAMP_FUNC.clamp(q.x(i)), (q, i, w) -> { final float u = CLAMP_FUNC.clamp(q.y(i)); final float v = CLAMP_FUNC.clamp(q.z(i)); @@ -78,13 +89,13 @@ enum AoFace { final WeightFunction weightFunc; final Vertex2Float depthFunc; - private AoFace(Direction[] faces, Vertex2Float depthFunc, WeightFunction weightFunc) { + AoFace(Direction[] faces, Vertex2Float depthFunc, WeightFunction weightFunc) { this.neighbors = faces; this.depthFunc = depthFunc; this.weightFunc = weightFunc; } - private static final AoFace[] values = (AoFace[]) SystemUtil.consume(new AoFace[6], (neighborData) -> { + private static final AoFace[] values = SystemUtil.consume(new AoFace[6], (neighborData) -> { neighborData[DOWN.getId()] = AOF_DOWN; neighborData[UP.getId()] = AOF_UP; neighborData[NORTH.getId()] = AOF_NORTH; @@ -99,19 +110,19 @@ enum AoFace { /** * Implementations handle bilinear interpolation of a point on a light face - * by computing weights for each corner of the light face. Relies on the fact + * by computing weights for each corner of the light face. Relies on the fact * that each face is a unit cube. Uses coordinates from axes orthogonal to face - * as distance from the edge of the cube, flipping as needed. Multiplying distance - * coordinate pairs together gives sub-area that are the corner weights. + * as distance from the edge of the cube, flipping as needed. Multiplying distance + * coordinate pairs together gives sub-area that are the corner weights. * Weights sum to 1 because it is a unit cube. Values are stored in the provided array. */ @FunctionalInterface - static interface WeightFunction { + interface WeightFunction { void apply(QuadViewImpl q, int vertexIndex, float[] out); } @FunctionalInterface - static interface Vertex2Float { + interface Vertex2Float { float apply(QuadViewImpl q, int vertexIndex); } -} \ No newline at end of file +} diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFaceData.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFaceData.java index 89d1025b5..36962a4f8 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFaceData.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoFaceData.java @@ -99,4 +99,4 @@ class AoFaceData { return out; } -} \ No newline at end of file +} diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoLuminanceFix.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoLuminanceFix.java index 36f0a101d..1ebbb905f 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoLuminanceFix.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoLuminanceFix.java @@ -16,11 +16,12 @@ package net.fabricmc.indigo.renderer.aocalc; -import net.fabricmc.indigo.Indigo; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockView; +import net.fabricmc.indigo.Indigo; + /** * Implements a fix to prevent luminous blocks from casting AO shade. * Will give normal result if fix is disabled. diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoVertexClampFunction.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoVertexClampFunction.java index 129cfa44f..d600f4869 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoVertexClampFunction.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/AoVertexClampFunction.java @@ -26,4 +26,4 @@ interface AoVertexClampFunction { float clamp(float x); AoVertexClampFunction CLAMP_FUNC = Indigo.FIX_EXTERIOR_VERTEX_LIGHTING ? x -> x < 0f ? 0f : (x > 1f ? 1f : x) : x -> x; -} \ No newline at end of file +} diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/VanillaAoHelper.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/VanillaAoHelper.java index 91b57c75f..ba7904bde 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/VanillaAoHelper.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/aocalc/VanillaAoHelper.java @@ -20,20 +20,21 @@ import java.lang.reflect.Constructor; import java.util.BitSet; import java.util.function.Supplier; -import net.fabricmc.indigo.Indigo; -import net.fabricmc.indigo.renderer.accessor.AccessAmbientOcclusionCalculator; -import net.fabricmc.indigo.renderer.accessor.AccessBlockModelRenderer; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.BlockState; import net.minecraft.client.render.block.BlockModelRenderer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockRenderView; +import net.fabricmc.indigo.Indigo; +import net.fabricmc.indigo.renderer.accessor.AccessAmbientOcclusionCalculator; +import net.fabricmc.indigo.renderer.accessor.AccessBlockModelRenderer; +import net.fabricmc.loader.api.FabricLoader; + public class VanillaAoHelper { private static Supplier factory; - // Renderer method we call isn't declared as static, but uses no + // Renderer method we call isn't declared as static, but uses no // instance data and is called from multiple threads in vanilla also. private static AccessBlockModelRenderer blockRenderer; @@ -54,7 +55,7 @@ public class VanillaAoHelper { try { return (AccessAmbientOcclusionCalculator) constructor.newInstance(instance); } catch (Exception e) { - Indigo.LOGGER.warn("[Indigo] Exception accessing vanilla smooth lighter", e); + Indigo.LOGGER.warn("[Indigo] Exception accessing vanilla smooth lighter", e); return null; } } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/ColorHelper.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/ColorHelper.java index 48d952da3..625581e4c 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/ColorHelper.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/ColorHelper.java @@ -19,11 +19,13 @@ package net.fabricmc.indigo.renderer.helper; import java.nio.ByteOrder; import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; + import net.minecraft.client.render.model.BakedQuadFactory; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; + /** * Static routines of general utility for renderer implementations. * Renderers are not required to use these helpers, but they were @@ -31,18 +33,18 @@ import net.minecraft.util.math.Direction; */ public abstract class ColorHelper { private ColorHelper() { } - + /** * Implement on quads to use methods that require it. * Allows for much cleaner method signatures. */ - public static interface ShadeableQuad extends MutableQuadView { + public interface ShadeableQuad extends MutableQuadView { boolean isFaceAligned(); boolean needsDiffuseShading(int textureIndex); } - /** Same as vanilla values */ + /** Same as vanilla values. */ private static final float[] FACE_SHADE_FACTORS = { 0.5F, 1.0F, 0.8F, 0.8F, 0.6F, 0.6F }; private static final Int2IntFunction colorSwapper = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? color -> ((color & 0xFF00FF00) | ((color & 0x00FF0000) >> 16) | ((color & 0xFF) << 16)) : color -> color; @@ -81,7 +83,7 @@ public abstract class ColorHelper { } /** - * Same results as {@link BakedQuadFactory#method_3456(Direction)} + * Same results as {@link BakedQuadFactory#method_3456(Direction)}. */ public static float diffuseShade(Direction direction) { return FACE_SHADE_FACTORS[direction.getId()]; @@ -100,7 +102,7 @@ public abstract class ColorHelper { } /** - * See {@link diffuseShade} + * @see #diffuseShade */ public static float vertexShade(ShadeableQuad q, int vertexIndex, float faceShade) { return q.hasNormal(vertexIndex) ? normalShade(q.normalX(vertexIndex), q.normalY(vertexIndex), q.normalZ(vertexIndex)) : faceShade; @@ -108,22 +110,21 @@ public abstract class ColorHelper { /** * Returns {@link #diffuseShade(Direction)} if quad is aligned to light face, - * otherwise uses face normal and {@link #normalShade} + * otherwise uses face normal and {@link #normalShade}. */ public static float faceShade(ShadeableQuad quad) { return quad.isFaceAligned() ? diffuseShade(quad.lightFace()) : normalShade(quad.faceNormal()); } @FunctionalInterface - private static interface VertexLighter { + private interface VertexLighter { void shade(ShadeableQuad quad, int vertexIndex, float shade); } private static VertexLighter[] VERTEX_LIGHTERS = new VertexLighter[8]; static { - VERTEX_LIGHTERS[0b000] = (q, i, s) -> { - }; + VERTEX_LIGHTERS[0b000] = (q, i, s) -> { }; VERTEX_LIGHTERS[0b001] = (q, i, s) -> q.spriteColor(i, 0, multiplyRGB(q.spriteColor(i, 0), s)); VERTEX_LIGHTERS[0b010] = (q, i, s) -> q.spriteColor(i, 1, multiplyRGB(q.spriteColor(i, 1), s)); VERTEX_LIGHTERS[0b011] = (q, i, s) -> q.spriteColor(i, 0, multiplyRGB(q.spriteColor(i, 0), s)).spriteColor(i, 1, multiplyRGB(q.spriteColor(i, 1), s)); @@ -135,9 +136,9 @@ public abstract class ColorHelper { /** * Honors vertex normals and uses non-cubic face normals for non-cubic quads. - * - * @param quad Quad to be shaded/unshaded.

- * + * + * @param quad Quad to be shaded/unshaded. + * * @param undo If true, will reverse prior application. Does not check that * prior application actually happened. Use to "unbake" a quad. * Some drift of colors may occur due to floating-point precision error. @@ -145,21 +146,21 @@ public abstract class ColorHelper { public static void applyDiffuseShading(ShadeableQuad quad, boolean undo) { final float faceShade = faceShade(quad); int i = quad.needsDiffuseShading(0) ? 1 : 0; - + if (quad.needsDiffuseShading(1)) { i |= 2; } - + if (quad.needsDiffuseShading(2)) { i |= 4; } - + if (i == 0) { return; } final VertexLighter shader = VERTEX_LIGHTERS[i]; - + for (int j = 0; j < 4; j++) { final float vertexShade = vertexShade(quad, j, faceShade); shader.shade(quad, j, undo ? 1f / vertexShade : vertexShade); @@ -167,13 +168,12 @@ public abstract class ColorHelper { } /** - * Component-wise max + * Component-wise max. */ public static int maxBrightness(int b0, int b1) { - if (b0 == 0) - return b1; - else if (b1 == 0) - return b0; + if (b0 == 0) return b1; + if (b1 == 0) return b0; + return Math.max(b0 & 0xFFFF, b1 & 0xFFFF) | Math.max(b0 & 0xFFFF0000, b1 & 0xFFFF0000); } } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/GeometryHelper.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/GeometryHelper.java index 1d6c20467..c2bd15861 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/GeometryHelper.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/GeometryHelper.java @@ -18,13 +18,14 @@ package net.fabricmc.indigo.renderer.helper; import static net.minecraft.util.math.MathHelper.approximatelyEquals; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction.Axis; import net.minecraft.util.math.Direction.AxisDirection; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; + /** * Static routines of general utility for renderer implementations. * Renderers are not required to use these helpers, but they were @@ -32,24 +33,24 @@ import net.minecraft.util.math.Direction.AxisDirection; */ public abstract class GeometryHelper { private GeometryHelper() { } - - /** set when a quad touches all four corners of a unit cube */ + + /** set when a quad touches all four corners of a unit cube. */ public static final int CUBIC_FLAG = 1; - /** set when a quad is parallel to (but not necessarily on) a its light face */ + /** set when a quad is parallel to (but not necessarily on) a its light face. */ public static final int AXIS_ALIGNED_FLAG = CUBIC_FLAG << 1; /** set when a quad is coplanar with its light face. Implies {@link #AXIS_ALIGNED_FLAG} */ public static final int LIGHT_FACE_FLAG = AXIS_ALIGNED_FLAG << 1; - /** how many bits quad header encoding should reserve for encoding geometry flags */ + /** how many bits quad header encoding should reserve for encoding geometry flags. */ public static final int FLAG_BIT_COUNT = 3; private static final float EPS_MIN = 0.0001f; private static final float EPS_MAX = 1.0f - EPS_MIN; /** - * Analyzes the quad and returns a value with some combination + * Analyzes the quad and returns a value with some combination * of {@link #AXIS_ALIGNED_FLAG}, {@link #LIGHT_FACE_FLAG} and {@link #CUBIC_FLAG}. * Intended use is to optimize lighting when the geometry is regular. * Expects convex quads with all points co-planar. @@ -57,19 +58,19 @@ public abstract class GeometryHelper { public static int computeShapeFlags(QuadView quad) { Direction lightFace = quad.lightFace(); int bits = 0; - + if (isQuadParallelToFace(lightFace, quad)) { bits |= AXIS_ALIGNED_FLAG; - + if (isParallelQuadOnFace(lightFace, quad)) { bits |= LIGHT_FACE_FLAG; } } - + if (isQuadCubic(lightFace, quad)) { bits |= CUBIC_FLAG; } - + return bits; } @@ -82,7 +83,7 @@ public abstract class GeometryHelper { if (face == null) { return false; } - + int i = face.getAxis().ordinal(); final float val = quad.posByIndex(0, i); return approximatelyEquals(val, quad.posByIndex(1, i)) && approximatelyEquals(val, quad.posByIndex(2, i)) && approximatelyEquals(val, quad.posByIndex(3, i)); @@ -90,26 +91,26 @@ public abstract class GeometryHelper { /** * True if quad - already known to be parallel to a face - is actually coplanar with it. - * For compatibility with vanilla resource packs, also true if quad is outside the face.

- * - * Test will be unreliable if not already parallel, use {@link #isQuadParallelToFace(Direction, QuadView)} - * for that purpose. Expects convex quads with all points co-planar.

+ * For compatibility with vanilla resource packs, also true if quad is outside the face. + * + *

Test will be unreliable if not already parallel, use {@link #isQuadParallelToFace(Direction, QuadView)} + * for that purpose. Expects convex quads with all points co-planar. */ public static boolean isParallelQuadOnFace(Direction lightFace, QuadView quad) { if (lightFace == null) return false; - + final float x = quad.posByIndex(0, lightFace.getAxis().ordinal()); return lightFace.getDirection() == AxisDirection.POSITIVE ? x >= EPS_MAX : x <= EPS_MIN; } /** * Returns true if quad is truly a quad (not a triangle) and fills a full block cross-section. - * If known to be true, allows use of a simpler/faster AO lighting algorithm.

- * - * Does not check if quad is actually coplanar with the light face, nor does it check that all - * quad vertices are coplanar with each other.

- * - * Expects convex quads with all points co-planar.

+ * If known to be true, allows use of a simpler/faster AO lighting algorithm. + * + *

Does not check if quad is actually coplanar with the light face, nor does it check that all + * quad vertices are coplanar with each other. + * + *

Expects convex quads with all points co-planar. * * @param lightFace MUST be non-null. */ @@ -146,9 +147,9 @@ public abstract class GeometryHelper { /** * Used by {@link #isQuadCubic(Direction, QuadView)}. - * True if quad touches all four corners of unit square.

+ * True if quad touches all four corners of unit square. * - * For compatibility with resource packs that contain models with quads exceeding + *

For compatibility with resource packs that contain models with quads exceeding * block boundaries, considers corners outside the block to be at the corners. */ private static boolean confirmSquareCorners(int aCoordinate, int bCoordinate, QuadView quad) { @@ -185,9 +186,9 @@ public abstract class GeometryHelper { /** * Identifies the face to which the quad is most closely aligned. * This mimics the value that {@link BakedQuad#getFace()} returns, and is - * used in the vanilla renderer for all diffuse lighting.

- * - * Derived from the quad face normal and expects convex quads with all points co-planar. + * used in the vanilla renderer for all diffuse lighting. + * + *

Derived from the quad face normal and expects convex quads with all points co-planar. */ public static Direction lightFace(QuadView quad) { final Vector3f normal = quad.faceNormal(); @@ -226,7 +227,7 @@ public abstract class GeometryHelper { } /** - * See {@link #longestAxis(float, float, float)} + * @see #longestAxis(float, float, float) */ public static Axis longestAxis(Vector3f vec) { return longestAxis(vec.getX(), vec.getY(), vec.getZ()); @@ -245,6 +246,7 @@ public abstract class GeometryHelper { longest = a; } - return Math.abs(normalZ) > longest ? Axis.Z : result; + return Math.abs(normalZ) > longest + ? Axis.Z : result; } } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/NormalHelper.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/NormalHelper.java index 440616a03..6668e967e 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/NormalHelper.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/NormalHelper.java @@ -16,12 +16,13 @@ package net.fabricmc.indigo.renderer.helper; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3i; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; + /** * Static routines of general utility for renderer implementations. * Renderers are not required to use these helpers, but they were @@ -52,24 +53,25 @@ public abstract class NormalHelper { } /** - * Retrieves values packed by {@link #packNormal(float, float, float, float)} - * Components are x, y, z, w - zero based + * Retrieves values packed by {@link #packNormal(float, float, float, float)}. + * + *

Components are x, y, z, w - zero based. */ public static float getPackedNormalComponent(int packedNormal, int component) { - return ((float) (byte) (packedNormal >> (8 * component))) / 127f; + return ((byte) (packedNormal >> (8 * component))) / 127f; } /** * Computes the face normal of the given quad and saves it in the provided non-null vector. * If {@link QuadView#nominalFace()} is set will optimize by confirming quad is parallel to that - * face and, if so, use the standard normal for that face direction.

- * - * Will work with triangles also. Assumes counter-clockwise winding order, which is the norm. + * face and, if so, use the standard normal for that face direction. + * + *

Will work with triangles also. Assumes counter-clockwise winding order, which is the norm. * Expects convex quads with all points co-planar. */ public static void computeFaceNormal(Vector3f saveTo, QuadView q) { final Direction nominalFace = q.nominalFace(); - + if (GeometryHelper.isQuadParallelToFace(nominalFace, q)) { Vec3i vec = nominalFace.getVector(); saveTo.set(vec.getX(), vec.getY(), vec.getZ()); @@ -99,6 +101,7 @@ public abstract class NormalHelper { float normX = dy0 * dz1 - dz0 * dy1; float normY = dz0 * dx1 - dx0 * dz1; float normZ = dx0 * dy1 - dy0 * dx1; + float l = (float) Math.sqrt(normX * normX + normY * normY + normZ * normZ); if (l != 0) { diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/TextureHelper.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/TextureHelper.java index 725000926..a0c8a1508 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/TextureHelper.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/helper/TextureHelper.java @@ -16,10 +16,11 @@ package net.fabricmc.indigo.renderer.helper; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.minecraft.client.texture.Sprite; import net.minecraft.util.math.Direction; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; + /** * Handles most texture-baking use cases for model loaders and model libraries * via {@link #bakeSprite(MutableQuadView, int, Sprite, int)}. Also used by the API @@ -27,12 +28,12 @@ import net.minecraft.util.math.Direction; */ public class TextureHelper { private TextureHelper() { } - + private static final float NORMALIZER = 1f / 16f; /** * Bakes textures in the provided vertex data, handling UV locking, - * rotation, interpolation, etc. Textures must not be already baked. + * rotation, interpolation, etc. Textures must not be already baked. */ public static void bakeSprite(MutableQuadView quad, int spriteIndex, Sprite sprite, int bakeFlags) { if (quad.nominalFace() != null && (MutableQuadView.BAKE_LOCK_UV & bakeFlags) != 0) { @@ -44,7 +45,7 @@ public class TextureHelper { } final int rotation = bakeFlags & 3; - + if (rotation != 0) { // Rotates texture around the center of sprite. // Assumes normalized coordinates. @@ -65,7 +66,7 @@ public class TextureHelper { } /** - * Faster than sprite method. Sprite computes span and normalizes inputs each call, + * Faster than sprite method. Sprite computes span and normalizes inputs each call, * so we'd have to denormalize before we called, only to have the sprite renormalize immediately. */ private static void interpolate(MutableQuadView q, int spriteIndex, Sprite sprite) { @@ -73,14 +74,14 @@ public class TextureHelper { final float uSpan = sprite.getMaxU() - uMin; final float vMin = sprite.getMinV(); final float vSpan = sprite.getMaxV() - vMin; - + for (int i = 0; i < 4; i++) { q.sprite(i, spriteIndex, uMin + q.spriteU(i, spriteIndex) * uSpan, vMin + q.spriteV(i, spriteIndex) * vSpan); } } @FunctionalInterface - private static interface VertexModifier { + private interface VertexModifier { void apply(MutableQuadView quad, int vertexIndex, int spriteIndex); } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java index d785790e5..256115bf0 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java @@ -18,15 +18,16 @@ package net.fabricmc.indigo.renderer.mesh; import com.google.common.base.Preconditions; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; -import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; -import net.fabricmc.indigo.renderer.RenderMaterialImpl; -import net.fabricmc.indigo.renderer.helper.GeometryHelper; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; +import net.fabricmc.indigo.renderer.RenderMaterialImpl; +import net.fabricmc.indigo.renderer.helper.GeometryHelper; + /** * Holds all the array offsets and bit-wise encoders/decoders for * packing/unpacking quad data in an array of integers. @@ -73,7 +74,7 @@ public abstract class EncodingFormat { Preconditions.checkState(QUAD_STRIDE == QuadView.VANILLA_QUAD_STRIDE, "Indigo quad stride (%s) mismatched with rendering API (%s)", QUAD_STRIDE, QuadView.VANILLA_QUAD_STRIDE); } - /** used for quick clearing of quad buffers */ + /** used for quick clearing of quad buffers. */ static final int[] EMPTY = new int[TOTAL_STRIDE]; private static final int DIRECTION_MASK = MathHelper.smallestEncompassingPowerOfTwo(ModelHelper.NULL_FACE_ID) - 1; @@ -114,7 +115,7 @@ public abstract class EncodingFormat { return (bits & LIGHT_INVERSE_MASK) | (ModelHelper.toFaceIndex(face) << LIGHT_SHIFT); } - /** indicate if vertex normal has been set - bits correspond to vertex ordinals */ + /** indicate if vertex normal has been set - bits correspond to vertex ordinals. */ static int normalFlags(int bits) { return (bits >> NORMALS_SHIFT) & NORMALS_MASK; } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshBuilderImpl.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshBuilderImpl.java index e7936d277..f5e593c25 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshBuilderImpl.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshBuilderImpl.java @@ -27,7 +27,7 @@ import net.fabricmc.indigo.renderer.helper.GeometryHelper; * Not much to it - mainly it just needs to grow the int[] array as quads are appended * and maintain/provide a properly-configured {@link net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView} instance. * All the encoding and other work is handled in the quad base classes. - * The one interesting bit is in {@link Maker#emit()}. + * The one interesting bit is in {@link Maker#emit()}. */ public class MeshBuilderImpl implements MeshBuilder { int[] data = new int[256]; @@ -65,17 +65,17 @@ public class MeshBuilderImpl implements MeshBuilder { * Our base classes are used differently so we define final * encoding steps in subtypes. This will be a static mesh used * at render time so we want to capture all geometry now and - * apply non-location-dependent lighting. + * apply non-location-dependent lighting. */ private class Maker extends MutableQuadViewImpl implements QuadEmitter { @Override public Maker emit() { lightFace(GeometryHelper.lightFace(this)); - + if (isGeometryInvalid) { geometryFlags(GeometryHelper.computeShapeFlags(this)); } - + ColorHelper.applyDiffuseShading(this, false); index += EncodingFormat.TOTAL_STRIDE; ensureCapacity(EncodingFormat.TOTAL_STRIDE); diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshImpl.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshImpl.java index b49d9de2e..bcb98fefb 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshImpl.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MeshImpl.java @@ -31,7 +31,7 @@ public class MeshImpl implements Mesh { final int[] data; - MeshImpl(int data[]) { + MeshImpl(int[] data) { this.data = data; } @@ -52,7 +52,7 @@ public class MeshImpl implements Mesh { void forEach(Consumer consumer, QuadViewImpl cursor) { final int limit = data.length; int index = 0; - + while (index < limit) { cursor.load(data, index); consumer.accept(cursor); diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MutableQuadViewImpl.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MutableQuadViewImpl.java index 9ecb5fbe4..ac2f8eba9 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MutableQuadViewImpl.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/MutableQuadViewImpl.java @@ -17,8 +17,8 @@ package net.fabricmc.indigo.renderer.mesh; import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.EMPTY; -import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.HEADER_COLOR_INDEX; import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.HEADER_BITS; +import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.HEADER_COLOR_INDEX; import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.HEADER_STRIDE; import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.HEADER_TAG; import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.QUAD_STRIDE; @@ -31,6 +31,9 @@ import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.VERTEX_X; import com.google.common.base.Preconditions; +import net.minecraft.client.texture.Sprite; +import net.minecraft.util.math.Direction; + import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.indigo.renderer.IndigoRenderer; @@ -39,8 +42,6 @@ import net.fabricmc.indigo.renderer.helper.ColorHelper.ShadeableQuad; import net.fabricmc.indigo.renderer.helper.GeometryHelper; import net.fabricmc.indigo.renderer.helper.NormalHelper; import net.fabricmc.indigo.renderer.helper.TextureHelper; -import net.minecraft.client.texture.Sprite; -import net.minecraft.util.math.Direction; /** * Almost-concrete implementation of a mutable quad. The only missing part is {@link #emit()}, diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/QuadViewImpl.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/QuadViewImpl.java index a79190385..f8555ac2b 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/QuadViewImpl.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/QuadViewImpl.java @@ -33,13 +33,14 @@ import static net.fabricmc.indigo.renderer.mesh.EncodingFormat.VERTEX_Z; import com.google.common.base.Preconditions; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.Direction; + import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.fabricmc.indigo.renderer.RenderMaterialImpl; import net.fabricmc.indigo.renderer.helper.GeometryHelper; import net.fabricmc.indigo.renderer.helper.NormalHelper; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.Direction; /** * Base class for all quads / quad makers. Handles the ugly bits @@ -101,7 +102,7 @@ public class QuadViewImpl implements QuadView { return normalFlags() != 0; } - /** gets flags used for lighting - lazily computed via {@link GeometryHelper#computeShapeFlags(QuadView)} */ + /** gets flags used for lighting - lazily computed via {@link GeometryHelper#computeShapeFlags(QuadView)}. */ public int geometryFlags() { if (isGeometryInvalid) { isGeometryInvalid = false; @@ -114,7 +115,7 @@ public class QuadViewImpl implements QuadView { } /** - * Used to override geometric analysis for compatibility edge case + * Used to override geometric analysis for compatibility edge case. */ public void geometryFlags(int flags) { isGeometryInvalid = false; @@ -162,7 +163,7 @@ public class QuadViewImpl implements QuadView { NormalHelper.computeFaceNormal(faceNormal, this); isFaceNormalInvalid = false; } - + return faceNormal; } @@ -231,6 +232,7 @@ public class QuadViewImpl implements QuadView { if (target == null) { target = new Vector3f(); } + final int normal = data[normalIndex(vertexIndex)]; target.set(NormalHelper.getPackedNormalComponent(normal, 0), NormalHelper.getPackedNormalComponent(normal, 1), NormalHelper.getPackedNormalComponent(normal, 2)); return target; diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinAmbientOcclusionCalculator.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinAmbientOcclusionCalculator.java index bf6614819..b825d2128 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinAmbientOcclusionCalculator.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinAmbientOcclusionCalculator.java @@ -21,18 +21,19 @@ import java.util.BitSet; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.fabricmc.indigo.renderer.accessor.AccessAmbientOcclusionCalculator; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockRenderView; +import net.fabricmc.indigo.renderer.accessor.AccessAmbientOcclusionCalculator; + @Mixin(targets = "net.minecraft.client.render.block.BlockModelRenderer$AmbientOcclusionCalculator") public abstract class MixinAmbientOcclusionCalculator implements AccessAmbientOcclusionCalculator { @Shadow private float[] colorMultiplier; @Shadow private int[] brightness; - @Shadow + @Shadow public abstract void apply(BlockRenderView blockRenderView, BlockState blockState, BlockPos pos, Direction face, float[] aoData, BitSet controlBits); @Override diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java index f7cc19d9a..3c3b4b189 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java @@ -19,8 +19,6 @@ package net.fabricmc.indigo.renderer.mixin; import java.util.BitSet; import java.util.Random; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.util.math.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -28,18 +26,21 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.indigo.renderer.accessor.AccessBlockModelRenderer; -import net.fabricmc.indigo.renderer.aocalc.VanillaAoHelper; -import net.fabricmc.indigo.renderer.render.BlockRenderContext; import net.minecraft.block.BlockState; import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.block.BlockModelRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MatrixStack; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.indigo.renderer.accessor.AccessBlockModelRenderer; +import net.fabricmc.indigo.renderer.aocalc.VanillaAoHelper; +import net.fabricmc.indigo.renderer.render.BlockRenderContext; + @Mixin(BlockModelRenderer.class) public abstract class MixinBlockModelRenderer implements AccessBlockModelRenderer { @Shadow @@ -51,19 +52,19 @@ public abstract class MixinBlockModelRenderer implements AccessBlockModelRendere private final ThreadLocal CONTEXTS = ThreadLocal.withInitial(BlockRenderContext::new); @Inject(at = @At("HEAD"), method = "tesselate", cancellable = true) - private void hookTesselate(BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrix, VertexConsumer buffer, boolean checkSides, Random rand, long seed, int overlay, CallbackInfoReturnable ci) { + private void hookTesselate(BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrix, VertexConsumer buffer, boolean checkSides, Random rand, long seed, int overlay, CallbackInfoReturnable ci) { if (!((FabricBakedModel) model).isVanillaAdapter()) { BlockRenderContext context = CONTEXTS.get(); if (!context.isCallingVanilla()) { - ci.setReturnValue(CONTEXTS.get().tesselate((BlockModelRenderer)(Object) this, blockView, model, state, pos, matrix, buffer, checkSides, seed, overlay)); + ci.setReturnValue(CONTEXTS.get().tesselate((BlockModelRenderer) (Object) this, blockView, model, state, pos, matrix, buffer, checkSides, seed, overlay)); } } } @Inject(at = @At("RETURN"), method = "*") private void onInit(CallbackInfo ci) { - VanillaAoHelper.initialize((BlockModelRenderer)(Object) this); + VanillaAoHelper.initialize((BlockModelRenderer) (Object) this); } @Override diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java index c78ff2857..a3b43ad7b 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java @@ -19,9 +19,6 @@ package net.fabricmc.indigo.renderer.mixin; import java.util.Random; import java.util.Set; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.chunk.BlockLayeredBufferBuilderStorage; -import net.minecraft.util.math.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -29,34 +26,38 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.indigo.Indigo; -import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererRegion; -import net.fabricmc.indigo.renderer.render.TerrainRenderContext; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.block.BlockRenderManager; +import net.minecraft.client.render.chunk.BlockLayeredBufferBuilderStorage; import net.minecraft.client.render.chunk.ChunkBatcher; import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderer; import net.minecraft.client.render.chunk.ChunkRendererRegion; import net.minecraft.client.render.model.BakedModel; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MatrixStack; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.indigo.Indigo; +import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererRegion; +import net.fabricmc.indigo.renderer.render.TerrainRenderContext; + /** * Implements the main hooks for terrain rendering. Attempts to tread * lightly. This means we are deliberately stepping over some minor - * optimization opportunities.

- * - * Non-Fabric renderer implementations that are looking to maximize - * performance will likely take a much more aggressive approach. + * optimization opportunities. + * + *

Non-Fabric renderer implementations that are looking to maximize + * performance will likely take a much more aggressive approach. * For that reason, mod authors who want compatibility with advanced - * renderers will do well to steer clear of chunk rebuild hooks unless - * they are creating a renderer.

- * - * These hooks are intended only for the Fabric default renderer and + * renderers will do well to steer clear of chunk rebuild hooks unless + * they are creating a renderer. + * + *

These hooks are intended only for the Fabric default renderer and * aren't expected to be present when a different renderer is being used. * Renderer authors are responsible for creating the hooks they need. * (Though they can use these as an example if they wish.) @@ -78,22 +79,22 @@ public class MixinChunkRebuildTask { } /** - * This is the hook that actually implements the rendering API for terrain rendering.

- * - * It's unusual to have a @Redirect in a Fabric library, but in this case + * This is the hook that actually implements the rendering API for terrain rendering. + * + *

It's unusual to have a @Redirect in a Fabric library, but in this case * it is our explicit intention that {@link BlockRenderManager#tesselateBlock(BlockState, BlockPos, BlockRenderView, BufferBuilder, Random)} - * does not execute for models that will be rendered by our renderer.

- * - * Any mod that wants to redirect this specific call is likely also a renderer, in which case this + * does not execute for models that will be rendered by our renderer. + * + *

Any mod that wants to redirect this specific call is likely also a renderer, in which case this * renderer should not be present, or the mod should probably instead be relying on the renderer API - * which was specifically created to provide for enhanced terrain rendering.

- * - * Note also that {@link BlockRenderManager#tesselateBlock(BlockState, BlockPos, BlockRenderView, BufferBuilder, Random)} + * which was specifically created to provide for enhanced terrain rendering. + * + *

Note also that {@link BlockRenderManager#tesselateBlock(BlockState, BlockPos, BlockRenderView, BufferBuilder, Random)} * IS called if the block render type is something other than {@link BlockRenderType#MODEL}. * Normally this does nothing but will allow mods to create rendering hooks that are * driven off of render type. (Not recommended or encouraged, but also not prevented.) */ - @Redirect(method = "method_22785", require = 1, at = @At(value = "INVOKE", + @Redirect(method = "method_22785", require = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/BlockRenderManager;tesselateBlock(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLjava/util/Random;)Z")) private boolean hookChunkBuildTesselate(BlockRenderManager renderManager, BlockState blockState, BlockPos blockPos, BlockRenderView blockView, MatrixStack matrix, VertexConsumer bufferBuilder, boolean checkSides, Random random) { if (blockState.getRenderType() == BlockRenderType.MODEL) { diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderData.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderData.java index 2c50dcd2b..635368b9e 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderData.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderData.java @@ -18,13 +18,14 @@ package net.fabricmc.indigo.renderer.mixin; import java.util.Set; -import net.minecraft.client.render.RenderLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererData; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderData; +import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererData; + @Mixin(ChunkRenderData.class) public class MixinChunkRenderData implements AccessChunkRendererData { @Shadow diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java index 3538b6aec..32e242e69 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java @@ -19,16 +19,17 @@ package net.fabricmc.indigo.renderer.mixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.fabricmc.indigo.renderer.accessor.AccessChunkRenderer; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderer; +import net.fabricmc.indigo.renderer.accessor.AccessChunkRenderer; + @Mixin(ChunkRenderer.class) public abstract class MixinChunkRenderer implements AccessChunkRenderer { @Shadow abstract void beginBufferBuilding(BufferBuilder builder); - /** + /** * Access method for renderer. */ @Override diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRendererRegion.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRendererRegion.java index 02e32f6d3..8e7e36493 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRendererRegion.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRendererRegion.java @@ -18,9 +18,10 @@ package net.fabricmc.indigo.renderer.mixin; import org.spongepowered.asm.mixin.Mixin; +import net.minecraft.client.render.chunk.ChunkRendererRegion; + import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererRegion; import net.fabricmc.indigo.renderer.render.TerrainRenderContext; -import net.minecraft.client.render.chunk.ChunkRendererRegion; @Mixin(ChunkRendererRegion.class) public abstract class MixinChunkRendererRegion implements AccessChunkRendererRegion { diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java index 0e5e74db6..05b20d4ed 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java @@ -16,21 +16,22 @@ package net.fabricmc.indigo.renderer.mixin; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.util.math.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.indigo.renderer.render.ItemRenderContext; -import net.fabricmc.indigo.renderer.render.ItemRenderContext.VanillaQuadHandler; import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MatrixStack; + +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.indigo.renderer.render.ItemRenderContext; +import net.fabricmc.indigo.renderer.render.ItemRenderContext.VanillaQuadHandler; @Mixin(ItemRenderer.class) public abstract class MixinItemRenderer { diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java index 1ef74e3b7..2c72a0fff 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java @@ -19,6 +19,10 @@ package net.fabricmc.indigo.renderer.render; import java.util.function.Consumer; import java.util.function.Function; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; + import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; @@ -30,9 +34,6 @@ import net.fabricmc.indigo.renderer.helper.GeometryHelper; import net.fabricmc.indigo.renderer.mesh.EncodingFormat; import net.fabricmc.indigo.renderer.mesh.MeshImpl; import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; /** * Consumer for pre-baked meshes. Works by copying the mesh data to a @@ -43,8 +44,8 @@ public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implemen super(blockInfo, bufferFunc, aoCalc, transform); } - /** - * Where we handle all pre-buffer coloring, lighting, transformation, etc. + /** + * Where we handle all pre-buffer coloring, lighting, transformation, etc. * Reused for all mesh quads. Fixed baking array sized to hold largest possible mesh quad. */ private class Maker extends MutableQuadViewImpl implements QuadEmitter { @@ -53,7 +54,7 @@ public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implemen material(IndigoRenderer.MATERIAL_STANDARD); } - // only used via RenderContext.getEmitter() + // only used via RenderContext.getEmitter() @Override public Maker emit() { lightFace(GeometryHelper.lightFace(this)); @@ -62,7 +63,7 @@ public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implemen clear(); return this; } - }; + } private final Maker editorQuad = new Maker(); @@ -105,8 +106,8 @@ public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implemen tesselateQuad(q, mat, 0); } - /** - * Determines color index and render layer, then routes to appropriate + /** + * Determines color index and render layer, then routes to appropriate * tesselate routine based on material properties. */ private void tesselateQuad(MutableQuadViewImpl quad, RenderMaterialImpl.Value mat, int textureIndex) { diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java index 37706ea0f..8af32a624 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java @@ -20,10 +20,6 @@ import static net.fabricmc.indigo.renderer.helper.GeometryHelper.LIGHT_FACE_FLAG import java.util.function.Function; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; -import net.fabricmc.indigo.renderer.aocalc.AoCalculator; -import net.fabricmc.indigo.renderer.helper.ColorHelper; -import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.render.RenderLayer; @@ -33,6 +29,11 @@ import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Matrix3f; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; +import net.fabricmc.indigo.renderer.aocalc.AoCalculator; +import net.fabricmc.indigo.renderer.helper.ColorHelper; +import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; + /** * Base quad-rendering class for fallback and mesh consumers. * Has most of the actual buffer-time lighting and coloring logic. @@ -59,7 +60,7 @@ public abstract class AbstractQuadRenderer { this.transform = transform; } - /** handles block color and red-blue swizzle, common to all renders */ + /** handles block color and red-blue swizzle, common to all renders. */ private void colorizeQuad(MutableQuadViewImpl q, int blockColorIndex) { if (blockColorIndex == -1) { for (int i = 0; i < 4; i++) { @@ -74,7 +75,7 @@ public abstract class AbstractQuadRenderer { } } - /** final output step, common to all renders */ + /** final output step, common to all renders. */ private void bufferQuad(MutableQuadViewImpl quad, RenderLayer renderLayer) { bufferQuad(bufferFunc.apply(renderLayer), quad, matrix(), overlay(), normalMatrix(), normalVec); } @@ -110,7 +111,7 @@ public abstract class AbstractQuadRenderer { // routines below have a bit of copy-paste code reuse to avoid conditional execution inside a hot loop - /** for non-emissive mesh quads and all fallback quads with smooth lighting*/ + /** for non-emissive mesh quads and all fallback quads with smooth lighting. */ protected void tesselateSmooth(MutableQuadViewImpl q, RenderLayer renderLayer, int blockColorIndex) { colorizeQuad(q, blockColorIndex); @@ -122,7 +123,7 @@ public abstract class AbstractQuadRenderer { bufferQuad(q, renderLayer); } - /** for emissive mesh quads with smooth lighting*/ + /** for emissive mesh quads with smooth lighting. */ protected void tesselateSmoothEmissive(MutableQuadViewImpl q, RenderLayer renderLayer, int blockColorIndex) { colorizeQuad(q, blockColorIndex); @@ -134,7 +135,7 @@ public abstract class AbstractQuadRenderer { bufferQuad(q, renderLayer); } - /** for non-emissive mesh quads and all fallback quads with flat lighting*/ + /** for non-emissive mesh quads and all fallback quads with flat lighting. */ protected void tesselateFlat(MutableQuadViewImpl quad, RenderLayer renderLayer, int blockColorIndex) { colorizeQuad(quad, blockColorIndex); final int brightness = flatBrightness(quad, blockInfo.blockState, blockInfo.blockPos); @@ -146,7 +147,7 @@ public abstract class AbstractQuadRenderer { bufferQuad(quad, renderLayer); } - /** for emissive mesh quads with flat lighting*/ + /** for emissive mesh quads with flat lighting. */ protected void tesselateFlatEmissive(MutableQuadViewImpl quad, RenderLayer renderLayer, int blockColorIndex) { colorizeQuad(quad, blockColorIndex); @@ -159,7 +160,7 @@ public abstract class AbstractQuadRenderer { private final BlockPos.Mutable mpos = new BlockPos.Mutable(); - /** + /** * Handles geometry-based check for using self brightness or neighbor brightness. * That logic only applies in flat lighting. */ diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java index b2b903fb4..4b1b491b7 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java @@ -17,11 +17,13 @@ package net.fabricmc.indigo.renderer.render; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; + import net.minecraft.client.util.math.Matrix4f; import net.minecraft.util.math.Matrix3f; +import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; + abstract class AbstractRenderContext implements RenderContext { private final ObjectArrayList transformStack = new ObjectArrayList<>(); private static final QuadTransform NO_TRANSFORM = (q) -> true; diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java index 48b188426..3f6749688 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java @@ -20,12 +20,6 @@ import java.util.Random; import java.util.function.Consumer; import java.util.function.Function; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.fabricmc.indigo.renderer.aocalc.AoCalculator; -import net.fabricmc.indigo.renderer.aocalc.AoLuminanceFix; import net.minecraft.block.BlockState; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; @@ -37,6 +31,13 @@ import net.minecraft.util.math.Matrix3f; import net.minecraft.util.math.MatrixStack; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.indigo.renderer.aocalc.AoCalculator; +import net.fabricmc.indigo.renderer.aocalc.AoLuminanceFix; + /** * Context for non-terrain block rendering. */ diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderInfo.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderInfo.java index 6f7e71167..d4c82e2d3 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderInfo.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderInfo.java @@ -19,9 +19,8 @@ package net.fabricmc.indigo.renderer.render; import java.util.Random; import java.util.function.Supplier; -import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; -import net.minecraft.block.BlockState; import net.minecraft.class_4696; +import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.render.RenderLayer; @@ -29,11 +28,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockRenderView; +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; + /** * Holds, manages and provides access to the block/world related state - * needed by fallback and mesh consumers.

- * - * Exception: per-block position offsets are tracked in {@link ChunkRenderInfo} + * needed by fallback and mesh consumers. + * + *

Exception: per-block position offsets are tracked in {@link ChunkRenderInfo} * so they can be applied together with chunk offsets. */ public class BlockRenderInfo { diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java index 9af312b87..8287517da 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java @@ -19,9 +19,7 @@ package net.fabricmc.indigo.renderer.render; import it.unimi.dsi.fastutil.longs.Long2FloatOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.fabricmc.indigo.renderer.accessor.AccessChunkRenderer; -import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererData; -import net.fabricmc.indigo.renderer.aocalc.AoLuminanceFix; + import net.minecraft.block.BlockState; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.RenderLayer; @@ -32,35 +30,39 @@ import net.minecraft.client.render.chunk.ChunkRendererRegion; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; +import net.fabricmc.indigo.renderer.accessor.AccessChunkRenderer; +import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererData; +import net.fabricmc.indigo.renderer.aocalc.AoLuminanceFix; + /** * Holds, manages and provides access to the chunk-related state - * needed by fallback and mesh consumers during terrain rendering.

- * - * Exception: per-block position offsets are tracked here so they can + * needed by fallback and mesh consumers during terrain rendering. + * + *

Exception: per-block position offsets are tracked here so they can * be applied together with chunk offsets. */ public class ChunkRenderInfo { /** * Serves same function as brightness cache in Mojang's AO calculator, - * with some differences as follows...

- * - * 1) Mojang uses Object2Int. This uses Long2Int for performance and to avoid + * with some differences as follows... + * + *

  • Mojang uses Object2Int. This uses Long2Int for performance and to avoid * creating new immutable BlockPos references. But will break if someone * wants to expand Y limit or world borders. If we want to support that may - * need to switch or make configurable.

    - * - * 2) Mojang overrides the map methods to limit the cache to 50 values. + * need to switch or make configurable. + * + *

  • Mojang overrides the map methods to limit the cache to 50 values. * However, a render chunk only has 18^3 blocks in it, and the cache is cleared every chunk. * For performance and simplicity, we just let map grow to the size of the render chunk. - * - * 3) Mojang only uses the cache for Ao. Here it is used for all brightness + * + *
  • Mojang only uses the cache for Ao. Here it is used for all brightness * lookups, including flat lighting. - * - * 4) The Mojang cache is a separate threadlocal with a threadlocal boolean to - * enable disable. Cache clearing happens with the disable. There's no use case for + * + *
  • The Mojang cache is a separate threadlocal with a threadlocal boolean to + * enable disable. Cache clearing happens with the disable. There's no use case for * us when the cache needs to be disabled (and no apparent case in Mojang's code either) * so we simply clear the cache at the start of each new chunk. It is also - * not a threadlocal because it's held within a threadlocal BlockRenderer. + * not a threadlocal because it's held within a threadlocal BlockRenderer.
*/ private final Long2IntOpenHashMap brightnessCache; private final Long2FloatOpenHashMap aoLevelCache; @@ -103,7 +105,7 @@ public class ChunkRenderInfo { if (result == null) { BufferBuilder builder = builders.get(renderLayer); - result = (BufferBuilder) builder; + result = builder; chunkData.fabric_markPopulated(renderLayer); buffers.put(renderLayer, result); @@ -111,6 +113,7 @@ public class ChunkRenderInfo { ((AccessChunkRenderer) chunkRenderer).fabric_beginBufferBuilding(builder); } } + return result; } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/CompatibilityHelper.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/CompatibilityHelper.java index 8515b7c1d..d0e4a54d4 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/CompatibilityHelper.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/CompatibilityHelper.java @@ -34,6 +34,7 @@ public abstract class CompatibilityHelper { logCompatibilityWarning = false; Indigo.LOGGER.warn("[Indigo] Encountered baked quad with non-standard vertex format. Some blocks will not be rendered"); } + return result; } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java index 0f5ec6395..b17bef2e8 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java @@ -21,17 +21,6 @@ import java.util.Random; import java.util.function.Consumer; import java.util.function.Supplier; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.fabricmc.indigo.renderer.RenderMaterialImpl; -import net.fabricmc.indigo.renderer.helper.ColorHelper; -import net.fabricmc.indigo.renderer.helper.GeometryHelper; -import net.fabricmc.indigo.renderer.mesh.EncodingFormat; -import net.fabricmc.indigo.renderer.mesh.MeshImpl; -import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; import net.minecraft.block.BlockState; import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.render.VertexConsumer; @@ -43,18 +32,30 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MatrixStack; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.indigo.renderer.RenderMaterialImpl; +import net.fabricmc.indigo.renderer.helper.ColorHelper; +import net.fabricmc.indigo.renderer.helper.GeometryHelper; +import net.fabricmc.indigo.renderer.mesh.EncodingFormat; +import net.fabricmc.indigo.renderer.mesh.MeshImpl; +import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; + /** - * The render context used for item rendering. + * The render context used for item rendering. * Does not implement emissive lighting for sake - * of simplicity in the default renderer. + * of simplicity in the default renderer. */ public class ItemRenderContext extends AbstractRenderContext implements RenderContext { /** Value vanilla uses for item rendering. The only sensible choice, of course. */ private static final long ITEM_RANDOM_SEED = 42L; - /** used to accept a method reference from the ItemRenderer */ + /** used to accept a method reference from the ItemRenderer. */ @FunctionalInterface - public static interface VanillaQuadHandler { + public interface VanillaQuadHandler { void accept(BakedModel model, ItemStack stack, int color, int overlay, MatrixStack matrixStack, VertexConsumer buffer); } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java index 6b63e02fb..25ceb0bc6 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java @@ -22,6 +22,13 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.util.math.Direction; + import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; @@ -31,29 +38,23 @@ import net.fabricmc.indigo.renderer.aocalc.AoCalculator; import net.fabricmc.indigo.renderer.helper.GeometryHelper; import net.fabricmc.indigo.renderer.mesh.EncodingFormat; import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl; -import net.minecraft.block.BlockState; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.util.math.Direction; /** - * Consumer for vanilla baked models. Generally intended to give visual results matching a vanilla render, - * however there could be subtle (and desirable) lighting variations so is good to be able to render - * everything consistently.

- * - * Also, the API allows multi-part models that hold multiple vanilla models to render them without - * combining quad lists, but the vanilla logic only handles one model per block. To route all of - * them through vanilla logic would require additional hooks.

- * - * Works by copying the quad data to an "editor" quad held in the instance, + * Consumer for vanilla baked models. Generally intended to give visual results matching a vanilla render, + * however there could be subtle (and desirable) lighting variations so is good to be able to render + * everything consistently. + * + *

Also, the API allows multi-part models that hold multiple vanilla models to render them without + * combining quad lists, but the vanilla logic only handles one model per block. To route all of + * them through vanilla logic would require additional hooks. + * + *

Works by copying the quad data to an "editor" quad held in the instance, * where all transformations are applied before buffering. Transformations should be - * the same as they would be in a vanilla render - the editor is serving mainly + * the same as they would be in a vanilla render - the editor is serving mainly * as a way to access vertex data without magical numbers. It also allows a consistent interface - * for downstream tesselation routines.

- * - * Another difference from vanilla render is that all transformation happens before the + * for downstream tesselation routines. + * + *

Another difference from vanilla render is that all transformation happens before the * vertex data is sent to the byte buffer. Generally POJO array access will be faster than * manipulating the data via NIO. */ @@ -146,6 +147,7 @@ public abstract class TerrainFallbackConsumer extends AbstractQuadRenderer imple editorQuad.geometryFlags(GeometryHelper.LIGHT_FACE_FLAG); editorQuad.lightFace(cullFace); } + tesselateFlat(editorQuad, blockInfo.defaultLayer, editorQuad.colorIndex()); } } diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java index 31edbc19c..7c9d7f730 100644 --- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java +++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java @@ -18,11 +18,6 @@ package net.fabricmc.indigo.renderer.render; import java.util.function.Consumer; -import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.fabricmc.indigo.renderer.aocalc.AoCalculator; import net.minecraft.block.BlockState; import net.minecraft.client.render.chunk.BlockLayeredBufferBuilderStorage; import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderData; @@ -37,6 +32,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Matrix3f; import net.minecraft.util.math.MatrixStack; +import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.indigo.renderer.aocalc.AoCalculator; + /** * Implementation of {@link RenderContext} used during terrain rendering. * Dispatches calls from models during chunk rebuild to the appropriate consumer, @@ -108,6 +109,7 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende CrashReportSection.addBlockInfo(crashReportElement_1, blockPos, blockState); throw new CrashException(crashReport_1); } + // false because we've already marked the chunk as populated - caller doesn't need to return false; } diff --git a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java index 15c125e47..8d9c99b03 100644 --- a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java +++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java @@ -16,21 +16,20 @@ package net.fabricmc.fabric.api.client.rendereregistry.v1; -import net.fabricmc.fabric.mixin.client.rendereregistry.MixinBlockEntityRenderDispatcher; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.fabricmc.fabric.mixin.client.rendereregistry.MixinBlockEntityRenderDispatcher; + /** * Helper class for registering BlockEntityRenderers. */ public class BlockEntityRendererRegistry { public static final BlockEntityRendererRegistry INSTANCE = new BlockEntityRendererRegistry(); - private BlockEntityRendererRegistry() { - - } + private BlockEntityRendererRegistry() { } public void register(BlockEntityType blockEntityType, BlockEntityRenderer blockEntityRenderer) { ((MixinBlockEntityRenderDispatcher) BlockEntityRenderDispatcher.INSTANCE).invoke_method_23078(blockEntityType, blockEntityRenderer); diff --git a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java index 8b1c73f76..e74be0e9a 100644 --- a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java +++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java @@ -16,6 +16,10 @@ package net.fabricmc.fabric.api.client.rendereregistry.v1; +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; + import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.item.ItemRenderer; @@ -24,10 +28,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.resource.ReloadableResourceManager; -import java.util.HashMap; -import java.util.Map; -import java.util.WeakHashMap; - /** * Helper class for registering EntityRenderers. */ @@ -43,7 +43,7 @@ public class EntityRendererRegistry { private final ItemRenderer itemRenderer; private final Map, EntityRenderer> rendererMap; - private Context(TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer,Map, EntityRenderer> rendererMap) { + private Context(TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map, EntityRenderer> rendererMap) { this.textureManager = textureManager; this.resourceManager = resourceManager; this.itemRenderer = itemRenderer; @@ -67,9 +67,7 @@ public class EntityRendererRegistry { private final Map renderManagerMap = new WeakHashMap<>(); private final Map, EntityRendererRegistry.Factory> renderSupplierMap = new HashMap<>(); - private EntityRendererRegistry() { - - } + private EntityRendererRegistry() { } public void initialize(EntityRenderDispatcher manager, TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map, EntityRenderer> renderers) { synchronized (renderSupplierMap) { diff --git a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java index 8a15f615d..6228d9f7c 100644 --- a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java +++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java @@ -25,7 +25,7 @@ import net.minecraft.client.render.block.entity.BlockEntityRenderer; @Mixin(BlockEntityRenderDispatcher.class) public interface MixinBlockEntityRenderDispatcher { - @Invoker(value="method_23078") + @Invoker(value = "method_23078") @SuppressWarnings("rawtypes") void invoke_method_23078(BlockEntityType blockEntityType, BlockEntityRenderer blockEntityRenderer); } diff --git a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java index 170817484..63a742f1f 100644 --- a/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java +++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java @@ -24,13 +24,14 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.entity.EntityType; import net.minecraft.resource.ReloadableResourceManager; +import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; + @Mixin(EntityRenderDispatcher.class) public class MixinEntityRenderDispatcher { @Shadow @@ -41,4 +42,4 @@ public class MixinEntityRenderDispatcher { final EntityRenderDispatcher me = (EntityRenderDispatcher) (Object) this; EntityRendererRegistry.INSTANCE.initialize(me, me.textureManager, manager, itemRenderer, renderers); } -} \ No newline at end of file +} diff --git a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachedBlockView.java b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachedBlockView.java index 42fa0814e..ca4c9916c 100644 --- a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachedBlockView.java +++ b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachedBlockView.java @@ -22,44 +22,44 @@ import net.minecraft.world.BlockRenderView; /** * BlockView-extending interface to be used by {@link net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel} for dynamic model - * customization. It ensures thread safety and exploits data cached in render - * chunks for performance and data consistency.

- * - * There are differences from BlockView consumers must understand:

- * - * BlockEntity implementations that provide data for model customization should implement + * customization. It ensures thread safety and exploits data cached in render + * chunks for performance and data consistency. + * + *

There are differences from BlockView consumers must understand: + * + *

BlockEntity implementations that provide data for model customization should implement * {@link RenderAttachmentBlockEntity} which will be queried on the main thread when a render * chunk is enqueued for rebuild. The model should retrieve the results via {@link #getBlockEntityRenderAttachment(BlockPos)}. * While {@link #getBlockEntity(net.minecraft.util.math.BlockPos)} is not disabled, it * is not thread-safe for use on render threads. Models that violate this guidance are - * responsible for any necessary synchronization or collision detection.

- * - * {@link #getBlockState(net.minecraft.util.math.BlockPos)} and {@link #getFluidState(net.minecraft.util.math.BlockPos)} + * responsible for any necessary synchronization or collision detection. + * + *

{@link #getBlockState(net.minecraft.util.math.BlockPos)} and {@link #getFluidState(net.minecraft.util.math.BlockPos)} * will always reflect the state cached with the render chunk. Block and fluid states * can thus be different from main-thread world state due to lag between block update * application from network packets and render chunk rebuilds. Use of {link #getCachedRenderData()} - * will ensure consistency of model state with the rest of the chunk being rendered.

+ * will ensure consistency of model state with the rest of the chunk being rendered. * - * Models should avoid using {@link BlockRenderView#getBlockEntity(BlockPos)} + *

Models should avoid using {@link BlockRenderView#getBlockEntity(BlockPos)} * to ensure thread safety because this view may be accessed outside the main client thread. * Models that require Block Entity data should implement {@link RenderAttachmentBlockEntity} * and then use {@link #getBlockEntityRenderAttachment(BlockPos)} to retrieve it. When called from the - * main thread, that method will simply retrieve the data directly.

- * - * This interface is only guaranteed to be present in the client environment. + * main thread, that method will simply retrieve the data directly. + * + *

This interface is only guaranteed to be present in the client environment. */ // XXX can not link net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel public interface RenderAttachedBlockView extends BlockRenderView { - /** - * For models associated with Block Entities that implement {@link RenderAttachmentBlockEntity} - * this will be the most recent value provided by that implementation for the given block position.

- * - * Null in all other cases, or if the result from the implementation was null.

- * - * @param pos Position of the block for the block model. - */ - default Object getBlockEntityRenderAttachment(BlockPos pos) { - BlockEntity be = ((BlockRenderView) this).getBlockEntity(pos); - return be == null ? null : ((RenderAttachmentBlockEntity) be).getRenderAttachmentData(); - } + /** + * For models associated with Block Entities that implement {@link RenderAttachmentBlockEntity} + * this will be the most recent value provided by that implementation for the given block position. + * + *

Null in all other cases, or if the result from the implementation was null. + * + * @param pos Position of the block for the block model. + */ + default Object getBlockEntityRenderAttachment(BlockPos pos) { + BlockEntity be = ((BlockRenderView) this).getBlockEntity(pos); + return be == null ? null : ((RenderAttachmentBlockEntity) be).getRenderAttachmentData(); + } } diff --git a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachmentBlockEntity.java b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachmentBlockEntity.java index 3e65b69a9..4cc023e4e 100644 --- a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachmentBlockEntity.java +++ b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/api/rendering/data/v1/RenderAttachmentBlockEntity.java @@ -19,21 +19,21 @@ package net.fabricmc.fabric.api.rendering.data.v1; import net.minecraft.block.entity.BlockEntity; /** - * Interface for {@link BlockEntity}s which provide dynamic model state data.

+ * Interface for {@link BlockEntity}s which provide dynamic model state data. * - * Dynamic model state data is separate from BlockState, and will be + *

Dynamic model state data is separate from BlockState, and will be * cached during render chunk building on the main thread (safely) and accessible - * during chunk rendering on non-main threads.

+ * during chunk rendering on non-main threads. * - * For this reason, please ensure that all accesses to the passed model data are + *

For this reason, please ensure that all accesses to the passed model data are * thread-safe. This can be achieved by, for example, passing a pre-generated * immutable object, or ensuring all gets performed on the passed object are atomic - * and well-checked for unusual states.

+ * and well-checked for unusual states. */ @FunctionalInterface public interface RenderAttachmentBlockEntity { - /** - * @return The model state data provided by this block entity. Can be null. - */ - Object getRenderAttachmentData(); + /** + * @return The model state data provided by this block entity. Can be null. + */ + Object getRenderAttachmentData(); } diff --git a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinBlockEntity.java b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinBlockEntity.java index e8430c60a..b50718d5a 100644 --- a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinBlockEntity.java +++ b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinBlockEntity.java @@ -16,14 +16,16 @@ package net.fabricmc.fabric.mixin.rendering.data; -import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachmentBlockEntity; -import net.minecraft.block.entity.BlockEntity; import org.spongepowered.asm.mixin.Mixin; +import net.minecraft.block.entity.BlockEntity; + +import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachmentBlockEntity; + @Mixin(BlockEntity.class) public class MixinBlockEntity implements RenderAttachmentBlockEntity { - @Override - public Object getRenderAttachmentData() { - return null; - } + @Override + public Object getRenderAttachmentData() { + return null; + } } diff --git a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinViewableWorld.java b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinViewableWorld.java index 7d72a68fd..77e4ea062 100644 --- a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinViewableWorld.java +++ b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/MixinViewableWorld.java @@ -16,13 +16,13 @@ package net.fabricmc.fabric.mixin.rendering.data; -import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; +import org.spongepowered.asm.mixin.Mixin; + import net.minecraft.world.BlockRenderView; import net.minecraft.world.WorldView; -import org.spongepowered.asm.mixin.Mixin; + +import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; /** Make {@link BlockRenderView} implement {@link RenderAttachedBlockView}. */ @Mixin(WorldView.class) -public interface MixinViewableWorld extends RenderAttachedBlockView { - -} +public interface MixinViewableWorld extends RenderAttachedBlockView { } diff --git a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/client/MixinChunkRendererRegion.java b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/client/MixinChunkRendererRegion.java index 3d0fda518..62d9d1452 100644 --- a/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/client/MixinChunkRendererRegion.java +++ b/fabric-rendering-data-attachment-v1/src/main/java/net/fabricmc/fabric/mixin/rendering/data/client/MixinChunkRendererRegion.java @@ -20,6 +20,7 @@ import java.util.ConcurrentModificationException; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -28,15 +29,15 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; -import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachmentBlockEntity; import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.render.chunk.ChunkRendererRegion; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.WorldChunk; +import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; +import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachmentBlockEntity; + @Mixin(ChunkRendererRegion.class) public abstract class MixinChunkRendererRegion implements RenderAttachedBlockView { private Int2ObjectOpenHashMap fabric_renderDataObjects; @@ -58,10 +59,10 @@ public abstract class MixinChunkRendererRegion implements RenderAttachedBlockVie for (WorldChunk[] chunkOuter : chunks) { for (WorldChunk chunk : chunkOuter) { // Hash maps in chunks should generally not be modified outside of client thread - // but does happen in practice, due to mods or inconsistent vanilla behaviors, causing + // but does happen in practice, due to mods or inconsistent vanilla behaviors, causing // CMEs when we iterate the map. (Vanilla does not iterate these maps when it builds // the chunk cache and does not suffer from this problem.) - // + // // We handle this simply by retrying until it works. Ugly but effective. for (;;) { try { @@ -96,19 +97,21 @@ public abstract class MixinChunkRendererRegion implements RenderAttachedBlockVie for (Map.Entry entry : chunk.getBlockEntities().entrySet()) { final BlockPos entPos = entry.getKey(); - if (entPos.getX() >= xMin && entPos.getX() <= xMax + if (entPos.getX() >= xMin && entPos.getX() <= xMax && entPos.getY() >= yMin && entPos.getY() <= yMax && entPos.getZ() >= zMin && entPos.getZ() <= zMax) { - final Object o = ((RenderAttachmentBlockEntity) entry.getValue()).getRenderAttachmentData(); + if (o != null) { if (map == null) { map = new Int2ObjectOpenHashMap<>(); } + map.put(getIndex(entPos), o); } } } + return map; } diff --git a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandler.java b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandler.java index e4005c7a3..0d9abcce0 100644 --- a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandler.java +++ b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandler.java @@ -25,25 +25,25 @@ import net.minecraft.world.BlockRenderView; * Interface for handling the rendering of a FluidState. */ public interface FluidRenderHandler { - /** - * Get the sprites for a fluid being rendered at a given position. - * For optimal performance, the sprites should be loaded as part of a - * resource reload and *not* looked up every time the method is called! - * - * The "fabric-textures" module contains sprite rendering facilities, which may come in handy here. - * - * @param view The world view pertaining to the fluid. May be null! - * @param pos The position of the fluid in the world. May be null! - * @param state The current state of the fluid. - * @return An array of size two: the first entry contains the "still" sprite, - * while the second entry contains the "flowing" sprite. - */ - Sprite[] getFluidSprites(/* Nullable */ BlockRenderView view, /* Nullable */ BlockPos pos, FluidState state); + /** + * Get the sprites for a fluid being rendered at a given position. + * For optimal performance, the sprites should be loaded as part of a + * resource reload and *not* looked up every time the method is called! + * + *

The "fabric-textures" module contains sprite rendering facilities, which may come in handy here. + * + * @param view The world view pertaining to the fluid. May be null! + * @param pos The position of the fluid in the world. May be null! + * @param state The current state of the fluid. + * @return An array of size two: the first entry contains the "still" sprite, + * while the second entry contains the "flowing" sprite. + */ + Sprite[] getFluidSprites(/* Nullable */ BlockRenderView view, /* Nullable */ BlockPos pos, FluidState state); /** * Get the tint color for a fluid being rendered at a given position. * - * NOTE: As of right now, our hook cannot handle setting a custom alpha + * @note As of right now, our hook cannot handle setting a custom alpha * tint here - as such, it must be contained in the texture itself! * * @param view The world view pertaining to the fluid. May be null! @@ -51,7 +51,7 @@ public interface FluidRenderHandler { * @param state The current state of the fluid. * @return The tint color of the fluid. */ - default int getFluidColor(BlockRenderView view, BlockPos pos, FluidState state) { - return -1; - } + default int getFluidColor(BlockRenderView view, BlockPos pos, FluidState state) { + return -1; + } } diff --git a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandlerRegistry.java b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandlerRegistry.java index 659ac2198..cf7fca5a2 100644 --- a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandlerRegistry.java +++ b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/api/client/render/fluid/v1/FluidRenderHandlerRegistry.java @@ -16,32 +16,33 @@ package net.fabricmc.fabric.api.client.render.fluid.v1; -import net.fabricmc.fabric.impl.client.render.fluid.FluidRenderHandlerRegistryImpl; import net.minecraft.fluid.Fluid; +import net.fabricmc.fabric.impl.client.render.fluid.FluidRenderHandlerRegistryImpl; + /** * Registry for {@link FluidRenderHandler} instances. * - * Notably, this supports querying, overriding and wrapping vanilla fluid + *

Notably, this supports querying, overriding and wrapping vanilla fluid * rendering. */ public interface FluidRenderHandlerRegistry { - FluidRenderHandlerRegistry INSTANCE = FluidRenderHandlerRegistryImpl.INSTANCE; + FluidRenderHandlerRegistry INSTANCE = FluidRenderHandlerRegistryImpl.INSTANCE; - /** - * Get a {@link FluidRenderHandler} for a given Fluid. - * Supports vanilla and Fabric fluids. - * - * @param fluid The Fluid. - * @return The FluidRenderHandler. - */ - FluidRenderHandler get(Fluid fluid); + /** + * Get a {@link FluidRenderHandler} for a given Fluid. + * Supports vanilla and Fabric fluids. + * + * @param fluid The Fluid. + * @return The FluidRenderHandler. + */ + FluidRenderHandler get(Fluid fluid); - /** - * Register a {@link FluidRenderHandler} for a given Fluid. - * - * @param fluid The Fluid. - * @param renderer The FluidRenderHandler. - */ - void register(Fluid fluid, FluidRenderHandler renderer); + /** + * Register a {@link FluidRenderHandler} for a given Fluid. + * + * @param fluid The Fluid. + * @param renderer The FluidRenderHandler. + */ + void register(Fluid fluid, FluidRenderHandler renderer); } diff --git a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRenderHandlerRegistryImpl.java b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRenderHandlerRegistryImpl.java index cebf84486..9c8a24daa 100644 --- a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRenderHandlerRegistryImpl.java +++ b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRenderHandlerRegistryImpl.java @@ -16,8 +16,9 @@ package net.fabricmc.fabric.impl.client.render.fluid; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; +import java.util.IdentityHashMap; +import java.util.Map; + import net.minecraft.client.color.world.BiomeColors; import net.minecraft.client.texture.Sprite; import net.minecraft.fluid.Fluid; @@ -27,61 +28,61 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; import net.minecraft.world.biome.Biomes; -import java.util.IdentityHashMap; -import java.util.Map; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; public class FluidRenderHandlerRegistryImpl implements FluidRenderHandlerRegistry { - public static final FluidRenderHandlerRegistryImpl INSTANCE = new FluidRenderHandlerRegistryImpl(); - private final Map handlers = new IdentityHashMap<>(); - private final Map modHandlers = new IdentityHashMap<>(); + public static final FluidRenderHandlerRegistryImpl INSTANCE = new FluidRenderHandlerRegistryImpl(); + private final Map handlers = new IdentityHashMap<>(); + private final Map modHandlers = new IdentityHashMap<>(); - private FluidRenderHandlerRegistryImpl() { - } + private FluidRenderHandlerRegistryImpl() { + } - @Override - public FluidRenderHandler get(Fluid fluid) { - return handlers.get(fluid); - } + @Override + public FluidRenderHandler get(Fluid fluid) { + return handlers.get(fluid); + } - public FluidRenderHandler getOverride(Fluid fluid) { - return modHandlers.get(fluid); - } + public FluidRenderHandler getOverride(Fluid fluid) { + return modHandlers.get(fluid); + } - @Override - public void register(Fluid fluid, FluidRenderHandler renderer) { - handlers.put(fluid, renderer); - modHandlers.put(fluid, renderer); - } + @Override + public void register(Fluid fluid, FluidRenderHandler renderer) { + handlers.put(fluid, renderer); + modHandlers.put(fluid, renderer); + } - public void onFluidRendererReload(Sprite[] waterSprites, Sprite[] lavaSprites) { - FluidRenderHandler waterHandler = new FluidRenderHandler() { - @Override - public Sprite[] getFluidSprites(BlockRenderView view, BlockPos pos, FluidState state) { - return waterSprites; - } + public void onFluidRendererReload(Sprite[] waterSprites, Sprite[] lavaSprites) { + FluidRenderHandler waterHandler = new FluidRenderHandler() { + @Override + public Sprite[] getFluidSprites(BlockRenderView view, BlockPos pos, FluidState state) { + return waterSprites; + } - @Override - public int getFluidColor(BlockRenderView view, BlockPos pos, FluidState state) { - if (view != null && pos != null) { - return BiomeColors.getWaterColor(view, pos); - } else { - return Biomes.DEFAULT.getWaterColor(); - } - } - }; + @Override + public int getFluidColor(BlockRenderView view, BlockPos pos, FluidState state) { + if (view != null && pos != null) { + return BiomeColors.getWaterColor(view, pos); + } else { + return Biomes.DEFAULT.getWaterColor(); + } + } + }; - //noinspection Convert2Lambda - FluidRenderHandler lavaHandler = new FluidRenderHandler() { - @Override - public Sprite[] getFluidSprites(BlockRenderView view, BlockPos pos, FluidState state) { - return lavaSprites; - } - }; + //noinspection Convert2Lambda + FluidRenderHandler lavaHandler = new FluidRenderHandler() { + @Override + public Sprite[] getFluidSprites(BlockRenderView view, BlockPos pos, FluidState state) { + return lavaSprites; + } + }; - register(Fluids.WATER, waterHandler); - register(Fluids.FLOWING_WATER, waterHandler); - register(Fluids.LAVA, lavaHandler); - register(Fluids.FLOWING_LAVA, lavaHandler); - handlers.putAll(modHandlers); - } + register(Fluids.WATER, waterHandler); + register(Fluids.FLOWING_WATER, waterHandler); + register(Fluids.LAVA, lavaHandler); + register(Fluids.FLOWING_LAVA, lavaHandler); + handlers.putAll(modHandlers); + } } diff --git a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRendererHookContainer.java b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRendererHookContainer.java index 9c219d2b0..f4408970b 100644 --- a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRendererHookContainer.java +++ b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/impl/client/render/fluid/FluidRendererHookContainer.java @@ -16,21 +16,22 @@ package net.fabricmc.fabric.impl.client.render.fluid; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; import net.minecraft.fluid.FluidState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.BlockRenderView; -public class FluidRendererHookContainer { - public BlockRenderView view; - public BlockPos pos; - public FluidState state; - public FluidRenderHandler handler; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; - public void clear() { - view = null; - pos = null; - state = null; - handler = null; - } +public class FluidRendererHookContainer { + public BlockRenderView view; + public BlockPos pos; + public FluidState state; + public FluidRenderHandler handler; + + public void clear() { + view = null; + pos = null; + state = null; + handler = null; + } } diff --git a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java index 6caac9764..13f950630 100644 --- a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java +++ b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java @@ -16,16 +16,6 @@ package net.fabricmc.fabric.mixin.client.render.fluid; -import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; -import net.fabricmc.fabric.impl.client.render.fluid.FluidRendererHookContainer; -import net.fabricmc.fabric.impl.client.render.fluid.FluidRenderHandlerRegistryImpl; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.block.FluidRenderer; -import net.minecraft.client.texture.Sprite; -import net.minecraft.fluid.FluidState; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockRenderView; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -34,66 +24,79 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.block.FluidRenderer; +import net.minecraft.client.texture.Sprite; +import net.minecraft.fluid.FluidState; +import net.minecraft.tag.FluidTags; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.BlockRenderView; + +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler; +import net.fabricmc.fabric.impl.client.render.fluid.FluidRenderHandlerRegistryImpl; +import net.fabricmc.fabric.impl.client.render.fluid.FluidRendererHookContainer; + @Mixin(FluidRenderer.class) public class MixinFluidRenderer { - @Shadow - private Sprite[] lavaSprites; - @Shadow - private Sprite[] waterSprites; + @Shadow + private Sprite[] lavaSprites; + @Shadow + private Sprite[] waterSprites; - private final ThreadLocal fabric_renderHandler = ThreadLocal.withInitial(FluidRendererHookContainer::new); + private final ThreadLocal fabric_renderHandler = ThreadLocal.withInitial(FluidRendererHookContainer::new); - @Inject(at = @At("RETURN"), method = "onResourceReload") - public void onResourceReloadReturn(CallbackInfo info) { - FluidRenderHandlerRegistryImpl.INSTANCE.onFluidRendererReload(waterSprites, lavaSprites); - } + @Inject(at = @At("RETURN"), method = "onResourceReload") + public void onResourceReloadReturn(CallbackInfo info) { + FluidRenderHandlerRegistryImpl.INSTANCE.onFluidRendererReload(waterSprites, lavaSprites); + } - @Inject(at = @At("HEAD"), method = "tesselate", cancellable = true) - public void tesselate(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, FluidState state, CallbackInfoReturnable info) { - FluidRendererHookContainer ctr = fabric_renderHandler.get(); - FluidRenderHandler handler = FluidRenderHandlerRegistryImpl.INSTANCE.getOverride(state.getFluid()); + @Inject(at = @At("HEAD"), method = "tesselate", cancellable = true) + public void tesselate(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, FluidState state, CallbackInfoReturnable info) { + FluidRendererHookContainer ctr = fabric_renderHandler.get(); + FluidRenderHandler handler = FluidRenderHandlerRegistryImpl.INSTANCE.getOverride(state.getFluid()); - ctr.view = view; - ctr.pos = pos; - ctr.state = state; - ctr.handler = handler; + ctr.view = view; + ctr.pos = pos; + ctr.state = state; + ctr.handler = handler; - /* if (handler == null) { - return; - } + /* if (handler == null) { + return; + } - ActionResult hResult = handler.tesselate(view, pos, bufferBuilder, state); - if (hResult != ActionResult.PASS) { - info.setReturnValue(hResult == ActionResult.SUCCESS); - return; - } */ - } + ActionResult hResult = handler.tesselate(view, pos, bufferBuilder, state); - @Inject(at = @At("RETURN"), method = "tesselate") - public void tesselateReturn(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, FluidState state, CallbackInfoReturnable info) { - fabric_renderHandler.get().clear(); - } + if (hResult != ActionResult.PASS) { + info.setReturnValue(hResult == ActionResult.SUCCESS); + return; + } */ + } - @ModifyVariable(at = @At(value = "INVOKE", target = "net/minecraft/client/render/block/FluidRenderer.isSameFluid(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;Lnet/minecraft/fluid/FluidState;)Z"), method = "tesselate", ordinal = 0) - public boolean modLavaCheck(boolean chk) { - // First boolean local is set by vanilla according to 'matches lava' - // but uses the negation consistent with 'matches water' - // for determining if special water sprite should be used behind glass. - - // Has other uses but those have already happened by the time the hook is called. - final FluidRendererHookContainer ctr = fabric_renderHandler.get(); - return chk || !ctr.state.matches(FluidTags.WATER); - } + @Inject(at = @At("RETURN"), method = "tesselate") + public void tesselateReturn(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, FluidState state, CallbackInfoReturnable info) { + fabric_renderHandler.get().clear(); + } - @ModifyVariable(at = @At(value = "INVOKE", target = "net/minecraft/client/render/block/FluidRenderer.isSameFluid(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;Lnet/minecraft/fluid/FluidState;)Z"), method = "tesselate", ordinal = 0) - public Sprite[] modSpriteArray(Sprite[] chk) { - FluidRendererHookContainer ctr = fabric_renderHandler.get(); - return ctr.handler != null ? ctr.handler.getFluidSprites(ctr.view, ctr.pos, ctr.state) : chk; - } + @ModifyVariable(at = @At(value = "INVOKE", target = "net/minecraft/client/render/block/FluidRenderer.isSameFluid(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;Lnet/minecraft/fluid/FluidState;)Z"), method = "tesselate", ordinal = 0) + public boolean modLavaCheck(boolean chk) { + // First boolean local is set by vanilla according to 'matches lava' + // but uses the negation consistent with 'matches water' + // for determining if special water sprite should be used behind glass. - @ModifyVariable(at = @At(value = "CONSTANT", args = "intValue=16", ordinal = 0, shift = At.Shift.BEFORE), method = "tesselate", ordinal = 0) - public int modTintColor(int chk) { - FluidRendererHookContainer ctr = fabric_renderHandler.get(); - return ctr.handler != null ? ctr.handler.getFluidColor(ctr.view, ctr.pos, ctr.state) : chk; - } + // Has other uses but those have already happened by the time the hook is called. + final FluidRendererHookContainer ctr = fabric_renderHandler.get(); + return chk || !ctr.state.matches(FluidTags.WATER); + } + + @ModifyVariable(at = @At(value = "INVOKE", target = "net/minecraft/client/render/block/FluidRenderer.isSameFluid(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/Direction;Lnet/minecraft/fluid/FluidState;)Z"), method = "tesselate", ordinal = 0) + public Sprite[] modSpriteArray(Sprite[] chk) { + FluidRendererHookContainer ctr = fabric_renderHandler.get(); + return ctr.handler != null ? ctr.handler.getFluidSprites(ctr.view, ctr.pos, ctr.state) : chk; + } + + @ModifyVariable(at = @At(value = "CONSTANT", args = "intValue=16", ordinal = 0, shift = At.Shift.BEFORE), method = "tesselate", ordinal = 0) + public int modTintColor(int chk) { + FluidRendererHookContainer ctr = fabric_renderHandler.get(); + return ctr.handler != null ? ctr.handler.getFluidColor(ctr.view, ctr.pos, ctr.state) : chk; + } } diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/ColorProviderRegistry.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/ColorProviderRegistry.java index ab68a2ca4..51634ca19 100644 --- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/ColorProviderRegistry.java +++ b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/ColorProviderRegistry.java @@ -16,19 +16,20 @@ package net.fabricmc.fabric.api.client.render; -import net.fabricmc.fabric.impl.client.render.ColorProviderRegistryImpl; import net.minecraft.block.Block; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.item.ItemConvertible; +import net.fabricmc.fabric.impl.client.render.ColorProviderRegistryImpl; + public interface ColorProviderRegistry { ColorProviderRegistry ITEM = ColorProviderRegistryImpl.ITEM; ColorProviderRegistry BLOCK = ColorProviderRegistryImpl.BLOCK; /** - * Register a color provider for one or more objects + * Register a color provider for one or more objects. * * @param provider The color provider to register. * @param objects The objects which should be colored using this provider. @@ -37,8 +38,8 @@ public interface ColorProviderRegistry { /** * Get a color provider for the given object. - *

- * Please note that the underlying registry may not be fully populated or stable until the game has started, + * + *

Please note that the underlying registry may not be fully populated or stable until the game has started, * as other mods may overwrite the registry. * * @param object The object to acquire the provide for. diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/InvalidateRenderStateCallback.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/InvalidateRenderStateCallback.java index f77a5c73c..24557baa6 100644 --- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/InvalidateRenderStateCallback.java +++ b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/InvalidateRenderStateCallback.java @@ -22,20 +22,20 @@ import net.fabricmc.fabric.api.event.EventFactory; /** * Called when the world renderer reloads, usually as result of changing resource pack * or video configuration, or when the player types F3+A in the debug screen. - * Afterwards all render chunks will be reset and reloaded.

- * - * Render chunks and other render-related object instances will be made null + * Afterwards all render chunks will be reset and reloaded. + * + *

Render chunks and other render-related object instances will be made null * or invalid after this event so do not use it to capture dependent state. * Instead, use it to invalidate state and reinitialize lazily. */ public interface InvalidateRenderStateCallback { - public static final Event EVENT = EventFactory.createArrayBacked(InvalidateRenderStateCallback.class, - (listeners) -> () -> { - for (InvalidateRenderStateCallback event : listeners) { - event.onInvalidate(); - } - } - ); - - void onInvalidate(); + Event EVENT = EventFactory.createArrayBacked(InvalidateRenderStateCallback.class, + (listeners) -> () -> { + for (InvalidateRenderStateCallback event : listeners) { + event.onInvalidate(); + } + } + ); + + void onInvalidate(); } diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/impl/client/render/ColorProviderRegistryImpl.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/impl/client/render/ColorProviderRegistryImpl.java index cb8d4675e..ee54281f9 100644 --- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/impl/client/render/ColorProviderRegistryImpl.java +++ b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/impl/client/render/ColorProviderRegistryImpl.java @@ -16,7 +16,9 @@ package net.fabricmc.fabric.impl.client.render; -import net.fabricmc.fabric.api.client.render.ColorProviderRegistry; +import java.util.IdentityHashMap; +import java.util.Map; + import net.minecraft.block.Block; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.color.block.BlockColors; @@ -24,8 +26,7 @@ import net.minecraft.client.color.item.ItemColorProvider; import net.minecraft.client.color.item.ItemColors; import net.minecraft.item.ItemConvertible; -import java.util.IdentityHashMap; -import java.util.Map; +import net.fabricmc.fabric.api.client.render.ColorProviderRegistry; public abstract class ColorProviderRegistryImpl implements ColorProviderRegistry { public static final ColorProviderRegistryImpl BLOCK = new ColorProviderRegistryImpl() { @@ -54,9 +55,11 @@ public abstract class ColorProviderRegistryImpl impleme } this.colorMap = colorMap; + for (Map.Entry mappers : tempMappers.entrySet()) { registerUnderlying(colorMap, mappers.getValue(), mappers.getKey()); } + tempMappers = null; } diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockColorMap.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockColorMap.java index e922adc36..e7378959f 100644 --- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockColorMap.java +++ b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockColorMap.java @@ -16,12 +16,6 @@ package net.fabricmc.fabric.mixin.client.render; -import net.fabricmc.fabric.impl.client.render.ColorProviderRegistryImpl; -import net.minecraft.block.Block; -import net.minecraft.client.color.block.BlockColorProvider; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.util.IdList; -import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -29,6 +23,14 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.block.Block; +import net.minecraft.client.color.block.BlockColorProvider; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.util.IdList; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.impl.client.render.ColorProviderRegistryImpl; + @Mixin(BlockColors.class) public class MixinBlockColorMap implements ColorProviderRegistryImpl.ColorMapperHolder { @Shadow diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinItemColorMap.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinItemColorMap.java index 9c951bc80..239ab4254 100644 --- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinItemColorMap.java +++ b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinItemColorMap.java @@ -16,13 +16,6 @@ package net.fabricmc.fabric.mixin.client.render; -import net.fabricmc.fabric.impl.client.render.ColorProviderRegistryImpl; -import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.item.ItemColorProvider; -import net.minecraft.client.color.item.ItemColors; -import net.minecraft.item.ItemConvertible; -import net.minecraft.util.IdList; -import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,6 +23,15 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.color.item.ItemColorProvider; +import net.minecraft.client.color.item.ItemColors; +import net.minecraft.item.ItemConvertible; +import net.minecraft.util.IdList; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.fabric.impl.client.render.ColorProviderRegistryImpl; + @Mixin(ItemColors.class) public class MixinItemColorMap implements ColorProviderRegistryImpl.ColorMapperHolder { @Shadow diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinWorldRenderer.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinWorldRenderer.java index 8af8238a1..27e914913 100644 --- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinWorldRenderer.java +++ b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinWorldRenderer.java @@ -21,13 +21,14 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.fabric.api.client.render.InvalidateRenderStateCallback; import net.minecraft.client.render.WorldRenderer; +import net.fabricmc.fabric.api.client.render.InvalidateRenderStateCallback; + @Mixin(WorldRenderer.class) public abstract class MixinWorldRenderer { - @Inject(method = "reload", at = @At("HEAD")) - private void onReload(CallbackInfo ci) { - InvalidateRenderStateCallback.EVENT.invoker().onInvalidate(); - } + @Inject(method = "reload", at = @At("HEAD")) + private void onReload(CallbackInfo ci) { + InvalidateRenderStateCallback.EVENT.invoker().onInvalidate(); + } } diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/IdentifiableResourceReloadListener.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/IdentifiableResourceReloadListener.java index 572f3af81..ec01459bd 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/IdentifiableResourceReloadListener.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/IdentifiableResourceReloadListener.java @@ -16,20 +16,20 @@ package net.fabricmc.fabric.api.resource; -import net.minecraft.resource.ResourceReloadListener; -import net.minecraft.util.Identifier; - import java.util.Collection; import java.util.Collections; +import net.minecraft.resource.ResourceReloadListener; +import net.minecraft.util.Identifier; + /** * Interface for "identifiable" resource reload listeners. - *

- * "Identifiable" listeners have an unique identifier, which can be depended on, + * + *

"Identifiable" listeners have an unique identifier, which can be depended on, * and can provide dependencies that they would like to see executed before * themselves. - *

- * {@link ResourceReloadListenerKeys} + * + * @see ResourceReloadListenerKeys */ public interface IdentifiableResourceReloadListener extends ResourceReloadListener { /** diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ModResourcePack.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ModResourcePack.java index a89f170d1..e66b3606d 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ModResourcePack.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ModResourcePack.java @@ -16,9 +16,10 @@ package net.fabricmc.fabric.api.resource; -import net.fabricmc.loader.api.metadata.ModMetadata; import net.minecraft.resource.ResourcePack; +import net.fabricmc.loader.api.metadata.ModMetadata; + /** * Interface implemented by mod-provided resource packs. */ diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceManagerHelper.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceManagerHelper.java index a3acf6442..642eede20 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceManagerHelper.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceManagerHelper.java @@ -16,10 +16,11 @@ package net.fabricmc.fabric.api.resource; -import net.fabricmc.fabric.impl.resources.ResourceManagerHelperImpl; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceType; +import net.fabricmc.fabric.impl.resources.ResourceManagerHelperImpl; + /** * Helper for working with {@link ResourceManager} instances. */ diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceReloadListenerKeys.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceReloadListenerKeys.java index bfd51f4fd..082b44f14 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceReloadListenerKeys.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/ResourceReloadListenerKeys.java @@ -20,8 +20,8 @@ import net.minecraft.util.Identifier; /** * This class contains default keys for various Minecraft resource reload listeners. - *

- * {@link IdentifiableResourceReloadListener} + * + * @see IdentifiableResourceReloadListener */ public final class ResourceReloadListenerKeys { // client @@ -38,7 +38,5 @@ public final class ResourceReloadListenerKeys { public static final Identifier FUNCTIONS = new Identifier("minecraft:functions"); public static final Identifier LOOT_TABLES = new Identifier("minecraft:loot_tables"); - private ResourceReloadListenerKeys() { - - } + private ResourceReloadListenerKeys() { } } diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/SimpleResourceReloadListener.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/SimpleResourceReloadListener.java index 6545d4203..5871f2211 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/SimpleResourceReloadListener.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/api/resource/SimpleResourceReloadListener.java @@ -16,28 +16,28 @@ package net.fabricmc.fabric.api.resource; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceReloadListener; import net.minecraft.resource.SynchronousResourceReloadListener; import net.minecraft.util.profiler.Profiler; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; - /** * A simplified version of the "resource reload listener" interface, hiding the * peculiarities of the API. - *

- * In essence, there are two stages: - *

- * - load: create an instance of your data object containing all loaded and + * + *

In essence, there are two stages: + * + *

  • load: create an instance of your data object containing all loaded and * processed information, - * - apply: apply the information from the data object to the game instance. - *

    - * The load stage should be self-contained as it can run on any thread! However, + *

  • apply: apply the information from the data object to the game instance.
+ * + *

The load stage should be self-contained as it can run on any thread! However, * the apply stage is guaranteed to run on the game thread. - *

- * For a fully synchronous alternative, consider using + * + *

For a fully synchronous alternative, consider using * {@link SynchronousResourceReloadListener} in conjunction with * {@link IdentifiableResourceReloadListener}. * diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredInputStream.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredInputStream.java index fd9142e48..19fb6521d 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredInputStream.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredInputStream.java @@ -16,12 +16,12 @@ package net.fabricmc.fabric.impl.resources; -import net.minecraft.util.Unit; - import java.io.IOException; import java.io.InputStream; import java.util.concurrent.Callable; +import net.minecraft.util.Unit; + /** * InputStream deferring to a separate I/O thread to work around * Thread.interrupt()-related issues in NIO. @@ -39,6 +39,7 @@ class DeferredInputStream extends InputStream { DeferredInputStream(Callable streamSupplier) throws IOException { stream = DeferredNioExecutionHandler.submit(streamSupplier); + if (stream == null) { throw new IOException("Something happened while trying to create an InputStream!"); } @@ -46,6 +47,7 @@ class DeferredInputStream extends InputStream { DeferredInputStream(InputStream stream) throws IOException { this.stream = stream; + if (this.stream == null) { throw new IOException("Something happened while trying to create an InputStream!"); } diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredNioExecutionHandler.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredNioExecutionHandler.java index c3c0a9eba..f1edcd2bd 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredNioExecutionHandler.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/DeferredNioExecutionHandler.java @@ -16,10 +16,14 @@ package net.fabricmc.fabric.impl.resources; -import com.google.common.util.concurrent.ThreadFactoryBuilder; - import java.io.IOException; -import java.util.concurrent.*; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; class DeferredNioExecutionHandler { // private static final ThreadLocal DEFERRED_REQUIRED = new ThreadLocal<>(); @@ -29,10 +33,12 @@ class DeferredNioExecutionHandler { public static boolean shouldDefer() { return DEFER_REQUESTED; /* Boolean deferRequired = DEFERRED_REQUIRED.get(); + if (deferRequired == null) { deferRequired = false; StackTraceElement[] elements = Thread.currentThread().getStackTrace(); + for (int i = 0; i < elements.length; i++) { if (elements[i].getClassName().startsWith("paulscode.sound.")) { deferRequired = true; @@ -75,6 +81,7 @@ class DeferredNioExecutionHandler { return future.get(); } catch (ExecutionException e) { Throwable t = e.getCause(); + if (t instanceof IOException) { throw (IOException) t; } else { @@ -85,6 +92,5 @@ class DeferredNioExecutionHandler { } } } - } diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModNioResourcePack.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModNioResourcePack.java index 26a1da986..22756602d 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModNioResourcePack.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModNioResourcePack.java @@ -16,25 +16,32 @@ package net.fabricmc.fabric.impl.resources; -import net.fabricmc.fabric.api.resource.ModResourcePack; -import net.fabricmc.loader.api.metadata.ModMetadata; -import net.minecraft.resource.AbstractFileResourcePack; -import net.minecraft.resource.ResourceType; -import net.minecraft.util.Identifier; -import net.minecraft.util.InvalidIdentifierException; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.function.Predicate; import java.util.regex.Pattern; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraft.resource.AbstractFileResourcePack; +import net.minecraft.resource.ResourceType; +import net.minecraft.util.Identifier; +import net.minecraft.util.InvalidIdentifierException; + +import net.fabricmc.fabric.api.resource.ModResourcePack; +import net.fabricmc.loader.api.metadata.ModMetadata; + public class ModNioResourcePack extends AbstractFileResourcePack implements ModResourcePack { private static final Logger LOGGER = LogManager.getLogger(); private static final Pattern RESOURCE_PACK_PATH = Pattern.compile("[a-z0-9-_]+"); @@ -70,23 +77,27 @@ public class ModNioResourcePack extends AbstractFileResourcePack implements ModR if (DeferredNioExecutionHandler.shouldDefer()) { stream = DeferredNioExecutionHandler.submit(() -> { Path path = getPath(filename); + if (path != null && Files.isRegularFile(path)) { return new DeferredInputStream(Files.newInputStream(path)); } else { return null; } }); + if (stream != null) { return stream; } } else { Path path = getPath(filename); + if (path != null && Files.isRegularFile(path)) { return Files.newInputStream(path); } } stream = ModResourcePackUtil.openDefault(modInfo, filename); + if (stream != null) { return stream; } @@ -123,26 +134,27 @@ public class ModNioResourcePack extends AbstractFileResourcePack implements ModR for (String namespace : getNamespaces(type)) { Path namespacePath = getPath(type.getDirectory() + "/" + namespace); + if (namespacePath != null) { Path searchPath = namespacePath.resolve(nioPath).toAbsolutePath().normalize(); if (Files.exists(searchPath)) { try { Files.walk(searchPath, depth) - .filter(Files::isRegularFile) - .filter((p) -> { - String filename = p.getFileName().toString(); - return !filename.endsWith(".mcmeta") && predicate.test(filename); - }) - .map(namespacePath::relativize) - .map((p) -> p.toString().replace(separator, "/")) - .forEach((s) -> { - try { - ids.add(new Identifier(namespace, s)); - } catch (InvalidIdentifierException e) { - LOGGER.error(e.getMessage()); - } - }); + .filter(Files::isRegularFile) + .filter((p) -> { + String filename = p.getFileName().toString(); + return !filename.endsWith(".mcmeta") && predicate.test(filename); + }) + .map(namespacePath::relativize) + .map((p) -> p.toString().replace(separator, "/")) + .forEach((s) -> { + try { + ids.add(new Identifier(namespace, s)); + } catch (InvalidIdentifierException e) { + LOGGER.error(e.getMessage()); + } + }); } catch (IOException e) { LOGGER.warn("findResources at " + path + " in namespace " + namespace + ", mod " + modInfo.getId() + " failed!", e); } @@ -167,11 +179,13 @@ public class ModNioResourcePack extends AbstractFileResourcePack implements ModR try { Path typePath = getPath(type.getDirectory()); + if (typePath == null || !(Files.isDirectory(typePath))) { return Collections.emptySet(); } Set namespaces = new HashSet<>(); + try (DirectoryStream stream = Files.newDirectoryStream(typePath, Files::isDirectory)) { for (Path path : stream) { String s = path.getFileName().toString(); diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackCreator.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackCreator.java index 6e7073bb1..8371f417d 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackCreator.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackCreator.java @@ -16,15 +16,16 @@ package net.fabricmc.fabric.impl.resources; -import net.fabricmc.fabric.api.resource.ModResourcePack; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import net.minecraft.resource.ResourcePack; import net.minecraft.resource.ResourcePackProfile; import net.minecraft.resource.ResourcePackProvider; import net.minecraft.resource.ResourceType; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import net.fabricmc.fabric.api.resource.ModResourcePack; public class ModResourcePackCreator implements ResourcePackProvider { private final ResourceType type; @@ -38,13 +39,14 @@ public class ModResourcePackCreator implements ResourcePackProvider { // TODO: "vanilla" does not emit a message; neither should a modded datapack List packs = new ArrayList<>(); ModResourcePackUtil.appendModResourcePacks(packs, type); + for (ResourcePack pack : packs) { if (!(pack instanceof ModResourcePack)) { throw new RuntimeException("Not a ModResourcePack!"); } T var3 = ResourcePackProfile.of("fabric/" + ((ModResourcePack) pack).getFabricModMetadata().getId(), - false, () -> pack, factory, ResourcePackProfile.InsertionPosition.TOP); + false, () -> pack, factory, ResourcePackProfile.InsertionPosition.TOP); if (var3 != null) { map.put(var3.getName(), var3); diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackUtil.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackUtil.java index 6d35cd330..3a56f17ae 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackUtil.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ModResourcePackUtil.java @@ -16,35 +16,37 @@ package net.fabricmc.fabric.impl.resources; -import com.google.common.base.Charsets; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.fabricmc.loader.api.metadata.ModMetadata; -import net.minecraft.resource.ResourcePack; -import net.minecraft.resource.ResourceType; -import org.apache.commons.io.IOUtils; - import java.io.InputStream; import java.nio.file.Path; import java.util.List; +import com.google.common.base.Charsets; +import org.apache.commons.io.IOUtils; + +import net.minecraft.resource.ResourcePack; +import net.minecraft.resource.ResourceType; + +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; +import net.fabricmc.loader.api.metadata.ModMetadata; + /** * Internal utilities for managing resource packs. */ public final class ModResourcePackUtil { public static final int PACK_FORMAT_VERSION = 4; - private ModResourcePackUtil() { - - } + private ModResourcePackUtil() { } public static void appendModResourcePacks(List packList, ResourceType type) { for (ModContainer container : FabricLoader.getInstance().getAllMods()) { - if(container.getMetadata().getType().equals("builtin")){ + if (container.getMetadata().getType().equals("builtin")) { continue; } + Path path = container.getRootPath(); ResourcePack pack = new ModNioResourcePack(container.getMetadata(), path, null); + if (!pack.getNamespaces(type).isEmpty()) { packList.add(pack); } @@ -57,17 +59,19 @@ public final class ModResourcePackUtil { public static InputStream openDefault(ModMetadata info, String filename) { switch (filename) { - case "pack.mcmeta": - String description = info.getName(); - if (description == null) { - description = ""; - } else { - description = description.replaceAll("\"", "\\\""); - } - String pack = String.format("{\"pack\":{\"pack_format\":" + PACK_FORMAT_VERSION + ",\"description\":\"%s\"}}", description); - return IOUtils.toInputStream(pack, Charsets.UTF_8); - default: - return null; + case "pack.mcmeta": + String description = info.getName(); + + if (description == null) { + description = ""; + } else { + description = description.replaceAll("\"", "\\\""); + } + + String pack = String.format("{\"pack\":{\"pack_format\":" + PACK_FORMAT_VERSION + ",\"description\":\"%s\"}}", description); + return IOUtils.toInputStream(pack, Charsets.UTF_8); + default: + return null; } } diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ResourceManagerHelperImpl.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ResourceManagerHelperImpl.java index fbea2ba7a..e25df6d1b 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ResourceManagerHelperImpl.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resources/ResourceManagerHelperImpl.java @@ -16,16 +16,24 @@ package net.fabricmc.fabric.impl.resources; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; -import net.fabricmc.fabric.api.resource.ResourceManagerHelper; -import net.minecraft.resource.ResourceReloadListener; -import net.minecraft.resource.ResourceType; -import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.*; +import net.minecraft.resource.ResourceReloadListener; +import net.minecraft.resource.ResourceType; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; public class ResourceManagerHelperImpl implements ResourceManagerHelper { private static final Map registryMap = new HashMap<>(); @@ -40,6 +48,7 @@ public class ResourceManagerHelperImpl implements ResourceManagerHelper { public static void sort(ResourceType type, List listeners) { ResourceManagerHelperImpl instance = registryMap.get(type); + if (instance != null) { instance.sort(listeners); } @@ -56,6 +65,7 @@ public class ResourceManagerHelperImpl implements ResourceManagerHelper { List listenersToAdd = Lists.newArrayList(addedListeners); Set resolvedIds = new HashSet<>(); + for (ResourceReloadListener listener : listeners) { if (listener instanceof IdentifiableResourceReloadListener) { resolvedIds.add(((IdentifiableResourceReloadListener) listener).getFabricId()); @@ -63,12 +73,15 @@ public class ResourceManagerHelperImpl implements ResourceManagerHelper { } int lastSize = -1; + while (listeners.size() != lastSize) { lastSize = listeners.size(); Iterator it = listenersToAdd.iterator(); + while (it.hasNext()) { IdentifiableResourceReloadListener listener = it.next(); + if (resolvedIds.containsAll(listener.getFabricDependencies())) { resolvedIds.add(listener.getFabricId()); listeners.add(listener); diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinDefaultResourcePack.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinDefaultResourcePack.java index b71b96b2b..6ec46bfb6 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinDefaultResourcePack.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinDefaultResourcePack.java @@ -16,27 +16,27 @@ package net.fabricmc.fabric.mixin.resources; -import net.minecraft.resource.DefaultResourcePack; -import net.minecraft.resource.DirectoryResourcePack; -import net.minecraft.resource.ResourceType; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.resource.DefaultResourcePack; +import net.minecraft.resource.DirectoryResourcePack; +import net.minecraft.resource.ResourceType; +import net.minecraft.util.Identifier; + @Mixin(DefaultResourcePack.class) public class MixinDefaultResourcePack { - @Inject(method = "findInputStream", at = @At("HEAD"), cancellable = true) protected void onFindInputStream(ResourceType resourceType, Identifier identifier, CallbackInfoReturnable callback) { - if(DefaultResourcePack.resourcePath != null) { + if (DefaultResourcePack.resourcePath != null) { // Fall through to Vanilla logic, they have a special case here. return; } @@ -48,11 +48,11 @@ public class MixinDefaultResourcePack { Enumeration candidates = DefaultResourcePack.class.getClassLoader().getResources(path); // Get the last element - while(candidates.hasMoreElements()) { + while (candidates.hasMoreElements()) { found = candidates.nextElement(); } - if(found == null || !DirectoryResourcePack.isValidPath(new File(found.getFile()), "/" + path)) { + if (found == null || !DirectoryResourcePack.isValidPath(new File(found.getFile()), "/" + path)) { // Mimics vanilla behavior callback.setReturnValue(null); @@ -63,7 +63,7 @@ public class MixinDefaultResourcePack { } try { - if(found != null) { + if (found != null) { callback.setReturnValue(found.openStream()); } } catch (Exception e) { diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinKeyedResourceReloadListener.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinKeyedResourceReloadListener.java index 18491be05..a52f83160 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinKeyedResourceReloadListener.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinKeyedResourceReloadListener.java @@ -16,8 +16,12 @@ package net.fabricmc.fabric.mixin.resources; -import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; -import net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys; +import java.util.Collection; +import java.util.Collections; +import java.util.Locale; + +import org.spongepowered.asm.mixin.Mixin; + import net.minecraft.client.font.FontManager; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.block.BlockRenderManager; @@ -32,20 +36,18 @@ import net.minecraft.server.function.CommandFunctionManager; import net.minecraft.tag.RegistryTagManager; import net.minecraft.util.Identifier; import net.minecraft.world.loot.LootManager; -import org.spongepowered.asm.mixin.Mixin; -import java.util.Collection; -import java.util.Collections; -import java.util.Locale; +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys; public class MixinKeyedResourceReloadListener { @Mixin({ - /* public */ - SoundLoader.class, FontManager.class, BakedModelManager.class, LanguageManager.class, TextureManager.class, - /* private */ - WorldRenderer.class, BlockRenderManager.class, ItemRenderer.class + /* public */ + SoundLoader.class, FontManager.class, BakedModelManager.class, LanguageManager.class, TextureManager.class, + /* private */ + WorldRenderer.class, BlockRenderManager.class, ItemRenderer.class }) - public static abstract class Client implements IdentifiableResourceReloadListener { + public abstract static class Client implements IdentifiableResourceReloadListener { private Collection fabric_idDeps; private Identifier fabric_id; @@ -53,7 +55,8 @@ public class MixinKeyedResourceReloadListener { @SuppressWarnings({"ConstantConditions", "RedundantCast"}) public Collection getFabricDependencies() { if (fabric_idDeps == null) { - Object self = (Object) this; + Object self = this; + if (self instanceof BakedModelManager || self instanceof WorldRenderer) { fabric_idDeps = Collections.singletonList(ResourceReloadListenerKeys.TEXTURES); } else if (self instanceof ItemRenderer || self instanceof BlockRenderManager) { @@ -70,7 +73,7 @@ public class MixinKeyedResourceReloadListener { @SuppressWarnings({"ConstantConditions", "RedundantCast"}) public Identifier getFabricId() { if (fabric_id == null) { - Object self = (Object) this; + Object self = this; if (self instanceof SoundLoader) { fabric_id = ResourceReloadListenerKeys.SOUNDS; @@ -92,11 +95,11 @@ public class MixinKeyedResourceReloadListener { } @Mixin({ - /* public */ - RecipeManager.class, ServerAdvancementLoader.class, CommandFunctionManager.class, LootManager.class, RegistryTagManager.class - /* private */ + /* public */ + RecipeManager.class, ServerAdvancementLoader.class, CommandFunctionManager.class, LootManager.class, RegistryTagManager.class + /* private */ }) - public static abstract class Server implements IdentifiableResourceReloadListener { + public abstract static class Server implements IdentifiableResourceReloadListener { private Collection fabric_idDeps; private Identifier fabric_id; @@ -104,7 +107,7 @@ public class MixinKeyedResourceReloadListener { @SuppressWarnings({"ConstantConditions", "RedundantCast"}) public Collection getFabricDependencies() { if (fabric_idDeps == null) { - Object self = (Object) this; + Object self = this; if (self instanceof RegistryTagManager) { fabric_idDeps = Collections.emptyList(); @@ -120,8 +123,8 @@ public class MixinKeyedResourceReloadListener { @SuppressWarnings({"ConstantConditions", "RedundantCast"}) public Identifier getFabricId() { if (fabric_id == null) { - Object self = (Object) this; - ; + Object self = this; + if (self instanceof RecipeManager) { fabric_id = ResourceReloadListenerKeys.RECIPES; } else if (self instanceof ServerAdvancementLoader) { diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftGame.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftGame.java index d86d42c4d..2654aa34e 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftGame.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftGame.java @@ -16,13 +16,13 @@ package net.fabricmc.fabric.mixin.resources; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collector; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import com.google.common.collect.Lists; -import net.fabricmc.fabric.impl.resources.ModResourcePackUtil; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.resource.DefaultClientResourcePack; -import net.minecraft.resource.ReloadableResourceManager; -import net.minecraft.resource.ResourcePack; -import net.minecraft.resource.ResourceType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -31,11 +31,13 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.resource.DefaultClientResourcePack; +import net.minecraft.resource.ReloadableResourceManager; +import net.minecraft.resource.ResourcePack; +import net.minecraft.resource.ResourceType; + +import net.fabricmc.fabric.impl.resources.ModResourcePackUtil; @Mixin(MinecraftClient.class) public class MixinMinecraftGame { @@ -47,6 +49,7 @@ public class MixinMinecraftGame { list.clear(); boolean appended = false; + for (int i = 0; i < oldList.size(); i++) { ResourcePack pack = oldList.get(i); list.add(pack); @@ -59,15 +62,17 @@ public class MixinMinecraftGame { if (!appended) { StringBuilder builder = new StringBuilder("Fabric could not find resource pack injection location!"); + for (ResourcePack rp : oldList) { builder.append("\n - ").append(rp.getName()).append(" (").append(rp.getClass().getName()).append(")"); } + throw new RuntimeException(builder.toString()); } } @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;collect(Ljava/util/stream/Collector;)Ljava/lang/Object;")) - public Object initResources(Stream stream, Collector collector){ + public Object initResources(Stream stream, Collector collector) { List fabricResourcePacks = stream.collect(Collectors.toList()); fabric_modifyResourcePackList(fabricResourcePacks); //noinspection unchecked diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java index e4b14f12d..e989528f7 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java @@ -16,19 +16,21 @@ package net.fabricmc.fabric.mixin.resources; -import net.fabricmc.fabric.impl.resources.ModResourcePackCreator; -import net.minecraft.resource.ResourcePackProfile; -import net.minecraft.resource.ResourcePackManager; -import net.minecraft.resource.ResourceType; -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.level.LevelProperties; +import java.io.File; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.io.File; +import net.minecraft.resource.ResourcePackManager; +import net.minecraft.resource.ResourcePackProfile; +import net.minecraft.resource.ResourceType; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.LevelProperties; + +import net.fabricmc.fabric.impl.resources.ModResourcePackCreator; @Mixin(MinecraftServer.class) public class MixinMinecraftServer { diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImpl.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImpl.java index d6aa3fbef..156768a52 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImpl.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImpl.java @@ -16,19 +16,21 @@ package net.fabricmc.fabric.mixin.resources; -import net.fabricmc.fabric.impl.resources.ResourceManagerHelperImpl; -import net.minecraft.resource.ReloadableResourceManagerImpl; -import net.minecraft.resource.ResourceReloadListener; -import net.minecraft.resource.ResourceType; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; +import net.minecraft.resource.ReloadableResourceManagerImpl; +import net.minecraft.resource.ResourceReloadListener; +import net.minecraft.resource.ResourceType; + +import net.fabricmc.fabric.impl.resources.ResourceManagerHelperImpl; @Mixin(ReloadableResourceManagerImpl.class) public class MixinReloadableResourceManagerImpl { diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImplClient.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImplClient.java index aaf3d596f..8e904e4fa 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImplClient.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resources/MixinReloadableResourceManagerImplClient.java @@ -16,20 +16,22 @@ package net.fabricmc.fabric.mixin.resources; -import net.fabricmc.fabric.impl.resources.ResourceManagerHelperImpl; -import net.minecraft.resource.ReloadableResourceManagerImpl; -import net.minecraft.resource.ResourceReloadListener; -import net.minecraft.resource.ResourceReloadMonitor; -import net.minecraft.resource.ResourceType; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; +import net.minecraft.resource.ReloadableResourceManagerImpl; +import net.minecraft.resource.ResourceReloadListener; +import net.minecraft.resource.ResourceReloadMonitor; +import net.minecraft.resource.ResourceType; + +import net.fabricmc.fabric.impl.resources.ResourceManagerHelperImpl; @Mixin(ReloadableResourceManagerImpl.class) public class MixinReloadableResourceManagerImplClient { diff --git a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/api/tag/TagRegistry.java b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/api/tag/TagRegistry.java index f86aceef7..804f60d75 100644 --- a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/api/tag/TagRegistry.java +++ b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/api/tag/TagRegistry.java @@ -16,25 +16,29 @@ package net.fabricmc.fabric.api.tag; -import net.fabricmc.fabric.impl.tag.TagDelegate; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.function.Supplier; + import net.minecraft.block.Block; import net.minecraft.entity.EntityType; import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; -import net.minecraft.tag.*; +import net.minecraft.tag.BlockTags; +import net.minecraft.tag.EntityTypeTags; +import net.minecraft.tag.FluidTags; +import net.minecraft.tag.ItemTags; +import net.minecraft.tag.Tag; +import net.minecraft.tag.TagContainer; import net.minecraft.util.Identifier; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.function.Supplier; +import net.fabricmc.fabric.impl.tag.TagDelegate; /** * Helper methods for registering Tags. */ public final class TagRegistry { - private TagRegistry() { - - } + private TagRegistry() { } public static Tag create(Identifier id, Supplier> containerSupplier) { return new TagDelegate(id, null) { @@ -43,6 +47,7 @@ public final class TagRegistry { @Override protected void onAccess() { TagContainer currContainer = containerSupplier.get(); + if (container != currContainer) { container = currContainer; delegate = container.getOrCreate(this.getId()); diff --git a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/impl/tag/TagDelegate.java b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/impl/tag/TagDelegate.java index 72569fbb9..b71f84239 100644 --- a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/impl/tag/TagDelegate.java +++ b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/impl/tag/TagDelegate.java @@ -16,11 +16,11 @@ package net.fabricmc.fabric.impl.tag; +import java.util.Collection; + import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; -import java.util.Collection; - public class TagDelegate extends Tag { protected Tag delegate; @@ -29,9 +29,7 @@ public class TagDelegate extends Tag { this.delegate = delegate; } - protected void onAccess() { - - } + protected void onAccess() { } @Override public boolean contains(T var1) { diff --git a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTag.java b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTag.java index 8b21aa6cd..27b2da38a 100644 --- a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTag.java +++ b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTag.java @@ -16,12 +16,14 @@ package net.fabricmc.fabric.mixin.tag; -import net.fabricmc.fabric.api.tag.FabricTag; -import net.fabricmc.fabric.impl.tag.FabricTagHooks; -import net.minecraft.tag.Tag; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; +import net.minecraft.tag.Tag; + +import net.fabricmc.fabric.api.tag.FabricTag; +import net.fabricmc.fabric.impl.tag.FabricTagHooks; + @Mixin(Tag.class) public class MixinTag implements FabricTag, FabricTagHooks { @Unique diff --git a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTagBuilder.java b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTagBuilder.java index fdf528bc9..cc2692a9b 100644 --- a/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTagBuilder.java +++ b/fabric-tag-extensions-v0/src/main/java/net/fabricmc/fabric/mixin/tag/MixinTagBuilder.java @@ -16,11 +16,10 @@ package net.fabricmc.fabric.mixin.tag; +import java.util.Set; +import java.util.function.Function; + import com.google.gson.JsonObject; -import net.fabricmc.fabric.api.tag.FabricTagBuilder; -import net.fabricmc.fabric.impl.tag.FabricTagHooks; -import net.minecraft.tag.Tag; -import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -28,8 +27,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Set; -import java.util.function.Function; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.api.tag.FabricTagBuilder; +import net.fabricmc.fabric.impl.tag.FabricTagHooks; @Mixin(Tag.Builder.class) public class MixinTagBuilder implements FabricTagBuilder { diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/CustomSpriteLoader.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/CustomSpriteLoader.java index 33887a4a8..1a24e0be8 100644 --- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/CustomSpriteLoader.java +++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/CustomSpriteLoader.java @@ -16,10 +16,10 @@ package net.fabricmc.fabric.api.client.texture; -import net.minecraft.resource.ResourceManager; - import java.io.IOException; +import net.minecraft.resource.ResourceManager; + /** * Implement this interface on a Sprite to use a custom loading process instead * of the default (loading a .PNG). diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/DependentSprite.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/DependentSprite.java index 85f4977ff..3f1b7a7ab 100644 --- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/DependentSprite.java +++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/client/texture/DependentSprite.java @@ -16,15 +16,15 @@ package net.fabricmc.fabric.api.client.texture; -import net.minecraft.util.Identifier; - import java.util.Set; +import net.minecraft.util.Identifier; + /** * Implement this interface on a Sprite to declare additional dependencies * that should be processed prior to this sprite. - *

- * Best used in conjunction with {@link CustomSpriteLoader}. + * + *

Best used in conjunction with {@link CustomSpriteLoader}. */ public interface DependentSprite { /** diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientSpriteRegistryCallback.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientSpriteRegistryCallback.java index dec7cf460..f622de34d 100644 --- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientSpriteRegistryCallback.java +++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/api/event/client/ClientSpriteRegistryCallback.java @@ -16,14 +16,15 @@ package net.fabricmc.fabric.api.event.client; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.impl.client.texture.SpriteRegistryCallbackHolder; +import java.util.Map; +import java.util.function.Consumer; + import net.minecraft.client.texture.Sprite; import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.util.Identifier; -import java.util.Map; -import java.util.function.Consumer; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.impl.client.texture.SpriteRegistryCallbackHolder; public interface ClientSpriteRegistryCallback { /** @@ -31,7 +32,7 @@ public interface ClientSpriteRegistryCallback { * started making use of multiple sprite atlases, it is unwise to register sprites to *all* of them. */ @Deprecated - public static final Event EVENT = SpriteRegistryCallbackHolder.EVENT_GLOBAL; + Event EVENT = SpriteRegistryCallbackHolder.EVENT_GLOBAL; void registerSprites(SpriteAtlasTexture atlasTexture, Registry registry); @@ -55,7 +56,7 @@ public interface ClientSpriteRegistryCallback { event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register(callback); } - public static class Registry { + class Registry { private final Map spriteMap; private final Consumer defaultSpriteRegister; diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/impl/client/texture/SpriteRegistryCallbackHolder.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/impl/client/texture/SpriteRegistryCallbackHolder.java index b55e11187..734b9013f 100644 --- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/impl/client/texture/SpriteRegistryCallbackHolder.java +++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/impl/client/texture/SpriteRegistryCallbackHolder.java @@ -16,17 +16,18 @@ package net.fabricmc.fabric.impl.client.texture; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; -import net.minecraft.util.Identifier; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; + public final class SpriteRegistryCallbackHolder { public static final Event EVENT_GLOBAL = createEvent(); private static final Map> eventMap = new ConcurrentHashMap<>(); @@ -34,9 +35,7 @@ public final class SpriteRegistryCallbackHolder { private static final Lock eventMapReadLock = eventMapLock.readLock(); private static final Lock eventMapWriteLock = eventMapLock.writeLock(); - private SpriteRegistryCallbackHolder() { - - } + private SpriteRegistryCallbackHolder() { } public static Event eventLocal(Identifier key) { return eventMap.computeIfAbsent(key, (a) -> createEvent()); diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinSpriteAtlasTexture.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinSpriteAtlasTexture.java index 684fb24e9..df303aa30 100644 --- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinSpriteAtlasTexture.java +++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinSpriteAtlasTexture.java @@ -16,18 +16,15 @@ package net.fabricmc.fabric.mixin.client.texture; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + import com.google.common.base.Joiner; -import net.fabricmc.fabric.api.client.texture.*; -import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; -import net.fabricmc.fabric.impl.client.texture.SpriteAtlasTextureHooks; -import net.fabricmc.fabric.impl.client.texture.SpriteRegistryCallbackHolder; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -38,8 +35,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.io.IOException; -import java.util.*; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; +import net.minecraft.util.crash.CrashException; +import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.crash.CrashReportSection; + +import net.fabricmc.fabric.api.client.texture.CustomSpriteLoader; +import net.fabricmc.fabric.api.client.texture.DependentSprite; +import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback; +import net.fabricmc.fabric.impl.client.texture.SpriteAtlasTextureHooks; +import net.fabricmc.fabric.impl.client.texture.SpriteRegistryCallbackHolder; @Mixin(SpriteAtlasTexture.class) public abstract class MixinSpriteAtlasTexture implements SpriteAtlasTextureHooks { @@ -78,17 +86,21 @@ public abstract class MixinSpriteAtlasTexture implements SpriteAtlasTextureHooks public Set beforeSpriteLoad(Set set) { fabric_injectedSprites = new HashMap<>(); ClientSpriteRegistryCallback.Registry registry = new ClientSpriteRegistryCallback.Registry(fabric_injectedSprites, set::add); + //noinspection ConstantConditions for (Identifier id : fabric_localIds) { SpriteRegistryCallbackHolder.eventLocal(id).invoker().registerSprites((SpriteAtlasTexture) (Object) this, registry); } + SpriteRegistryCallbackHolder.EVENT_GLOBAL.invoker().registerSprites((SpriteAtlasTexture) (Object) this, registry); // TODO: Unoptimized. Set dependentSprites = new HashSet<>(); Set dependentSpriteIds = new HashSet<>(); + for (Identifier id : set) { Sprite sprite; + if ((sprite = fabric_injectedSprites.get(id)) instanceof DependentSprite) { dependentSprites.add((DependentSprite) sprite); dependentSpriteIds.add(id); @@ -111,11 +123,13 @@ public abstract class MixinSpriteAtlasTexture implements SpriteAtlasTextureHooks } int lastSpriteSize = 0; + while (lastSpriteSize != result.size() && result.size() < set.size()) { lastSpriteSize = result.size(); for (DependentSprite sprite : dependentSprites) { Identifier id = ((Sprite) sprite).getId(); + if (!result.contains(id) && result.containsAll(sprite.getDependencies())) { result.add(id); } @@ -124,14 +138,17 @@ public abstract class MixinSpriteAtlasTexture implements SpriteAtlasTextureHooks if (result.size() < set.size()) { CrashReport report = CrashReport.create(new Throwable(), "Resolving sprite dependencies"); + for (DependentSprite sprite : dependentSprites) { Identifier id = ((Sprite) sprite).getId(); + if (!result.contains(id)) { CrashReportSection element = report.addElement("Unresolved sprite"); element.add("Sprite", id); element.add("Dependencies", Joiner.on(',').join(sprite.getDependencies())); } } + throw new CrashException(report); } } diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java index 6e458cf4d..29325de44 100644 --- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java +++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java @@ -16,15 +16,17 @@ package net.fabricmc.fabric.mixin.client.texture; -import net.fabricmc.fabric.impl.client.texture.SpriteAtlasTextureHooks; -import net.minecraft.client.texture.AbstractTexture; -import net.minecraft.client.texture.TextureManager; -import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.texture.AbstractTexture; +import net.minecraft.client.texture.TextureManager; +import net.minecraft.util.Identifier; + +import net.fabricmc.fabric.impl.client.texture.SpriteAtlasTextureHooks; + @Mixin(TextureManager.class) public class MixinTextureManager { @Inject(at = @At("RETURN"), method = "registerTexture")