diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java index 526f51d5f..eebff84c8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.block.properties; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.sparrow.nbt.ByteTag; import net.momirealms.sparrow.nbt.Tag; @@ -8,8 +9,9 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class BooleanProperty extends Property { - public final static Factory FACTORY = new Factory(); +public final class BooleanProperty extends Property { + public static final Key ID = Key.of("craftengine:boolean"); + public static final PropertyFactory FACTORY = new Factory(); private static final List VALUES = List.of(true, false); private static final Boolean[] BY_ID = new Boolean[]{ Boolean.FALSE, Boolean.TRUE }; private static final ByteTag TRUE = new ByteTag((byte) 1); @@ -81,9 +83,10 @@ public class BooleanProperty extends Property { return new BooleanProperty(name, defaultValue); } - public static class Factory implements PropertyFactory { + private static class Factory implements PropertyFactory { + @Override - public Property create(String name, Map arguments) { + public Property create(String name, Map arguments) { boolean bool = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("default", false), "default"); return BooleanProperty.create(name, bool); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java index 3ff181c94..49ac95204 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java @@ -7,7 +7,7 @@ import net.momirealms.sparrow.nbt.Tag; import java.lang.reflect.Array; import java.util.*; -public class EnumProperty> extends Property { +public final class EnumProperty> extends Property { private final List values; private final Map names; private final int[] ordinalToIndex; @@ -106,7 +106,11 @@ public class EnumProperty> extends Property { return new EnumProperty<>(name, type, values, defaultValue); } - public static class Factory> implements PropertyFactory { + public static > PropertyFactory factory(Class enumClass) { + return new Factory<>(enumClass); + } + + private static class Factory> implements PropertyFactory { private final Class enumClass; public Factory(Class enumClass) { @@ -114,7 +118,7 @@ public class EnumProperty> extends Property { } @Override - public Property create(String name, Map arguments) { + public Property create(String name, Map arguments) { List enums = Arrays.asList(enumClass.getEnumConstants()); String defaultValueName = arguments.getOrDefault("default", "").toString().toLowerCase(Locale.ENGLISH); A defaultValue = enums.stream() diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java index 00bf88224..46000a5d5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.block.properties; import it.unimi.dsi.fastutil.ints.IntImmutableList; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.sparrow.nbt.IntTag; import net.momirealms.sparrow.nbt.NumericTag; @@ -12,8 +13,9 @@ import java.util.Map; import java.util.Optional; import java.util.stream.IntStream; -public class IntegerProperty extends Property { - public static final Factory FACTORY = new Factory(); +public final class IntegerProperty extends Property { + public static final Key ID = Key.of("craftengine:int"); + public static final PropertyFactory FACTORY = new Factory(); private final IntImmutableList values; public final int min; public final int max; @@ -95,9 +97,10 @@ public class IntegerProperty extends Property { return new IntegerProperty(name, min, max, defaultValue); } - public static class Factory implements PropertyFactory { + private static class Factory implements PropertyFactory { + @Override - public Property create(String name, Map arguments) { + public Property create(String name, Map arguments) { String range = arguments.getOrDefault("range", "1~1").toString(); String[] split = range.split("~"); if (split.length != 2) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java index 641c71a72..f8b7fa68e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -10,49 +10,39 @@ import net.momirealms.craftengine.core.util.*; import java.util.Map; public final class Properties { - public static final Key BOOLEAN = Key.of("craftengine:boolean"); - public static final Key INT = Key.of("craftengine:int"); - public static final Key STRING = Key.of("craftengine:string"); - public static final Key AXIS = Key.of("craftengine:axis"); - public static final Key HORIZONTAL_DIRECTION = Key.of("craftengine:horizontal_direction"); - public static final Key DIRECTION = Key.of("craftengine:direction"); - public static final Key SINGLE_BLOCK_HALF = Key.of("craftengine:single_block_half"); - public static final Key DOUBLE_BLOCK_HALF = Key.of("craftengine:double_block_half"); - public static final Key HINGE = Key.of("craftengine:hinge"); - public static final Key STAIRS_SHAPE = Key.of("craftengine:stairs_shape"); - public static final Key SLAB_TYPE = Key.of("craftengine:slab_type"); - public static final Key SOFA_SHAPE = Key.of("craftengine:sofa_shape"); - public static final Key ANCHOR_TYPE = Key.of("craftengine:anchor_type"); + public static final PropertyType BOOLEAN = register(BooleanProperty.ID, BooleanProperty.FACTORY); + public static final PropertyType INT = register(IntegerProperty.ID, IntegerProperty.FACTORY); + public static final PropertyType STRING = register(StringProperty.ID, StringProperty.FACTORY); + public static final PropertyType AXIS = register(Key.of("craftengine:axis"), EnumProperty.factory(Direction.Axis.class)); + public static final PropertyType HORIZONTAL_DIRECTION = register(Key.of("craftengine:horizontal_direction"), EnumProperty.factory(HorizontalDirection.class)); + public static final PropertyType FOUR_DIRECTION = register(Key.of("craftengine:4-direction"), EnumProperty.factory(HorizontalDirection.class)); + public static final PropertyType DIRECTION = register(Key.of("craftengine:direction"), EnumProperty.factory(Direction.class)); + public static final PropertyType SIX_DIRECTION = register(Key.of("craftengine:6-direction"), EnumProperty.factory(Direction.class)); + public static final PropertyType SINGLE_BLOCK_HALF = register(Key.of("craftengine:single_block_half"), EnumProperty.factory(SingleBlockHalf.class)); + public static final PropertyType DOUBLE_BLOCK_HALF = register(Key.of("craftengine:double_block_half"), EnumProperty.factory(DoubleBlockHalf.class)); + public static final PropertyType HINGE = register(Key.of("craftengine:hinge"), EnumProperty.factory(DoorHinge.class)); + public static final PropertyType STAIRS_SHAPE = register(Key.of("craftengine:stairs_shape"), EnumProperty.factory(StairsShape.class)); + public static final PropertyType SLAB_TYPE = register(Key.of("craftengine:slab_type"), EnumProperty.factory(SlabType.class)); + public static final PropertyType SOFA_SHAPE = register(Key.of("craftengine:sofa_shape"), EnumProperty.factory(SofaShape.class)); + public static final PropertyType ANCHOR_TYPE = register(Key.of("craftengine:anchor_type"), EnumProperty.factory(AnchorType.class)); - static { - register(BOOLEAN, BooleanProperty.FACTORY); - register(INT, IntegerProperty.FACTORY); - register(STRING, StringProperty.FACTORY); - register(AXIS, new EnumProperty.Factory<>(Direction.Axis.class)); - register(DIRECTION, new EnumProperty.Factory<>(Direction.class)); - register(Key.of("craftengine:6-direction"), new EnumProperty.Factory<>(Direction.class)); - register(HORIZONTAL_DIRECTION, new EnumProperty.Factory<>(HorizontalDirection.class)); - register(Key.of("craftengine:4-direction"), new EnumProperty.Factory<>(HorizontalDirection.class)); - register(SINGLE_BLOCK_HALF, new EnumProperty.Factory<>(SingleBlockHalf.class)); - register(DOUBLE_BLOCK_HALF, new EnumProperty.Factory<>(DoubleBlockHalf.class)); - register(HINGE, new EnumProperty.Factory<>(DoorHinge.class)); - register(STAIRS_SHAPE, new EnumProperty.Factory<>(StairsShape.class)); - register(SLAB_TYPE, new EnumProperty.Factory<>(SlabType.class)); - register(SOFA_SHAPE, new EnumProperty.Factory<>(SofaShape.class)); - register(ANCHOR_TYPE, new EnumProperty.Factory<>(AnchorType.class)); + private Properties() {} + + public static > PropertyType register(Key key, PropertyFactory factory) { + PropertyType type = new PropertyType<>(key, factory); + ((WritableRegistry>) BuiltInRegistries.PROPERTY_TYPE) + .register(ResourceKey.create(Registries.PROPERTY_TYPE.location(), key), type); + return type; } - public static void register(Key key, PropertyFactory factory) { - ((WritableRegistry) BuiltInRegistries.PROPERTY_FACTORY).register(ResourceKey.create(Registries.PROPERTY_FACTORY.location(), key), factory); - } - - public static Property fromMap(String name, Map map) { + @SuppressWarnings("unchecked") + public static > Property fromMap(String name, Map map) { String type = ResourceConfigUtils.requireNonEmptyStringOrThrow(map.get("type"), "warning.config.block.state.property.missing_type"); Key key = Key.withDefaultNamespace(type, Key.DEFAULT_NAMESPACE); - PropertyFactory factory = BuiltInRegistries.PROPERTY_FACTORY.getValue(key); - if (factory == null) { + PropertyType propertyType = (PropertyType) BuiltInRegistries.PROPERTY_TYPE.getValue(key); + if (propertyType == null) { throw new LocalizedResourceConfigException("warning.config.block.state.property.invalid_type", key.toString(), name); } - return factory.create(name, map); + return propertyType.factory().create(name, map); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java index 32ea8ee86..4256a84e7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.core.block.properties; import java.util.Map; -public interface PropertyFactory { +public interface PropertyFactory> { - Property create(String name, Map arguments); + Property create(String name, Map arguments); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyType.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyType.java new file mode 100644 index 000000000..89d120a34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyType.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.craftengine.core.util.Key; + +public record PropertyType>(Key id, PropertyFactory factory) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java index f9a556df3..445d00b17 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.block.properties; import com.google.common.collect.ImmutableMap; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.sparrow.nbt.StringTag; import net.momirealms.sparrow.nbt.Tag; @@ -9,8 +10,9 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class StringProperty extends Property { - public static final Factory FACTORY = new Factory(); +public final class StringProperty extends Property { + public static final Key ID = Key.of("craftengine:string"); + public static final PropertyFactory FACTORY = new Factory(); private final List values; private final ImmutableMap names; @@ -90,10 +92,10 @@ public class StringProperty extends Property { return new StringProperty(name, values, defaultValue); } - public static class Factory implements PropertyFactory { + private static class Factory implements PropertyFactory { @Override - public Property create(String name, Map arguments) { + public Property create(String name, Map arguments) { List values = MiscUtils.getAsStringList(arguments.get("values")) .stream() .toList(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java index 76d3058b2..0eff3f033 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java @@ -9,11 +9,11 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import java.util.List; import java.util.Map; -public class AlternativesLootEntryContainer extends AbstractCompositeLootEntryContainer { +public final class AlternativesLootEntryContainer extends AbstractCompositeLootEntryContainer { public static final Key ID = Key.from("craftengine:alternatives"); public static final LootEntryContainerFactory FACTORY = new Factory<>(); - protected AlternativesLootEntryContainer(List> conditions, List> children) { + private AlternativesLootEntryContainer(List> conditions, List> children) { super(conditions, children); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/EmptyLoopEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/EmptyLoopEntryContainer.java index 48f9e72ab..764f7c140 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/EmptyLoopEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/EmptyLoopEntryContainer.java @@ -11,11 +11,11 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -public class EmptyLoopEntryContainer extends AbstractSingleLootEntryContainer { +public final class EmptyLoopEntryContainer extends AbstractSingleLootEntryContainer { public static final Key ID = Key.from("craftengine:empty"); public static final LootEntryContainerFactory FACTORY = new Factory<>(); - protected EmptyLoopEntryContainer(List> conditions, int weight, int quality) { + private EmptyLoopEntryContainer(List> conditions, int weight, int quality) { super(conditions, null, weight, quality); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java index c28027816..1a69b1fc9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -13,12 +13,12 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -public class ExpLootEntryContainer extends AbstractLootEntryContainer { +public final class ExpLootEntryContainer extends AbstractLootEntryContainer { public static final Key ID = Key.from("craftengine:exp"); public static final Factory FACTORY = new Factory<>(); private final NumberProvider value; - protected ExpLootEntryContainer(NumberProvider value, List> conditions) { + private ExpLootEntryContainer(NumberProvider value, List> conditions) { super(conditions); this.value = value; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/FurnitureItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/FurnitureItemLootEntryContainer.java index 3f280b11f..0cbb75760 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/FurnitureItemLootEntryContainer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/FurnitureItemLootEntryContainer.java @@ -16,11 +16,11 @@ import java.util.Map; import java.util.Optional; import java.util.function.Consumer; -public class FurnitureItemLootEntryContainer extends SingleItemLootEntryContainer { +public final class FurnitureItemLootEntryContainer extends SingleItemLootEntryContainer { public static final LootEntryContainerFactory FACTORY = new Factory<>(); private final boolean hasFallback; - protected FurnitureItemLootEntryContainer(@Nullable Key item, List> conditions, List> lootFunctions, int weight, int quality) { + private FurnitureItemLootEntryContainer(@Nullable Key item, List> conditions, List> lootFunctions, int weight, int quality) { super(item, conditions, lootFunctions, weight, quality); this.hasFallback = item != null; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java index 116f726e5..de42f4275 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorType; import net.momirealms.craftengine.core.block.entity.BlockEntityType; import net.momirealms.craftengine.core.block.entity.render.element.BlockEntityElementConfigFactory; -import net.momirealms.craftengine.core.block.properties.PropertyFactory; +import net.momirealms.craftengine.core.block.properties.PropertyType; import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehaviorType; import net.momirealms.craftengine.core.entity.furniture.element.FurnitureElementConfigFactory; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfigFactory; @@ -20,7 +20,6 @@ import net.momirealms.craftengine.core.item.recipe.network.modern.display.slot.S import net.momirealms.craftengine.core.item.recipe.remainder.CraftRemainderFactory; import net.momirealms.craftengine.core.item.recipe.result.PostProcessor; import net.momirealms.craftengine.core.item.updater.ItemUpdaterType; -import net.momirealms.craftengine.core.loot.LootContext; import net.momirealms.craftengine.core.loot.entry.LootEntryContainerType; import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; import net.momirealms.craftengine.core.loot.function.LootFunctionType; @@ -49,7 +48,7 @@ public final class BuiltInRegistries { public static final Registry BLOCK_BEHAVIOR_TYPE = createConstantBoundRegistry(Registries.BLOCK_BEHAVIOR_TYPE, 64); public static final Registry> ITEM_PROCESSOR_TYPE = createConstantBoundRegistry(Registries.ITEM_PROCESSOR_TYPE, 64); public static final Registry ITEM_BEHAVIOR_TYPE = createConstantBoundRegistry(Registries.ITEM_BEHAVIOR_TYPE, 64); - public static final Registry PROPERTY_FACTORY = createConstantBoundRegistry(Registries.PROPERTY_FACTORY, 16); + public static final Registry> PROPERTY_TYPE = createConstantBoundRegistry(Registries.PROPERTY_TYPE, 16); public static final Registry> LOOT_FUNCTION_TYPE = createConstantBoundRegistry(Registries.LOOT_FUNCTION_TYPE, 32); public static final Registry> LOOT_ENTRY_CONTAINER_TYPE = createConstantBoundRegistry(Registries.LOOT_ENTRY_CONTAINER_TYPE, 16); public static final Registry NUMBER_PROVIDER_FACTORY = createConstantBoundRegistry(Registries.NUMBER_PROVIDER_FACTORY, 16); diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java index c5adc39bc..52d872cba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.core.block.CustomBlock; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorType; import net.momirealms.craftengine.core.block.entity.BlockEntityType; import net.momirealms.craftengine.core.block.entity.render.element.BlockEntityElementConfigFactory; -import net.momirealms.craftengine.core.block.properties.PropertyFactory; +import net.momirealms.craftengine.core.block.properties.PropertyType; import net.momirealms.craftengine.core.entity.furniture.behavior.FurnitureBehaviorType; import net.momirealms.craftengine.core.entity.furniture.element.FurnitureElementConfigFactory; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfigFactory; @@ -50,7 +50,7 @@ public final class Registries { public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root"); public static final ResourceKey> BLOCK = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block")); public static final ResourceKey>> ITEM_PROCESSOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_processor_type")); - public static final ResourceKey> PROPERTY_FACTORY = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory")); + public static final ResourceKey>> PROPERTY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("property_type")); public static final ResourceKey> BLOCK_BEHAVIOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_type")); public static final ResourceKey> ITEM_BEHAVIOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_type")); public static final ResourceKey>> LOOT_FUNCTION_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_type"));