diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/BooleanPropertyMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/BooleanPropertyMixin.java index 5d03f7f..2a74c8e 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/BooleanPropertyMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/BooleanPropertyMixin.java @@ -49,6 +49,11 @@ abstract class BooleanPropertyMixin extends Property implements Propert return false; } + @Override + public final boolean moonrise$requiresDefaultImpl() { + return false; + } + @Override public final int moonrise$getIdFor(final Boolean value) { return value.booleanValue() ? 1 : 0; diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/EnumPropertyMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/EnumPropertyMixin.java index f866831..2b5041a 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/EnumPropertyMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/EnumPropertyMixin.java @@ -50,6 +50,11 @@ abstract class EnumPropertyMixin & StringRepresentable> extend return this == obj; } + @Override + public final boolean moonrise$requiresDefaultImpl() { + return false; + } + @Override public final int moonrise$getIdFor(final T value) { final Class target = this.getValueClass(); diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/IntegerPropertyMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/IntegerPropertyMixin.java index 9997b2f..3153e6a 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/IntegerPropertyMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/IntegerPropertyMixin.java @@ -33,6 +33,11 @@ abstract class IntegerPropertyMixin extends Property implements Propert return this == obj; } + @Override + public final boolean moonrise$requiresDefaultImpl() { + return false; + } + @Override public final int moonrise$getIdFor(final Integer value) { final int val = value.intValue(); diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/PropertyMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/PropertyMixin.java index 98e527d..2b152ec 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/PropertyMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/blockstate_propertyaccess/PropertyMixin.java @@ -1,24 +1,33 @@ package ca.spottedleaf.moonrise.mixin.blockstate_propertyaccess; import ca.spottedleaf.moonrise.patches.blockstate_propertyaccess.PropertyAccess; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.world.level.block.state.properties.Property; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; 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 java.util.Collection; import java.util.concurrent.atomic.AtomicInteger; @Mixin(Property.class) abstract class PropertyMixin> implements PropertyAccess { + @Shadow + public abstract Collection getPossibleValues(); + @Unique private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); @Unique private int id; + @Unique + private Object2IntOpenHashMap defaultById; + /** * @reason Hook into constructor to init fields * @author Spottedleaf @@ -31,6 +40,17 @@ abstract class PropertyMixin> implements PropertyAccess< ) private void initId(final CallbackInfo ci) { this.id = ID_GENERATOR.getAndIncrement(); + + final Collection values = this.getPossibleValues(); + + if (this.moonrise$requiresDefaultImpl()) { + this.defaultById = new Object2IntOpenHashMap<>(values.size()); + + int id = 0; + for (final T value : values) { + this.defaultById.put(value, id++); + } + } } @Override @@ -48,7 +68,9 @@ abstract class PropertyMixin> implements PropertyAccess< return this == obj; } - // this is re-declared here so that calls to Property#getIdFor are a virtual method invoke, rather than an interface invoke + // add default implementation in case mods create their own Properties @Override - public abstract int moonrise$getIdFor(final T value); + public int moonrise$getIdFor(final T value) { + return this.defaultById.getOrDefault(value, -1); + } } diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/blockstate_propertyaccess/PropertyAccess.java b/src/main/java/ca/spottedleaf/moonrise/patches/blockstate_propertyaccess/PropertyAccess.java index ed70e71..77a037a 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/blockstate_propertyaccess/PropertyAccess.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/blockstate_propertyaccess/PropertyAccess.java @@ -6,4 +6,8 @@ public interface PropertyAccess { public int moonrise$getIdFor(final T value); + public default boolean moonrise$requiresDefaultImpl() { + return true; + } + }