From 0240509d7d79b19b1fe9e0fdc573f3f9876f422f Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Tue, 17 Feb 2026 22:28:38 +0800 Subject: [PATCH] fix: weather effects through custom entities --- .../fix/rain_snow_collision/MixinWorld.java | 45 +++++++++++++++++++ .../mixins.fix.universalmodcore.json | 1 + 2 files changed, 46 insertions(+) create mode 100644 src/main/java/cam72cam/mod/mixin/fix/rain_snow_collision/MixinWorld.java diff --git a/src/main/java/cam72cam/mod/mixin/fix/rain_snow_collision/MixinWorld.java b/src/main/java/cam72cam/mod/mixin/fix/rain_snow_collision/MixinWorld.java new file mode 100644 index 00000000..593877f0 --- /dev/null +++ b/src/main/java/cam72cam/mod/mixin/fix/rain_snow_collision/MixinWorld.java @@ -0,0 +1,45 @@ +package cam72cam.mod.mixin.fix.rain_snow_collision; + +import cam72cam.mod.entity.ModdedEntity; +import cam72cam.mod.world.ChunkPos; +import cam72cam.mod.world.WorldEntityTracker; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Set; +import java.util.stream.Collectors; + +@Mixin(World.class) +public class MixinWorld { + @Inject(method = "getPrecipitationHeight", at = @At("HEAD"), cancellable = true) + public void checkEntityCollision(BlockPos pos, CallbackInfoReturnable cir) { + World self = (World) (Object) this; + WorldEntityTracker tracker = cam72cam.mod.world.World.get(self).tracker; + Set moddedEntities = tracker.queryPotentialPackedChunkPos(ChunkPos.asLong(pos)) + .stream() + .map(tracker::queryEntities) + .flatMap(Set::stream) + .collect(Collectors.toSet()); + BlockPos target = self.getChunk(pos).getPrecipitationHeight(pos); + if (moddedEntities != null && !moddedEntities.isEmpty()) { + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(target); + for (ModdedEntity moddedEntity : moddedEntities) { + AxisAlignedBB collisionBoundingBox = moddedEntity.getCollisionBoundingBox(); + if (collisionBoundingBox == null) continue; + + if (mutable.getY() < collisionBoundingBox.minY) { + mutable.setY((int) collisionBoundingBox.minY); + } + while (collisionBoundingBox.intersects(new AxisAlignedBB(mutable))) { + mutable.setY(mutable.getY() + 1); + } + } + cir.setReturnValue(mutable.toImmutable()); + } + } +} diff --git a/src/main/resources/mixins.fix.universalmodcore.json b/src/main/resources/mixins.fix.universalmodcore.json index 36a5e3a0..96e0a12d 100644 --- a/src/main/resources/mixins.fix.universalmodcore.json +++ b/src/main/resources/mixins.fix.universalmodcore.json @@ -7,6 +7,7 @@ "compatibilityLevel": "JAVA_8", "mixinPriority": 1301, "mixins": [ + "rain_snow_collision.MixinWorld" ], "client": [ ]