diff --git a/common/src/main/java/me/shedaniel/architectury/hooks/EntityHooks.java b/common/src/main/java/me/shedaniel/architectury/hooks/EntityHooks.java index b28c74cd..96dcff38 100644 --- a/common/src/main/java/me/shedaniel/architectury/hooks/EntityHooks.java +++ b/common/src/main/java/me/shedaniel/architectury/hooks/EntityHooks.java @@ -21,6 +21,8 @@ package me.shedaniel.architectury.hooks; import me.shedaniel.architectury.annotations.ExpectPlatform; import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.jetbrains.annotations.Nullable; public final class EntityHooks { private EntityHooks() {} @@ -29,4 +31,10 @@ public final class EntityHooks { public static String getEncodeId(Entity entity) { throw new AssertionError(); } + + @Nullable + @ExpectPlatform + public static Entity fromCollision(CollisionContext ctx) { + throw new AssertionError(); + } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/EntityHooksImpl.java b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/EntityHooksImpl.java index dffe86af..39739848 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/EntityHooksImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/EntityHooksImpl.java @@ -20,9 +20,23 @@ package me.shedaniel.architectury.hooks.fabric; import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.jetbrains.annotations.Nullable; public class EntityHooksImpl { public static String getEncodeId(Entity entity) { return entity.getEncodeId(); } + + @Nullable + public static Entity fromCollision(CollisionContext ctx) { + return ((CollisionContextExtension) ctx).getEntity(); + } + + public interface CollisionContextExtension { + @Nullable + default Entity getEntity() { + return null; + } + } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinCollisionContext.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinCollisionContext.java new file mode 100644 index 00000000..cb79fb48 --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinCollisionContext.java @@ -0,0 +1,9 @@ +package me.shedaniel.architectury.mixin.fabric; + +import me.shedaniel.architectury.hooks.fabric.EntityHooksImpl; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(CollisionContext.class) +public interface MixinCollisionContext extends EntityHooksImpl.CollisionContextExtension { +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinEntityCollisionContext.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinEntityCollisionContext.java new file mode 100644 index 00000000..ed51c31c --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinEntityCollisionContext.java @@ -0,0 +1,32 @@ +package me.shedaniel.architectury.mixin.fabric; + +import me.shedaniel.architectury.hooks.fabric.EntityHooksImpl; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.EntityCollisionContext; +import org.jetbrains.annotations.Nullable; +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; + +@Mixin(EntityCollisionContext.class) +public abstract class MixinEntityCollisionContext implements CollisionContext, EntityHooksImpl.CollisionContextExtension { + + @Unique + private Entity entity = null; + + @Inject(method = "(Lnet/minecraft/world/entity/Entity;)V", + at = @At("RETURN")) + public void saveEntity(Entity entity, CallbackInfo ci) { + this.entity = entity; + } + + @Nullable + @Override + public Entity getEntity() { + return entity; + } + +} diff --git a/fabric/src/main/resources/architectury.mixins.json b/fabric/src/main/resources/architectury.mixins.json index 09801fd6..f7607c32 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -1,46 +1,48 @@ { - "required": true, - "package": "me.shedaniel.architectury.mixin.fabric", - "plugin": "me.shedaniel.architectury.plugin.fabric.ArchitecturyMixinPlugin", - "compatibilityLevel": "JAVA_8", - "minVersion": "0.7.11", - "client": [ - "client.MixinClientLevel", - "client.MixinClientPacketListener", - "client.MixinDebugScreenOverlay", - "client.MixinEffectInstance", - "client.MixinGameRenderer", - "client.MixinIntegratedServer", - "client.MixinKeyboardHandler", - "client.MixinMinecraft", - "client.MixinMouseHandler", - "client.MixinMultiPlayerGameMode", - "client.MixinScreen", - "client.MixinTextureAtlas" - ], - "mixins": [ - "ExplosionPreInvoker", - "LivingDeathInvoker", - "MixinBlockEntityExtension", - "MixinBlockItem", - "MixinCommands", - "MixinDedicatedServer", - "MixinExplosion", - "MixinFurnaceResultSlot", - "MixinItemEntity", - "MixinLivingEntity", - "MixinPlayer", - "MixinPlayerAdvancements", - "MixinPlayerList", - "MixinResultSlot", - "MixinServerGamePacketListenerImpl", - "MixinServerLevel", - "MixinServerPlayer", - "MixinServerPlayerGameMode", - "PlayerAttackInvoker" - ], - "injectors": { - "maxShiftBy": 5, - "defaultRequire": 1 + "required": true, + "package": "me.shedaniel.architectury.mixin.fabric", + "plugin": "me.shedaniel.architectury.plugin.fabric.ArchitecturyMixinPlugin", + "compatibilityLevel": "JAVA_8", + "minVersion": "0.7.11", + "client": [ + "client.MixinClientLevel", + "client.MixinClientPacketListener", + "client.MixinDebugScreenOverlay", + "client.MixinEffectInstance", + "client.MixinGameRenderer", + "client.MixinIntegratedServer", + "client.MixinKeyboardHandler", + "client.MixinMinecraft", + "client.MixinMouseHandler", + "client.MixinMultiPlayerGameMode", + "client.MixinScreen", + "client.MixinTextureAtlas" + ], + "mixins": [ + "ExplosionPreInvoker", + "LivingDeathInvoker", + "MixinBlockEntityExtension", + "MixinBlockItem", + "MixinCollisionContext", + "MixinCommands", + "MixinDedicatedServer", + "MixinEntityCollisionContext", + "MixinExplosion", + "MixinFurnaceResultSlot", + "MixinItemEntity", + "MixinLivingEntity", + "MixinPlayer", + "MixinPlayerAdvancements", + "MixinPlayerList", + "MixinResultSlot", + "MixinServerGamePacketListenerImpl", + "MixinServerLevel", + "MixinServerPlayer", + "MixinServerPlayerGameMode", + "PlayerAttackInvoker" + ], + "injectors": { + "maxShiftBy": 5, + "defaultRequire": 1 } } diff --git a/forge/src/main/java/me/shedaniel/architectury/hooks/forge/EntityHooksImpl.java b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/EntityHooksImpl.java index 469894a6..def8695c 100644 --- a/forge/src/main/java/me/shedaniel/architectury/hooks/forge/EntityHooksImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/EntityHooksImpl.java @@ -20,9 +20,16 @@ package me.shedaniel.architectury.hooks.forge; import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.jetbrains.annotations.Nullable; public class EntityHooksImpl { public static String getEncodeId(Entity entity) { return entity.getEncodeId(); } + + @Nullable + public static Entity fromCollision(CollisionContext ctx) { + return ctx.getEntity(); + } } diff --git a/gradle.properties b/gradle.properties index 9a08d0d1..3883f2a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ supported_version=1.16.4/5 archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=1.9 +base_version=1.10 maven_group=me.shedaniel fabric_loader_version=0.11.1 diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/registry/TestRegistries.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/registry/TestRegistries.java index 57a817d7..a0d789c6 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/registry/TestRegistries.java +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/registry/TestRegistries.java @@ -19,16 +19,24 @@ package me.shedaniel.architectury.test.registry; +import me.shedaniel.architectury.hooks.EntityHooks; import me.shedaniel.architectury.registry.BlockProperties; import me.shedaniel.architectury.registry.DeferredRegister; import me.shedaniel.architectury.registry.RegistrySupplier; import me.shedaniel.architectury.test.TestMod; import me.shedaniel.architectury.test.tab.TestCreativeTabs; +import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +import static me.shedaniel.architectury.test.TestMod.SINK; public class TestRegistries { public static final DeferredRegister ITEMS = DeferredRegister.create(TestMod.MOD_ID, Registry.ITEM_REGISTRY); @@ -39,8 +47,19 @@ public class TestRegistries { public static final RegistrySupplier TEST_BLOCK = BLOCKS.register("test_block", () -> new Block(BlockProperties.copy(Blocks.STONE))); + public static final RegistrySupplier COLLISION_BLOCK = BLOCKS.register("collision_block", () -> + new Block(BlockProperties.copy(Blocks.STONE)) { + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter bg, BlockPos pos, CollisionContext ctx) { + SINK.accept(EntityHooks.fromCollision(ctx) + " is colliding with " + state); + return super.getCollisionShape(state, bg, pos, ctx); + } + }); + public static final RegistrySupplier TEST_BLOCK_ITEM = ITEMS.register("test_block", () -> new BlockItem(TEST_BLOCK.get(), new Item.Properties().tab(TestCreativeTabs.TEST_TAB))); + public static final RegistrySupplier COLLISION_BLOCK_ITEM = ITEMS.register("collision_block", () -> + new BlockItem(COLLISION_BLOCK.get(), new Item.Properties().tab(TestCreativeTabs.TEST_TAB))); public static void initialize() { BLOCKS.register();