Browse Source

Add EntityHooks.fromCollision to retrieve an entity from block collision (#64)

Max 4 năm trước cách đây
mục cha
commit
28d986a3cc

+ 8 - 0
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();
+    }
 }

+ 14 - 0
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;
+        }
+    }
 }

+ 9 - 0
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 {
+}

+ 32 - 0
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 = "<init>(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;
+    }
+    
+}

+ 45 - 43
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
   }
 }

+ 7 - 0
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();
+    }
 }

+ 1 - 1
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

+ 19 - 0
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<Item> ITEMS = DeferredRegister.create(TestMod.MOD_ID, Registry.ITEM_REGISTRY);
@@ -39,8 +47,19 @@ public class TestRegistries {
     
     public static final RegistrySupplier<Block> TEST_BLOCK = BLOCKS.register("test_block", () ->
             new Block(BlockProperties.copy(Blocks.STONE)));
+    public static final RegistrySupplier<Block> 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<Item> TEST_BLOCK_ITEM = ITEMS.register("test_block", () ->
             new BlockItem(TEST_BLOCK.get(), new Item.Properties().tab(TestCreativeTabs.TEST_TAB)));
+    public static final RegistrySupplier<Item> 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();