Skip to content

Commit 119f9ec

Browse files
committed
Merge remote-tracking branch 'origin/1.19.2' into 1.19.4
2 parents d2d5f81 + 3a24d09 commit 119f9ec

File tree

18 files changed

+235
-110
lines changed

18 files changed

+235
-110
lines changed

common/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ dependencies {
2323
modCompileOnly("me.shedaniel:RoughlyEnoughItems-fabric:${rei_version}") {
2424
transitive = false
2525
}
26+
// compile against the JEI API but do not include it at runtime
27+
modCompileOnly("mezz.jei:jei-${minecraft_version}-common:${jei_version}")
28+
modCompileOnly("mezz.jei:jei-${minecraft_version}-gui:${jei_version}")
29+
modCompileOnly("mezz.jei:jei-${minecraft_version}-lib:${jei_version}")
2630
// Remove the next line if you don't want to depend on the API
2731
// modApi "me.shedaniel:architectury:${rootProject.architectury_version}"
2832
}

common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
1515
import org.embeddedt.modernfix.packet.EntityIDSyncPacket;
1616
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
17+
import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree;
18+
import org.embeddedt.modernfix.searchtree.REIBackedSearchTree;
19+
import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry;
1720
import org.embeddedt.modernfix.world.IntegratedWatchdog;
1821

1922
import java.lang.management.ManagementFactory;
@@ -36,6 +39,8 @@ public ModernFixClient() {
3639
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.branding.F3Screen")) {
3740
brandingString = "ModernFix " + ModernFixPlatformHooks.getVersionString();
3841
}
42+
SearchTreeProviderRegistry.register(JEIBackedSearchTree.PROVIDER);
43+
SearchTreeProviderRegistry.register(REIBackedSearchTree.PROVIDER);
3944
}
4045

4146
public void resetWorldLoadStateMachine() {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.embeddedt.modernfix.common.mixin.perf.blast_search_trees;
2+
3+
import net.minecraft.client.Minecraft;
4+
import net.minecraft.client.searchtree.SearchRegistry;
5+
import net.minecraft.world.item.CreativeModeTab;
6+
import net.minecraft.world.item.ItemStack;
7+
import org.embeddedt.modernfix.ModernFix;
8+
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
9+
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
10+
import org.embeddedt.modernfix.searchtree.DummySearchTree;
11+
import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry;
12+
import org.spongepowered.asm.mixin.Final;
13+
import org.spongepowered.asm.mixin.Mixin;
14+
import org.spongepowered.asm.mixin.Shadow;
15+
import org.spongepowered.asm.mixin.injection.At;
16+
import org.spongepowered.asm.mixin.injection.Inject;
17+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
18+
19+
import java.util.List;
20+
import java.util.Map;
21+
22+
@Mixin(Minecraft.class)
23+
@ClientOnlyMixin
24+
public abstract class MinecraftMixin {
25+
@Shadow @Final private SearchRegistry searchRegistry;
26+
27+
@Shadow public abstract <T> void populateSearchTree(SearchRegistry.Key<T> key, List<T> list);
28+
29+
@Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true)
30+
private void replaceSearchTrees(CallbackInfo ci) {
31+
SearchTreeProviderRegistry.Provider provider = SearchTreeProviderRegistry.getSearchTreeProvider();
32+
if(provider == null)
33+
return;
34+
ModernFix.LOGGER.info("Replacing search trees with '{}' provider", provider.getName());
35+
SearchRegistry.TreeBuilderSupplier<ItemStack> nameSupplier = list -> provider.getSearchTree(false);
36+
SearchRegistry.TreeBuilderSupplier<ItemStack> tagSupplier = list -> provider.getSearchTree(true);
37+
this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, nameSupplier);
38+
this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, tagSupplier);
39+
this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, list -> new DummySearchTree<>());
40+
ModernFixPlatformHooks.registerCreativeSearchTrees(this.searchRegistry, nameSupplier, tagSupplier, this::populateSearchTree);
41+
ci.cancel();
42+
}
43+
}

common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
import org.embeddedt.modernfix.blockstate.BlockStateCacheHandler;
55
import org.spongepowered.asm.mixin.Mixin;
66
import org.spongepowered.asm.mixin.injection.At;
7-
import org.spongepowered.asm.mixin.injection.Inject;
8-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
7+
import org.spongepowered.asm.mixin.injection.ModifyArg;
98

10-
@Mixin(Blocks.class)
9+
import java.util.function.Consumer;
10+
11+
@Mixin(value = Blocks.class, priority = 1100)
1112
public class BlocksMixin {
12-
@Inject(method = "rebuildCache", at = @At("HEAD"), cancellable = true)
13-
private static void rebuildParallel(CallbackInfo ci) {
14-
ci.cancel();
13+
@ModifyArg(method = "rebuildCache", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/IdMapper;forEach(Ljava/util/function/Consumer;)V"), index = 0)
14+
private static Consumer getEmptyConsumer(Consumer original) {
1515
BlockStateCacheHandler.rebuildParallel(true);
16+
return o -> {};
1617
}
1718
}

common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,8 @@ else if(isClientOnly && !ModernFixPlatformHooks.isClient())
130130
}
131131
}
132132

