Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package cam72cam.mod.mixin.fix.large_entity_collision;

import cam72cam.mod.entity.ModdedEntity;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import net.minecraft.world.level.entity.EntityAccess;
import net.minecraft.world.level.entity.EntitySection;
import net.minecraft.world.level.entity.EntitySectionStorage;
import net.minecraft.world.phys.AABB;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.function.Consumer;


/**
* Fixes collision detection and ray tracing for entities that span multiple chunks.
* <p>
* Since Minecraft 1.17, the game only checks for entities within the chunks that the
* given bounding box intersects. This causes issues with large entities that extend beyond
* their primary chunk, as parts of them in other chunks may be ignored during collision
* detection and ray tracing operations.
* <p>
* This mixin adds a check specifically for our {@link ModdedEntity} instances
* to ensure that all relevant entity sections are considered, restoring proper functionality
* for large entities that cross chunk boundaries.
*/
@Mixin(EntitySectionStorage.class)
public class MixinEntitySectionStorage<T extends EntityAccess> {
@Shadow
@Final
private Long2ObjectMap<EntitySection<T>> sections;

@Inject(method = "forEachAccessibleSection", at = @At("TAIL"))
public void inject(AABB pBoundingBox, Consumer<EntitySection<T>> pSection, CallbackInfo ci) {
this.sections.values().stream()
.filter(e -> e.getStatus().isAccessible())
.filter(e -> e.storage.find(ModdedEntity.class)
.stream()
.anyMatch(m -> m.getBoundingBox().intersects(pBoundingBox)))
.forEach(pSection);
}
}
3 changes: 2 additions & 1 deletion src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ public net.minecraft.server.MinecraftServer f_129744_ # storageSource
public net.minecraft.server.packs.FolderPackResources m_10281_(Ljava/lang/String;)Ljava/io/File; # getFile
public net.minecraft.server.level.ChunkMap m_140416_()Ljava/lang/Iterable; # getChunks
public-f net.minecraft.world.entity.Entity m_142469_()Lnet/minecraft/world/phys/AABB; # net/minecraft/world/entity/Entity/getBoundingBox ()Lnet/minecraft/world/phys/AABB
public net.minecraft.client.multiplayer.ClientLevel f_104561_ #connection
public net.minecraft.client.multiplayer.ClientLevel f_104561_ #connection
public net.minecraft.world.level.entity.EntitySection f_156827_ # storage
19 changes: 19 additions & 0 deletions src/main/resources/mixins.universalmodcore.fix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"required": true,
"package": "cam72cam.mod.mixin.fix",
"refmap": "mixins.universalmodcore.refmap.json",
"target": "@env(DEFAULT)",
"minVersion": "0.8.2",
"compatibilityLevel": "JAVA_16",
"mixins": [
"large_entity_collision.MixinEntitySectionStorage"
],
"client": [
],
"injectors": {
"defaultRequire": 1
},
"overwrites": {
"requireAnnotations": true
}
}