From 22f751e37b4ab3dda923354488a9c8c44944e7c6 Mon Sep 17 00:00:00 2001 From: YukkuriC <799433638@qq.com> Date: Thu, 2 Apr 2026 21:04:55 +0800 Subject: [PATCH 1/2] loop example entity each second for more JEI info --- .../ingredient/brainsweep/EntityTagIngredient.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java index cb6b0a0912..5f5a08aa86 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java @@ -70,9 +70,12 @@ public List getTooltip(boolean advanced) { @Override public Entity exampleEntity(Level level) { - var someEntityTys = BuiltInRegistries.ENTITY_TYPE.getTagOrEmpty(this.entityTypeTag).iterator(); - if (someEntityTys.hasNext()) { - var someTy = someEntityTys.next(); + var someEntityTysHolder = BuiltInRegistries.ENTITY_TYPE.getTag(this.entityTypeTag); + if (someEntityTysHolder.isEmpty()) return null; + var someEntityTys = someEntityTysHolder.get(); + if (someEntityTys.size() > 0) { + long seconds = System.currentTimeMillis(); + var someTy = someEntityTys.get((int) (seconds % someEntityTys.size())); return someTy.value().create(level); } else { return null; From 670a426810f1975225e17269dca2eb655594e316 Mon Sep 17 00:00:00 2001 From: YukkuriC <799433638@qq.com> Date: Thu, 2 Apr 2026 22:33:42 +0800 Subject: [PATCH 2/2] add by-type cache layer to prevent JEI entity vibrating each frame --- .../brainsweep/BrainsweepeeIngredient.java | 13 +++++++++++-- .../ingredient/brainsweep/EntityTagIngredient.java | 2 +- .../ingredient/brainsweep/EntityTypeIngredient.java | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/BrainsweepeeIngredient.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/BrainsweepeeIngredient.java index 6e777cc2d0..8cb1331414 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/BrainsweepeeIngredient.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/BrainsweepeeIngredient.java @@ -9,11 +9,11 @@ import net.minecraft.util.GsonHelper; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.Locale; +import java.util.*; // Partially based on: // https://github.com/SlimeKnights/Mantle/blob/1.18.2/src/main/java/slimeknights/mantle/recipe/ingredient/EntityIngredient.java @@ -83,4 +83,13 @@ public static Component getModNameComponent(String namespace) { String mod = IXplatAbstractions.INSTANCE.getModName(namespace); return Component.literal(mod).withStyle(ChatFormatting.BLUE, ChatFormatting.ITALIC); } + + private static Map, Entity> cachedExampleEntity = new HashMap<>(); + protected static Entity getCachedExampleEntity(EntityType type, Level level) { + // don't cache for server levels (if any) to prevent wrong side + if (!level.isClientSide) { + return type.create(level); + } + return cachedExampleEntity.computeIfAbsent(type, t -> t.create(level)); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java index 5f5a08aa86..2535cebd9e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTagIngredient.java @@ -76,7 +76,7 @@ public Entity exampleEntity(Level level) { if (someEntityTys.size() > 0) { long seconds = System.currentTimeMillis(); var someTy = someEntityTys.get((int) (seconds % someEntityTys.size())); - return someTy.value().create(level); + return getCachedExampleEntity(someTy.value(), level); } else { return null; } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTypeIngredient.java b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTypeIngredient.java index f510c17d2e..91d86b40fb 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTypeIngredient.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/recipe/ingredient/brainsweep/EntityTypeIngredient.java @@ -43,7 +43,7 @@ public List getTooltip(boolean advanced) { @Override public Entity exampleEntity(Level level) { - return this.entityType.create(level); + return getCachedExampleEntity(this.entityType, level); } @Override