133-
private static final boolean shouldReplaceSearchTrees;
134133
private static final boolean isDevEnv = ModernFixPlatformHooks.isDevEnv();
135134

136-
static {
137-
shouldReplaceSearchTrees = modPresent("jei");
138-
}
139-
140135
private static final ImmutableMap<String, Boolean> DEFAULT_SETTING_OVERRIDES = ImmutableMap.<String, Boolean>builder()
141136
.put("mixin.perf.dynamic_resources", false)
142137
.put("mixin.feature.direct_stack_trace", false)
@@ -148,7 +143,6 @@ else if(isClientOnly && !ModernFixPlatformHooks.isClient())
148143
.put("mixin.perf.dynamic_entity_renderers", false)
149144
.put("mixin.feature.integrated_server_watchdog", true)
150145
.put("mixin.perf.faster_item_rendering", false)
151-
.put("mixin.perf.blast_search_trees", shouldReplaceSearchTrees)
152146
.put("mixin.devenv", isDevEnv)
153147
.put("mixin.perf.remove_spawn_chunks", isDevEnv)
154148
.build();

common/src/main/java/org/embeddedt/modernfix/platform/ModernFixPlatformHooks.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import dev.architectury.injectables.annotations.ExpectPlatform;
44
import com.mojang.brigadier.CommandDispatcher;
5+
import net.minecraft.client.searchtree.SearchRegistry;
56
import net.minecraft.commands.CommandSourceStack;
67
import net.minecraft.server.MinecraftServer;
78
import net.minecraft.server.level.ServerPlayer;
9+
import net.minecraft.world.item.ItemStack;
810
import org.objectweb.asm.tree.ClassNode;
911

1012
import java.nio.file.Path;
13+
import java.util.List;
14+
import java.util.function.BiConsumer;
1115
import java.util.function.Consumer;
1216

