From 99a1ad6528c859d883be920a3c907820d9db6cd0 Mon Sep 17 00:00:00 2001 From: Talia-12 Date: Wed, 31 May 2023 22:03:38 +1000 Subject: [PATCH] made a proper registry for the Arithmetics, made it so media flow can enter/exit from the bottom of slates --- .../api/casting/castables/OperationAction.kt | 2 +- .../common/blocks/circles/BlockSlate.java | 4 +- .../common/lib/hex/HexArithmetics.java | 43 ++++++++++++++++++- .../hexcasting/xplat/IXplatAbstractions.java | 3 ++ .../hexcasting/fabric/FabricHexInitializer.kt | 4 +- .../fabric/xplat/FabricXplatImpl.java | 15 ++++++- .../hexcasting/forge/ForgeHexInitializer.java | 6 +-- .../forge/xplat/ForgeXplatImpl.java | 10 +++++ 8 files changed, 76 insertions(+), 11 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt index 5667b2f3..19f9ee0f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/castables/OperationAction.kt @@ -20,7 +20,7 @@ data class OperationAction(val pattern: HexPattern) : Action { stack.addAll(stackList) val startingLength = stackList.size return try { - val ret: Iterable = HexArithmetics.ENGINE.run(pattern, stack, startingLength) + val ret: Iterable = HexArithmetics.getEngine().run(pattern, stack, startingLength) ret.forEach(Consumer { e: Iota -> stack.add(e) }) val image2 = image.copy(stack = stack, opsConsumed = image.opsConsumed + 1) OperationResult(image2, listOf(), continuation, HexEvalSounds.NORMAL_EXECUTE) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockSlate.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockSlate.java index e28c72ca..371b36da 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockSlate.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/circles/BlockSlate.java @@ -104,7 +104,7 @@ public class BlockSlate extends BlockCircleComponent implements EntityBlock, Sim @Override public boolean canEnterFromDirection(Direction enterDir, BlockPos pos, BlockState bs, ServerLevel world) { var thisNormal = this.normalDir(pos, bs, world); - return enterDir != thisNormal && enterDir != thisNormal.getOpposite(); + return enterDir != thisNormal.getOpposite(); // && enterDir != thisNormal; } @Override @@ -112,7 +112,7 @@ public class BlockSlate extends BlockCircleComponent implements EntityBlock, Sim var allDirs = EnumSet.allOf(Direction.class); var normal = this.normalDir(pos, bs, world); allDirs.remove(normal); - allDirs.remove(normal.getOpposite()); +// allDirs.remove(normal.getOpposite()); return allDirs; } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexArithmetics.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexArithmetics.java index 6b559a09..27d59115 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexArithmetics.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/hex/HexArithmetics.java @@ -1,12 +1,51 @@ package at.petrak.hexcasting.common.lib.hex; +import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic; import at.petrak.hexcasting.api.casting.arithmetic.engine.ArithmeticEngine; import at.petrak.hexcasting.common.casting.arithmetic.DoubleArithmetic; import at.petrak.hexcasting.common.casting.arithmetic.ListArithmetic; import at.petrak.hexcasting.common.casting.arithmetic.Vec3Arithmetic; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; -import java.util.List; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +import static at.petrak.hexcasting.api.HexAPI.modLoc; public class HexArithmetics { - public static ArithmeticEngine ENGINE = new ArithmeticEngine(List.of(DoubleArithmetic.INSTANCE, Vec3Arithmetic.INSTANCE, ListArithmetic.INSTANCE)); + private static ArithmeticEngine ENGINE; + + public static ArithmeticEngine getEngine() { + if (ENGINE == null) { + ENGINE = new ArithmeticEngine(REGISTRY.holders().map(Holder.Reference::value).collect(Collectors.toList())); + } + return ENGINE; + } + + public static final Registry REGISTRY = IXplatAbstractions.INSTANCE.getArithmeticRegistry(); + + public static void register(BiConsumer r) { + for (var e : ARITHMETICS.entrySet()) { + r.accept(e.getValue(), e.getKey()); + } + } + + private static final Map ARITHMETICS = new LinkedHashMap<>(); + + public static DoubleArithmetic DOUBLE = make("double", DoubleArithmetic.INSTANCE); + public static Vec3Arithmetic VEC3 = make("vec3", Vec3Arithmetic.INSTANCE); + public static ListArithmetic LIST = make("list", ListArithmetic.INSTANCE); + + private static T make(String name, T arithmetic) { + var old = ARITHMETICS.put(modLoc(name), arithmetic); + if (old != null) { + throw new IllegalArgumentException("Typo? Duplicate id " + name); + } + return arithmetic; + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java b/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java index c8eb4231..c8a0bcc9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java +++ b/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java @@ -5,6 +5,7 @@ import at.petrak.hexcasting.api.addldata.ADHexHolder; import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.addldata.ADMediaHolder; import at.petrak.hexcasting.api.casting.ActionRegistryEntry; +import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic; import at.petrak.hexcasting.api.casting.castables.SpecialHandler; import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; import at.petrak.hexcasting.api.casting.eval.sideeffects.EvalSound; @@ -168,6 +169,8 @@ public interface IXplatAbstractions { Registry> getIotaTypeRegistry(); + Registry getArithmeticRegistry(); + Registry getEvalSoundRegistry(); boolean isBreakingAllowed(Level world, BlockPos pos, BlockState state, Player player); diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt index 7590b798..bee371d9 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt @@ -16,6 +16,7 @@ import at.petrak.hexcasting.common.entities.HexEntities import at.petrak.hexcasting.common.items.ItemJewelerHammer import at.petrak.hexcasting.common.lib.* import at.petrak.hexcasting.common.lib.hex.HexActions +import at.petrak.hexcasting.common.lib.hex.HexArithmetics import at.petrak.hexcasting.common.lib.hex.HexEvalSounds import at.petrak.hexcasting.common.lib.hex.HexIotaTypes import at.petrak.hexcasting.common.lib.hex.HexSpecialHandlers @@ -53,7 +54,7 @@ import net.minecraft.world.entity.player.Player import java.util.function.BiConsumer object FabricHexInitializer : ModInitializer { - public lateinit var CONFIG: FabricHexConfig + lateinit var CONFIG: FabricHexConfig override fun onInitialize() { this.CONFIG = FabricHexConfig.setup() @@ -142,6 +143,7 @@ object FabricHexInitializer : ModInitializer { HexIotaTypes.registerTypes(bind(IXplatAbstractions.INSTANCE.iotaTypeRegistry)) HexActions.register(bind(IXplatAbstractions.INSTANCE.actionRegistry)) HexSpecialHandlers.register(bind(IXplatAbstractions.INSTANCE.specialHandlerRegistry)) + HexArithmetics.register(bind(IXplatAbstractions.INSTANCE.arithmeticRegistry)) HexEvalSounds.register(bind(IXplatAbstractions.INSTANCE.evalSoundRegistry)) // Because of Java's lazy-loading of classes, can't use Kotlin static initialization for diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java index 535c04fe..5da5f45d 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java @@ -5,6 +5,7 @@ import at.petrak.hexcasting.api.addldata.ADHexHolder; import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.addldata.ADMediaHolder; import at.petrak.hexcasting.api.casting.ActionRegistryEntry; +import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic; import at.petrak.hexcasting.api.casting.castables.SpecialHandler; import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; import at.petrak.hexcasting.api.casting.eval.sideeffects.EvalSound; @@ -321,7 +322,7 @@ public class FabricXplatImpl implements IXplatAbstractions { return FabricUnsealedIngredient.of(stack); } - private static Supplier TAB = Suppliers.memoize(() -> FabricItemGroupBuilder.create( + private static final Supplier TAB = Suppliers.memoize(() -> FabricItemGroupBuilder.create( modLoc("creative_tab")) .icon(HexItems::tabIcon) .build()); @@ -423,6 +424,13 @@ public class FabricXplatImpl implements IXplatAbstractions { Lifecycle.stable(), null)) .buildAndRegister() ); + + private static final Supplier> ARITHMETIC_REGISTRY = Suppliers.memoize(() -> + FabricRegistryBuilder.from(new DefaultedRegistry( + HexAPI.MOD_ID + ":null", ResourceKey.createRegistryKey(modLoc("arithmetic")), + Lifecycle.stable(), null)) + .buildAndRegister() + ); private static final Supplier> EVAL_SOUNDS_REGISTRY = Suppliers.memoize(() -> FabricRegistryBuilder.from(new DefaultedRegistry( HexAPI.MOD_ID + ":nothing", ResourceKey.createRegistryKey(modLoc("eval_sound")), @@ -445,6 +453,11 @@ public class FabricXplatImpl implements IXplatAbstractions { return IOTA_TYPE_REGISTRY.get(); } + @Override + public Registry getArithmeticRegistry() { + return ARITHMETIC_REGISTRY.get(); + } + @Override public Registry getEvalSoundRegistry() { return EVAL_SOUNDS_REGISTRY.get(); diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java index c35752b5..a28a51af 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java @@ -12,10 +12,7 @@ import at.petrak.hexcasting.common.casting.operators.spells.great.OpAltiora; import at.petrak.hexcasting.common.entities.HexEntities; import at.petrak.hexcasting.common.items.ItemJewelerHammer; import at.petrak.hexcasting.common.lib.*; -import at.petrak.hexcasting.common.lib.hex.HexActions; -import at.petrak.hexcasting.common.lib.hex.HexEvalSounds; -import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; -import at.petrak.hexcasting.common.lib.hex.HexSpecialHandlers; +import at.petrak.hexcasting.common.lib.hex.*; import at.petrak.hexcasting.common.misc.AkashicTreeGrower; import at.petrak.hexcasting.common.misc.BrainsweepingEvents; import at.petrak.hexcasting.common.misc.PlayerPositionRecorder; @@ -115,6 +112,7 @@ public class ForgeHexInitializer { bind(IXplatAbstractions.INSTANCE.getIotaTypeRegistry().key(), HexIotaTypes::registerTypes); bind(IXplatAbstractions.INSTANCE.getActionRegistry().key(), HexActions::register); bind(IXplatAbstractions.INSTANCE.getSpecialHandlerRegistry().key(), HexSpecialHandlers::register); + bind(IXplatAbstractions.INSTANCE.getArithmeticRegistry().key(), HexArithmetics::register); bind(IXplatAbstractions.INSTANCE.getEvalSoundRegistry().key(), HexEvalSounds::register); ForgeHexArgumentTypeRegistry.ARGUMENT_TYPES.register(getModEventBus()); diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java index 5932752e..f3822e50 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java @@ -5,6 +5,7 @@ import at.petrak.hexcasting.api.addldata.ADHexHolder; import at.petrak.hexcasting.api.addldata.ADIotaHolder; import at.petrak.hexcasting.api.addldata.ADMediaHolder; import at.petrak.hexcasting.api.casting.ActionRegistryEntry; +import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic; import at.petrak.hexcasting.api.casting.castables.SpecialHandler; import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; import at.petrak.hexcasting.api.casting.eval.env.StaffCastEnv; @@ -472,6 +473,10 @@ public class ForgeXplatImpl implements IXplatAbstractions { ResourceKey.createRegistryKey(modLoc("iota_type")), HexAPI.MOD_ID + ":null", registry -> HexIotaTypes.NULL) ); + private static final Supplier> ARITHMETIC_REGISTRY = Suppliers.memoize(() -> + ForgeAccessorRegistry.hex$registerSimple( + ResourceKey.createRegistryKey(modLoc("arithmetic")), null) + ); private static final Supplier> EVAL_SOUND_REGISTRY = Suppliers.memoize(() -> ForgeAccessorRegistry.hex$registerDefaulted( ResourceKey.createRegistryKey(modLoc("eval_sound")), @@ -493,6 +498,11 @@ public class ForgeXplatImpl implements IXplatAbstractions { return IOTA_TYPE_REGISTRY.get(); } + @Override + public Registry getArithmeticRegistry() { + return ARITHMETIC_REGISTRY.get(); + } + @Override public Registry getEvalSoundRegistry() { return EVAL_SOUND_REGISTRY.get();