1317
public class ModernFixPlatformHooks {
@@ -70,4 +74,9 @@ public static void sendPacket(ServerPlayer player, Object packet) {
7074
public static void onServerCommandRegister(Consumer<CommandDispatcher<CommandSourceStack>> handler) {
7175
throw new AssertionError();
7276
}
77+
78+
@ExpectPlatform
79+
public static void registerCreativeSearchTrees(SearchRegistry registry, SearchRegistry.TreeBuilderSupplier<ItemStack> nameSupplier, SearchRegistry.TreeBuilderSupplier<ItemStack> tagSupplier, BiConsumer<SearchRegistry.Key<ItemStack>, List<ItemStack>> populator) {
80+
throw new AssertionError();
81+
}
7382
}

common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.embeddedt.modernfix.searchtree;
22

33
import net.minecraft.client.searchtree.RefreshableSearchTree;
4+
import net.minecraft.world.item.ItemStack;
45

56
import java.util.Collections;
67
import java.util.List;
@@ -22,4 +23,22 @@ public void refresh() {
2223
public List<T> search(String pSearchText) {
2324
return Collections.emptyList();
2425
}
26+
27+
static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() {
28+
29+
@Override
30+
public RefreshableSearchTree<ItemStack> getSearchTree(boolean tag) {
31+
return new DummySearchTree<>();
32+
}
33+
34+
@Override
35+
public boolean canUse() {
36+
return true;
37+
}
38+
39+
@Override
40+
public String getName() {
41+
return "Dummy";
42+
}
43+
};
2544
}
Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1-
package org.embeddedt.modernfix.forge.searchtree;
1+
package org.embeddedt.modernfix.searchtree;
22

3+
import com.google.common.collect.ImmutableList;
34
import mezz.jei.api.ingredients.ITypedIngredient;
45
import mezz.jei.gui.ingredients.IngredientFilter;
56
import mezz.jei.gui.ingredients.IngredientFilterApi;
67
import mezz.jei.library.runtime.JeiRuntime;
8+
import net.minecraft.client.searchtree.RefreshableSearchTree;
79
import net.minecraft.world.item.ItemStack;
810
import org.embeddedt.modernfix.ModernFix;
9-
import org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees.IngredientFilterInvoker;
10-
import org.embeddedt.modernfix.searchtree.DummySearchTree;
11+
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
1112

13+
import java.lang.invoke.MethodHandle;
14+
import java.lang.invoke.MethodHandles;
1215
import java.lang.reflect.Field;
16+
import java.lang.reflect.Method;
1317
import java.util.ArrayList;
1418
import java.util.Collections;
1519
import java.util.List;
@@ -23,7 +27,25 @@ public class JEIBackedSearchTree extends DummySearchTree<ItemStack> {
2327
private String lastSearchText = "";
2428
private final List<ItemStack> listCache = new ArrayList<>();
2529

26-
private static Field filterField = null;
30+
private static final Field filterField;
31+
private static final MethodHandle getIngredientListUncached;
32+
33+
static {
34+
MethodHandle m;
35+
Field f;
36+
try {
37+
Method jeiMethod = IngredientFilter.class.getDeclaredMethod("getIngredientListUncached", String.class);
38+
jeiMethod.setAccessible(true);
39+
m = MethodHandles.lookup().unreflect(jeiMethod);
40+
f = IngredientFilterApi.class.getDeclaredField("ingredientFilter");
41+
f.setAccessible(true);
42+
} catch(ReflectiveOperationException | RuntimeException | NoClassDefFoundError e) {
43+
m = null;
44+
f = null;
45+
}
46+
getIngredientListUncached = m;
47+
filterField = f;
48+
}
2749

2850
public JEIBackedSearchTree(boolean filteringByTag) {
2951
this.filteringByTag = filteringByTag;
@@ -35,10 +57,6 @@ public List<ItemStack> search(String pSearchText) {
3557
IngredientFilterApi iFilterApi = (IngredientFilterApi)runtime.get().getIngredientFilter();
3658
IngredientFilter filter;
3759
try {
38-
if(filterField == null) {
39-
filterField = IngredientFilterApi.class.getDeclaredField("ingredientFilter");
40-
filterField.setAccessible(true);
41-
}
4260
filter = (IngredientFilter)filterField.get(iFilterApi);
4361
} catch(ReflectiveOperationException e) {
4462
ModernFix.LOGGER.error(e);
@@ -54,7 +72,14 @@ public List<ItemStack> search(String pSearchText) {
5472
private List<ItemStack> searchJEI(IngredientFilter filter, String pSearchText) {
5573
if(!pSearchText.equals(lastSearchText)) {
5674
listCache.clear();
57-
List<ITypedIngredient<?>> ingredients = ((IngredientFilterInvoker)filter).invokeGetIngredientListUncached(filteringByTag ? ("$" + pSearchText) : pSearchText);
75+
List<ITypedIngredient<?>> ingredients;
76+
String finalSearchTerm = filteringByTag ? ("$" + pSearchText) : pSearchText;
77+
try {
78+
ingredients = (List<ITypedIngredient<?>>)getIngredientListUncached.invokeExact(filter, finalSearchTerm);
79+
} catch(Throwable e) {
80+
ModernFix.LOGGER.error("Error searching", e);
81+
ingredients = ImmutableList.of();
82+
}
5883
for(ITypedIngredient<?> ingredient : ingredients) {
5984
if(ingredient.getIngredient() instanceof ItemStack) {
6085
listCache.add((ItemStack)ingredient.getIngredient());
@@ -64,4 +89,21 @@ private List<ItemStack> searchJEI(IngredientFilter filter, String pSearchText) {
6489
}
6590
return listCache;
6691
}
92+
93+
public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() {
94+
@Override
95+
public RefreshableSearchTree<ItemStack> getSearchTree(boolean tag) {
96+
return new JEIBackedSearchTree(tag);
97+
}
98+
99+
@Override
100+
public boolean canUse() {
101+
return ModernFixPlatformHooks.modPresent("jei") && getIngredientListUncached != null && filterField != null;
102+
}
103+
104+
@Override
105+
public String getName() {
106+
return "JEI";
107+
}
108+
};
67109
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.embeddedt.modernfix.forge.searchtree;
1+
package org.embeddedt.modernfix.searchtree;
22

33
import mezz.jei.api.IModPlugin;
44
import mezz.jei.api.JeiPlugin;

common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import me.shedaniel.rei.api.common.entry.EntryStack;
55
import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
66
import me.shedaniel.rei.impl.client.search.AsyncSearchManager;
7+
import net.minecraft.client.searchtree.RefreshableSearchTree;
78
import net.minecraft.world.item.ItemStack;
89
import org.embeddedt.modernfix.ModernFix;
10+
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
911

1012
import java.util.ArrayList;
1113
import java.util.Collections;
@@ -53,4 +55,21 @@ private List<ItemStack> searchREI(String pSearchText) {
5355
}
5456
return listCache;
5557
}
58+
59+
public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() {
60+
@Override
61+
public RefreshableSearchTree<ItemStack> getSearchTree(boolean tag) {
62+
return new REIBackedSearchTree(tag);
63+
}
64+
65+
@Override
66+
public boolean canUse() {
67+
return ModernFixPlatformHooks.modPresent("roughlyenoughitems");
68+
}
69+
70+
@Override
71+
public String getName() {
72+
return "REI";
73+
}
74+
};
5675
}

0 commit comments

Comments
 (0)