Compare commits
176 Commits
1.20
...
eol/1.20.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8f9b1cd84 | ||
|
|
c6338f9736 | ||
|
|
b1c0b0f813 | ||
|
|
c5dd43f2a1 | ||
|
|
9bf4faa4a5 | ||
|
|
3bedde4ebe | ||
|
|
73f706164f | ||
|
|
50556ab005 | ||
|
|
ad07fb3f0c | ||
|
|
4b741da54d | ||
|
|
042a7caa9e | ||
|
|
95cd576c68 | ||
|
|
8fc9c0b3c1 | ||
|
|
95a8e4fe21 | ||
|
|
add7dd4609 | ||
|
|
827550e8af | ||
|
|
9d7ef772a0 | ||
|
|
5e20e25c4d | ||
|
|
61c2116946 | ||
|
|
72845d8952 | ||
|
|
70eaabe756 | ||
|
|
e22f5caec7 | ||
|
|
0a2299ee33 | ||
|
|
a62c0635a5 | ||
|
|
fdc98b2600 | ||
|
|
8806dffaea | ||
|
|
761703b4ab | ||
|
|
967d39997f | ||
|
|
48b492b906 | ||
|
|
96db279d58 | ||
|
|
8d2d3d8e15 | ||
|
|
b82942fe75 | ||
|
|
e6ca5f633c | ||
|
|
d52725012a | ||
|
|
3f7af1c2e0 | ||
|
|
c8485eaef8 | ||
|
|
4dfba0cab4 | ||
|
|
2699fe448e | ||
|
|
16ef9253e6 | ||
|
|
f25ecf337d | ||
|
|
c4855e0b70 | ||
|
|
daa84565a6 | ||
|
|
d3758eb4f6 | ||
|
|
649c25d0d2 | ||
|
|
a4bb17d2af | ||
|
|
806fb7dcfe | ||
|
|
b5becf6ba3 | ||
|
|
c65fdbccc0 | ||
|
|
dcee8b4169 | ||
|
|
d6fc939f41 | ||
|
|
a012b60ae3 | ||
|
|
97a2c0e0f5 | ||
|
|
34bc295b3c | ||
|
|
456bca47b6 | ||
|
|
d4fcc80db0 | ||
|
|
432b137edb | ||
|
|
1bf98ced86 | ||
|
|
7be97e61e8 | ||
|
|
b23502c32b | ||
|
|
d03571cb05 | ||
|
|
324fb3af97 | ||
|
|
fa9d39bd31 | ||
|
|
501db5b84a | ||
|
|
9dcc87b227 | ||
|
|
0eb70468a1 | ||
|
|
ba2b740075 | ||
|
|
063289faac | ||
|
|
d3ed56a1c1 | ||
|
|
45a7f1a63e | ||
|
|
04aac43db0 | ||
|
|
0ea5139315 | ||
|
|
06bb9f9545 | ||
|
|
adf169c3fa | ||
|
|
8d5e66218e | ||
|
|
45b734dead | ||
|
|
2ec1000ae8 | ||
|
|
1f66c7becd | ||
|
|
ccc21d76d8 | ||
|
|
4fec9f53c3 | ||
|
|
b8cd5adbb1 | ||
|
|
bf69e58169 | ||
|
|
6592ac5cac | ||
|
|
1f447b689f | ||
|
|
8df6fab0e7 | ||
|
|
328507cea3 | ||
|
|
c6b38f340a | ||
|
|
69a9aa76da | ||
|
|
87ee1017ae | ||
|
|
fcf21283d8 | ||
|
|
bfdd1f913d | ||
|
|
3187c80d48 | ||
|
|
f594ec6c5b | ||
|
|
efa46c3842 | ||
|
|
473597a915 | ||
|
|
84061b197f | ||
|
|
dc86d3e137 | ||
|
|
4d111cb381 | ||
|
|
29d1f88539 | ||
|
|
0ff032bd1a | ||
|
|
e34e9fcf8b | ||
|
|
9861926f1d | ||
|
|
acb6809459 | ||
|
|
fd975388ca | ||
|
|
13ee6b3523 | ||
|
|
af8e23f41a | ||
|
|
19ba30280c | ||
|
|
33609d234c | ||
|
|
6e3134161a | ||
|
|
27142d2c42 | ||
|
|
c672948d8c | ||
|
|
0a418bc55d | ||
|
|
d8263c55f8 | ||
|
|
a212a3fc7e | ||
|
|
7af609b56f | ||
|
|
45c11ea7e0 | ||
|
|
894173cf1d | ||
|
|
fc52570951 | ||
|
|
207521f778 | ||
|
|
9efe912090 | ||
|
|
15d16ffa9a | ||
|
|
95f2dc95d3 | ||
|
|
86c6e90436 | ||
|
|
915de8187e | ||
|
|
181be3cf80 | ||
|
|
79751dac21 | ||
|
|
184dec0739 | ||
|
|
1339fc7af6 | ||
|
|
624a4483eb | ||
|
|
3b7d2f1e2e | ||
|
|
91a084f860 | ||
|
|
546a362d9c | ||
|
|
87b984bfe9 | ||
|
|
7a2b71381c | ||
|
|
850fdcbf1b | ||
|
|
3add97202e | ||
|
|
5d481334a8 | ||
|
|
6d096e8ae0 | ||
|
|
c09b530a8c | ||
|
|
fbacc85f86 | ||
|
|
0e9142e68f | ||
|
|
f6f7badde8 | ||
|
|
2c5b664c68 | ||
|
|
2a099d8537 | ||
|
|
472ed42f22 | ||
|
|
9830d4d6f7 | ||
|
|
348a2bcf3d | ||
|
|
43da9ffcdc | ||
|
|
7f80f38862 | ||
|
|
231c3f41e5 | ||
|
|
cc54b6d67d | ||
|
|
e8fa483917 | ||
|
|
dc3cb998b0 | ||
|
|
972121fa50 | ||
|
|
93554d1854 | ||
|
|
a00efe62c7 | ||
|
|
1267a25db1 | ||
|
|
0149a113a8 | ||
|
|
97d4f6bbc2 | ||
|
|
dfb0c52fa3 | ||
|
|
02fa2be42b | ||
|
|
45c29216a8 | ||
|
|
5e8e7649e5 | ||
|
|
0a2cda0814 | ||
|
|
5952fa2178 | ||
|
|
9bf0017aeb | ||
|
|
cb286c0bca | ||
|
|
b56a65c192 | ||
|
|
8d1058cc3f | ||
|
|
eb15718023 | ||
|
|
861474d635 | ||
|
|
f3bda91ebf | ||
|
|
84c72f8da8 | ||
|
|
3716912a53 | ||
|
|
42688757a7 | ||
|
|
23b473f85d | ||
|
|
7fcaf716d8 |
|
|
@ -166,6 +166,7 @@ public class ClientMixinValidator {
|
||||||
|
|
||||||
clzsses = wrappedClzss.stream()
|
clzsses = wrappedClzss.stream()
|
||||||
.map(AnnotationValue::getValue)
|
.map(AnnotationValue::getValue)
|
||||||
|
.filter(o -> o instanceof TypeMirror)
|
||||||
.map(TypeMirror.class::cast)
|
.map(TypeMirror.class::cast)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ curseforge {
|
||||||
changelog = file("${rootDir}/CHANGELOG.md")
|
changelog = file("${rootDir}/CHANGELOG.md")
|
||||||
changelogType = "markdown"
|
changelogType = "markdown"
|
||||||
releaseType = isBeta ? "beta" : "release"
|
releaseType = isBeta ? "beta" : "release"
|
||||||
addGameVersion project.name.capitalize()
|
addGameVersion (project.name.equals("neoforge") ? "NeoForge" : project.name.capitalize())
|
||||||
gameVersionStrings.addAll(supported_minecraft_versions.tokenize(","))
|
gameVersionStrings.addAll(supported_minecraft_versions.tokenize(","))
|
||||||
mainArtifact remapJar
|
mainArtifact remapJar
|
||||||
}
|
}
|
||||||
|
|
@ -66,4 +66,4 @@ tasks.modrinth.dependsOn(rootProject.generateChangelog)
|
||||||
tasks.register('publishToModSites') {
|
tasks.register('publishToModSites') {
|
||||||
publishToModSites.dependsOn(tasks.modrinth)
|
publishToModSites.dependsOn(tasks.modrinth)
|
||||||
publishToModSites.dependsOn(tasks.curseforge)
|
publishToModSites.dependsOn(tasks.curseforge)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ architectury {
|
||||||
common(rootProject.enabled_platforms.split(","))
|
common(rootProject.enabled_platforms.split(","))
|
||||||
}
|
}
|
||||||
|
|
||||||
ext.jei_minecraft_version = "1.19.4" /* temporary, till 1.20 releases */
|
ext.jei_minecraft_version = "1.20.2" /* temporary, till 1.20 releases */
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
// We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies
|
// We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies
|
||||||
|
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
package org.embeddedt.modernfix.common.mixin.bugfix.buffer_builder_leak;
|
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
|
||||||
import org.embeddedt.modernfix.render.UnsafeBufferHelper;
|
|
||||||
import org.spongepowered.asm.mixin.Dynamic;
|
|
||||||
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.nio.ByteBuffer;
|
|
||||||
|
|
||||||
@Mixin(value = BufferBuilder.class, priority = 1500)
|
|
||||||
@ClientOnlyMixin
|
|
||||||
public class BufferBuilderMixin {
|
|
||||||
@Shadow private ByteBuffer buffer;
|
|
||||||
|
|
||||||
private static boolean leakReported = false;
|
|
||||||
|
|
||||||
private boolean mfix$shouldFree = true;
|
|
||||||
|
|
||||||
@Dynamic
|
|
||||||
@Inject(method = "flywheel$injectForRender", at = @At("RETURN"), remap = false, require = 0)
|
|
||||||
private void preventFree(CallbackInfo ci) {
|
|
||||||
mfix$shouldFree = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensure UnsafeBufferHelper is classloaded early, to avoid Forge's event transformer showing an error in the log.
|
|
||||||
*/
|
|
||||||
@Inject(method = "<clinit>", at = @At(value = "RETURN"))
|
|
||||||
private static void initUnsafeBufferHelper(CallbackInfo ci) {
|
|
||||||
UnsafeBufferHelper.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void finalize() throws Throwable {
|
|
||||||
try {
|
|
||||||
ByteBuffer buf = buffer;
|
|
||||||
// can be null if a mod already tried to free the buffer
|
|
||||||
if(buf != null && mfix$shouldFree) {
|
|
||||||
if(!leakReported) {
|
|
||||||
leakReported = true;
|
|
||||||
ModernFix.LOGGER.warn("One or more BufferBuilders have been leaked, ModernFix will attempt to correct this.");
|
|
||||||
}
|
|
||||||
UnsafeBufferHelper.free(buf);
|
|
||||||
buffer = null;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
super.finalize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -24,7 +24,7 @@ public class MinecraftMixin {
|
||||||
/**
|
/**
|
||||||
* To mitigate the effect of leaked client worlds, clear most of the data structures that waste memory.
|
* To mitigate the effect of leaked client worlds, clear most of the data structures that waste memory.
|
||||||
*/
|
*/
|
||||||
@Inject(method = "clearLevel(Lnet/minecraft/client/gui/screens/Screen;)V", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/Minecraft;level:Lnet/minecraft/client/multiplayer/ClientLevel;"))
|
@Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;)V", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/Minecraft;level:Lnet/minecraft/client/multiplayer/ClientLevel;"))
|
||||||
private void clearLevelDataForLeaks(CallbackInfo ci) {
|
private void clearLevelDataForLeaks(CallbackInfo ci) {
|
||||||
if(this.level != null) {
|
if(this.level != null) {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
public class CrashReportMixin {
|
public class CrashReportMixin {
|
||||||
@Shadow @Final private Throwable exception;
|
@Shadow @Final private Throwable exception;
|
||||||
|
|
||||||
@Inject(method = "addCategory(Ljava/lang/String;I)Lnet/minecraft/CrashReportCategory;", at = @At(value = "INVOKE", target = "Ljava/io/PrintStream;println(Ljava/lang/String;)V"))
|
@Inject(method = "addCategory(Ljava/lang/String;I)Lnet/minecraft/CrashReportCategory;", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
|
||||||
private void dumpStacktrace(String s, int i, CallbackInfoReturnable<CrashReportCategory> cir) {
|
private void dumpStacktrace(String s, int i, CallbackInfoReturnable<CrashReportCategory> cir) {
|
||||||
new Exception("ModernFix crash stacktrace").printStackTrace();
|
new Exception("ModernFix crash stacktrace").printStackTrace();
|
||||||
if(this.exception != null)
|
if(this.exception != null)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package org.embeddedt.modernfix.common.mixin.perf.cache_profile_texture_url;
|
||||||
import com.google.common.cache.Cache;
|
import com.google.common.cache.Cache;
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
|
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
|
||||||
import net.minecraft.client.resources.SkinManager;
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
|
@ -13,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Mixin(SkinManager.class)
|
@Mixin(targets = {"net/minecraft/client/resources/SkinManager$TextureCache" })
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public class SkinManagerMixin {
|
public class SkinManagerMixin {
|
||||||
@Unique
|
@Unique
|
||||||
|
|
@ -22,7 +21,7 @@ public class SkinManagerMixin {
|
||||||
.concurrencyLevel(1)
|
.concurrencyLevel(1)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@Redirect(method = "registerTexture(Lcom/mojang/authlib/minecraft/MinecraftProfileTexture;Lcom/mojang/authlib/minecraft/MinecraftProfileTexture$Type;Lnet/minecraft/client/resources/SkinManager$SkinTextureCallback;)Lnet/minecraft/resources/ResourceLocation;",
|
@Redirect(method = { "getOrLoad", "registerTexture" },
|
||||||
at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftProfileTexture;getHash()Ljava/lang/String;", remap = false))
|
at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftProfileTexture;getHash()Ljava/lang/String;", remap = false))
|
||||||
private String useCachedHash(MinecraftProfileTexture texture) {
|
private String useCachedHash(MinecraftProfileTexture texture) {
|
||||||
// avoid lambda allocation for common case
|
// avoid lambda allocation for common case
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,8 @@ public abstract class ServerLevelMixin extends Level implements IServerLevel {
|
||||||
*/
|
*/
|
||||||
@Inject(method = "<init>", at = @At("TAIL"))
|
@Inject(method = "<init>", at = @At("TAIL"))
|
||||||
private void ensureGeneration(CallbackInfo ci) {
|
private void ensureGeneration(CallbackInfo ci) {
|
||||||
mfix$strongholdCache = this.getDataStorage().computeIfAbsent(StrongholdLocationCache::load,
|
mfix$strongholdCache = this.getDataStorage().computeIfAbsent(
|
||||||
StrongholdLocationCache::new,
|
StrongholdLocationCache.factory((ServerLevel)(Object)this),
|
||||||
StrongholdLocationCache.getFileId(this.dimensionTypeRegistration()));
|
StrongholdLocationCache.getFileId(this.dimensionTypeRegistration()));
|
||||||
this.chunkSource.getGeneratorState().ensureStructuresGenerated();
|
this.chunkSource.getGeneratorState().ensureStructuresGenerated();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import java.util.concurrent.ExecutorService;
|
||||||
@Mixin(Minecraft.class)
|
@Mixin(Minecraft.class)
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public class MinecraftMixin {
|
public class MinecraftMixin {
|
||||||
@Redirect(method = { "<init>", "reloadResourcePacks(Z)Ljava/util/concurrent/CompletableFuture;" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Ljava/util/concurrent/ExecutorService;", ordinal = 0))
|
@Redirect(method = { "<init>", "reloadResourcePacks(ZLnet/minecraft/client/Minecraft$GameLoadCookie;)Ljava/util/concurrent/CompletableFuture;" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Ljava/util/concurrent/ExecutorService;", ordinal = 0))
|
||||||
private ExecutorService getResourceReloadExecutor() {
|
private ExecutorService getResourceReloadExecutor() {
|
||||||
return ModernFix.resourceReloadExecutor();
|
return ModernFix.resourceReloadExecutor();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,8 @@ public class MappedRegistryMixin {
|
||||||
*/
|
*/
|
||||||
@Redirect(
|
@Redirect(
|
||||||
method = "registerMapping(ILnet/minecraft/resources/ResourceKey;Ljava/lang/Object;Lcom/mojang/serialization/Lifecycle;)Lnet/minecraft/core/Holder$Reference;",
|
method = "registerMapping(ILnet/minecraft/resources/ResourceKey;Ljava/lang/Object;Lcom/mojang/serialization/Lifecycle;)Lnet/minecraft/core/Holder$Reference;",
|
||||||
at = @At(value = "INVOKE", target = "Lit/unimi/dsi/fastutil/objects/ObjectList;size(I)V", remap = false)
|
at = @At(value = "INVOKE", target = "Lit/unimi/dsi/fastutil/objects/ObjectList;size(I)V", remap = false),
|
||||||
|
require = 0
|
||||||
)
|
)
|
||||||
private void setSizeSmart(ObjectList<?> list, int size) {
|
private void setSizeSmart(ObjectList<?> list, int size) {
|
||||||
if(list instanceof ObjectArrayList && size > list.size()) {
|
if(list instanceof ObjectArrayList && size > list.size()) {
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ import java.util.Map;
|
||||||
|
|
||||||
@Mixin(targets = "net/minecraft/nbt/CompoundTag$1")
|
@Mixin(targets = "net/minecraft/nbt/CompoundTag$1")
|
||||||
public class CompoundTag1Mixin {
|
public class CompoundTag1Mixin {
|
||||||
@ModifyVariable(method = "load(Ljava/io/DataInput;ILnet/minecraft/nbt/NbtAccounter;)Lnet/minecraft/nbt/CompoundTag;", at = @At(value = "INVOKE_ASSIGN", target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;", remap = false))
|
@ModifyVariable(method = "loadCompound", at = @At(value = "INVOKE_ASSIGN", target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;", remap = false))
|
||||||
private Map<String, Tag> modifyMap(Map<String, Tag> map) {
|
private static Map<String, Tag> modifyMap(Map<String, Tag> map) {
|
||||||
CanonizingStringMap<Tag> newMap = new CanonizingStringMap<>();
|
CanonizingStringMap<Tag> newMap = new CanonizingStringMap<>();
|
||||||
if(map != null)
|
if(map != null)
|
||||||
newMap.putAll(map);
|
newMap.putAll(map);
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ public class ModernFixEarlyConfig {
|
||||||
private static final String MIXIN_REQUIRES_MOD_DESC = Type.getDescriptor(RequiresMod.class);
|
private static final String MIXIN_REQUIRES_MOD_DESC = Type.getDescriptor(RequiresMod.class);
|
||||||
private static final String MIXIN_DEV_ONLY_DESC = Type.getDescriptor(IgnoreOutsideDev.class);
|
private static final String MIXIN_DEV_ONLY_DESC = Type.getDescriptor(IgnoreOutsideDev.class);
|
||||||
|
|
||||||
private static final Pattern PLATFORM_PREFIX = Pattern.compile("(forge|fabric|common)\\.");
|
private static final Pattern PLATFORM_PREFIX = Pattern.compile("(neoforge|fabric|common)\\.");
|
||||||
|
|
||||||
public static String sanitize(String mixinClassName) {
|
public static String sanitize(String mixinClassName) {
|
||||||
return PLATFORM_PREFIX.matcher(mixinClassName).replaceFirst("");
|
return PLATFORM_PREFIX.matcher(mixinClassName).replaceFirst("");
|
||||||
|
|
@ -79,7 +79,7 @@ public class ModernFixEarlyConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scanForAndBuildMixinOptions() {
|
private void scanForAndBuildMixinOptions() {
|
||||||
List<String> configFiles = ImmutableList.of("modernfix-common.mixins.json", "modernfix-fabric.mixins.json", "modernfix-forge.mixins.json");
|
List<String> configFiles = ImmutableList.of("modernfix-common.mixins.json", "modernfix-fabric.mixins.json", "modernfix-neoforge.mixins.json");
|
||||||
List<String> mixinPaths = new ArrayList<>();
|
List<String> mixinPaths = new ArrayList<>();
|
||||||
for(String configFile : configFiles) {
|
for(String configFile : configFiles) {
|
||||||
InputStream stream = ModernFixEarlyConfig.class.getClassLoader().getResourceAsStream(configFile);
|
InputStream stream = ModernFixEarlyConfig.class.getClassLoader().getResourceAsStream(configFile);
|
||||||
|
|
@ -180,7 +180,6 @@ public class ModernFixEarlyConfig {
|
||||||
.put("mixin.devenv", isDevEnv)
|
.put("mixin.devenv", isDevEnv)
|
||||||
.put("mixin.perf.remove_spawn_chunks", isDevEnv)
|
.put("mixin.perf.remove_spawn_chunks", isDevEnv)
|
||||||
.putConditionally(() -> !isFabric, "mixin.bugfix.fix_config_crashes", true)
|
.putConditionally(() -> !isFabric, "mixin.bugfix.fix_config_crashes", true)
|
||||||
.putConditionally(() -> !isFabric, "mixin.bugfix.forge_at_inject_error", true)
|
|
||||||
.putConditionally(() -> !isFabric, "mixin.feature.registry_event_progress", false)
|
.putConditionally(() -> !isFabric, "mixin.feature.registry_event_progress", false)
|
||||||
.putConditionally(() -> isFabric, "mixin.perf.clear_fabric_mapping_tables", false)
|
.putConditionally(() -> isFabric, "mixin.perf.clear_fabric_mapping_tables", false)
|
||||||
.build();
|
.build();
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,9 @@ package org.embeddedt.modernfix.packet;
|
||||||
|
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
|
|
||||||
|
|
@ -10,7 +12,8 @@ import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class EntityIDSyncPacket {
|
public class EntityIDSyncPacket implements CustomPacketPayload {
|
||||||
|
public static final ResourceLocation ID = new ResourceLocation(ModernFix.MODID, "entity_id_sync");
|
||||||
private Map<Class<? extends Entity>, List<Pair<String, Integer>>> map;
|
private Map<Class<? extends Entity>, List<Pair<String, Integer>>> map;
|
||||||
|
|
||||||
public EntityIDSyncPacket(Map<Class<? extends Entity>, List<Pair<String, Integer>>> map) {
|
public EntityIDSyncPacket(Map<Class<? extends Entity>, List<Pair<String, Integer>>> map) {
|
||||||
|
|
@ -21,11 +24,8 @@ public class EntityIDSyncPacket {
|
||||||
return this.map;
|
return this.map;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityIDSyncPacket() {
|
@Override
|
||||||
this.map = new HashMap<>();
|
public void write(FriendlyByteBuf buf) {
|
||||||
}
|
|
||||||
|
|
||||||
public void serialize(FriendlyByteBuf buf) {
|
|
||||||
buf.writeVarInt(map.keySet().size());
|
buf.writeVarInt(map.keySet().size());
|
||||||
for(Map.Entry<Class<? extends Entity>, List<Pair<String, Integer>>> entry : map.entrySet()) {
|
for(Map.Entry<Class<? extends Entity>, List<Pair<String, Integer>>> entry : map.entrySet()) {
|
||||||
buf.writeUtf(entry.getKey().getName());
|
buf.writeUtf(entry.getKey().getName());
|
||||||
|
|
@ -38,8 +38,9 @@ public class EntityIDSyncPacket {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static EntityIDSyncPacket deserialize(FriendlyByteBuf buf) {
|
public EntityIDSyncPacket(FriendlyByteBuf buf) {
|
||||||
EntityIDSyncPacket self = new EntityIDSyncPacket();
|
this.map = new HashMap<>();
|
||||||
|
EntityIDSyncPacket self = this;
|
||||||
int numEntityClasses = buf.readVarInt();
|
int numEntityClasses = buf.readVarInt();
|
||||||
for(int i = 0; i < numEntityClasses; i++) {
|
for(int i = 0; i < numEntityClasses; i++) {
|
||||||
String clzName = buf.readUtf();
|
String clzName = buf.readUtf();
|
||||||
|
|
@ -73,6 +74,10 @@ public class EntityIDSyncPacket {
|
||||||
ModernFix.LOGGER.error("Error deserializing packet", e);
|
ModernFix.LOGGER.error("Error deserializing packet", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self;
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResourceLocation id() {
|
||||||
|
return ID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.google.common.collect.Multimap;
|
||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import net.minecraft.client.searchtree.SearchRegistry;
|
import net.minecraft.client.searchtree.SearchRegistry;
|
||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
|
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
|
@ -39,7 +40,7 @@ public interface ModernFixPlatformHooks {
|
||||||
|
|
||||||
Path getGameDirectory();
|
Path getGameDirectory();
|
||||||
|
|
||||||
void sendPacket(ServerPlayer player, Object packet);
|
void sendPacket(ServerPlayer player, CustomPacketPayload packet);
|
||||||
|
|
||||||
Multimap<String, String> getCustomModOptions();
|
Multimap<String, String> getCustomModOptions();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
class PlatformHookLoader {
|
class PlatformHookLoader {
|
||||||
static ModernFixPlatformHooks findInstance() {
|
static ModernFixPlatformHooks findInstance() {
|
||||||
String[] locations = new String[] { "forge", "fabric" };
|
String[] locations = new String[] { "neoforge", "fabric" };
|
||||||
for(String location : locations) {
|
for(String location : locations) {
|
||||||
try {
|
try {
|
||||||
Class<?> clz = Class.forName("org.embeddedt.modernfix.platform." + location + ".ModernFixPlatformHooksImpl");
|
Class<?> clz = Class.forName("org.embeddedt.modernfix.platform." + location + ".ModernFixPlatformHooksImpl");
|
||||||
|
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
package org.embeddedt.modernfix.render;
|
|
||||||
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
import org.lwjgl.system.MemoryUtil;
|
|
||||||
import sun.misc.Unsafe;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper that frees ByteBuffers allocated by BufferBuilders, and nulls out the address pointer
|
|
||||||
* to prevent double frees.
|
|
||||||
*
|
|
||||||
* @author Moulberry
|
|
||||||
*/
|
|
||||||
public class UnsafeBufferHelper {
|
|
||||||
private static final MemoryUtil.MemoryAllocator ALLOCATOR = MemoryUtil.getAllocator(false);
|
|
||||||
|
|
||||||
private static sun.misc.Unsafe UNSAFE = null;
|
|
||||||
private static long ADDRESS = -1;
|
|
||||||
|
|
||||||
static {
|
|
||||||
try {
|
|
||||||
final Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
|
||||||
theUnsafe.setAccessible(true);
|
|
||||||
UNSAFE = (Unsafe)theUnsafe.get(null);
|
|
||||||
|
|
||||||
final Field addressField = MemoryUtil.class.getDeclaredField("ADDRESS");
|
|
||||||
addressField.setAccessible(true);
|
|
||||||
ADDRESS = addressField.getLong(null);
|
|
||||||
} catch(Throwable t) {
|
|
||||||
ModernFix.LOGGER.error("Could load unsafe/buffer address", t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void init() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void free(ByteBuffer buf) {
|
|
||||||
if(UNSAFE != null && ADDRESS >= 0) {
|
|
||||||
// set the address to 0 to prevent double free
|
|
||||||
long address = UNSAFE.getAndSetLong(buf, ADDRESS, 0);
|
|
||||||
if(address != 0) {
|
|
||||||
ALLOCATOR.free(address);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ALLOCATOR.free(MemoryUtil.memAddress0(buf));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -42,11 +42,10 @@ public class ModernFixConfigScreen extends Screen {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
|
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
|
||||||
this.renderBackground(guiGraphics);
|
super.render(guiGraphics, mouseX, mouseY, partialTicks);
|
||||||
this.optionList.render(guiGraphics, mouseX, mouseY, partialTicks);
|
this.optionList.render(guiGraphics, mouseX, mouseY, partialTicks);
|
||||||
guiGraphics.drawCenteredString(this.font, this.title, this.width / 2, 8, 16777215);
|
guiGraphics.drawCenteredString(this.font, this.title, this.width / 2, 8, 16777215);
|
||||||
this.doneButton.setMessage(madeChanges ? Component.translatable("modernfix.config.done_restart") : CommonComponents.GUI_DONE);
|
this.doneButton.setMessage(madeChanges ? Component.translatable("modernfix.config.done_restart") : CommonComponents.GUI_DONE);
|
||||||
super.render(guiGraphics, mouseX, mouseY, partialTicks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastScrollAmount(double d) {
|
public void setLastScrollAmount(double d) {
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ public class ModernFixOptionInfoScreen extends Screen {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
|
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
|
||||||
this.renderBackground(guiGraphics);
|
this.renderBackground(guiGraphics, mouseX, mouseY, partialTicks);
|
||||||
guiGraphics.drawCenteredString(this.font, this.title, this.width / 2, 8, 16777215);
|
guiGraphics.drawCenteredString(this.font, this.title, this.width / 2, 8, 16777215);
|
||||||
this.drawMultilineString(guiGraphics, this.minecraft.font, description, 10, 50);
|
this.drawMultilineString(guiGraphics, this.minecraft.font, description, 10, 50);
|
||||||
super.render(guiGraphics, mouseX, mouseY, partialTicks);
|
super.render(guiGraphics, mouseX, mouseY, partialTicks);
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ public class OptionList extends ContainerObjectSelectionList<OptionList.Entry> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public OptionList(ModernFixConfigScreen arg, Minecraft arg2) {
|
public OptionList(ModernFixConfigScreen arg, Minecraft arg2) {
|
||||||
super(arg2,arg.width + 45, arg.height, 43, arg.height - 32, 20);
|
super(arg2,arg.width + 45, arg.height - 52, 20, 20);
|
||||||
|
|
||||||
this.mainScreen = arg;
|
this.mainScreen = arg;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ public class RecipeBookSearchTree extends DummySearchTree<RecipeCollection> {
|
||||||
collections = new Object2ObjectOpenHashMap<>();
|
collections = new Object2ObjectOpenHashMap<>();
|
||||||
Map<Item, List<RecipeCollection>> finalCollection = collections;
|
Map<Item, List<RecipeCollection>> finalCollection = collections;
|
||||||
for(RecipeCollection collection : allCollections) {
|
for(RecipeCollection collection : allCollections) {
|
||||||
collection.getRecipes().stream().map(recipe -> recipe.getResultItem(collection.registryAccess()).getItem()).distinct().forEach(item -> {
|
collection.getRecipes().stream().map(recipe -> recipe.value().getResultItem(collection.registryAccess()).getItem()).distinct().forEach(item -> {
|
||||||
finalCollection.computeIfAbsent(item, k -> new ArrayList<>()).add(collection);
|
finalCollection.computeIfAbsent(item, k -> new ArrayList<>()).add(collection);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
|
||||||
import net.minecraft.SharedConstants;
|
import net.minecraft.SharedConstants;
|
||||||
import net.minecraft.core.HolderGetter;
|
import net.minecraft.core.HolderGetter;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.NbtAccounter;
|
||||||
import net.minecraft.nbt.NbtIo;
|
import net.minecraft.nbt.NbtIo;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.util.datafix.DataFixTypes;
|
import net.minecraft.util.datafix.DataFixTypes;
|
||||||
|
|
@ -58,7 +59,7 @@ public class CachingStructureManager {
|
||||||
|
|
||||||
public static CompoundTag readStructureTag(ResourceLocation location, DataFixer datafixer, InputStream stream) throws IOException {
|
public static CompoundTag readStructureTag(ResourceLocation location, DataFixer datafixer, InputStream stream) throws IOException {
|
||||||
byte[] structureBytes = toBytes(stream);
|
byte[] structureBytes = toBytes(stream);
|
||||||
CompoundTag currentTag = NbtIo.readCompressed(new ByteArrayInputStream(structureBytes));
|
CompoundTag currentTag = NbtIo.readCompressed(new ByteArrayInputStream(structureBytes), NbtAccounter.unlimitedHeap());
|
||||||
if (!currentTag.contains("DataVersion", 99)) {
|
if (!currentTag.contains("DataVersion", 99)) {
|
||||||
currentTag.putInt("DataVersion", 500);
|
currentTag.putInt("DataVersion", 500);
|
||||||
}
|
}
|
||||||
|
|
@ -100,8 +101,8 @@ public class CachingStructureManager {
|
||||||
|
|
||||||
private static synchronized CompoundTag getCachedUpgraded(ResourceLocation location, String hash) {
|
private static synchronized CompoundTag getCachedUpgraded(ResourceLocation location, String hash) {
|
||||||
File theFile = getCachePath(location, hash);
|
File theFile = getCachePath(location, hash);
|
||||||
try {
|
try(FileInputStream stream = new FileInputStream(theFile)) {
|
||||||
return NbtIo.readCompressed(theFile);
|
return NbtIo.readCompressed(stream, NbtAccounter.unlimitedHeap());
|
||||||
} catch(FileNotFoundException e) {
|
} catch(FileNotFoundException e) {
|
||||||
return null;
|
return null;
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
|
|
@ -112,8 +113,8 @@ public class CachingStructureManager {
|
||||||
|
|
||||||
private static synchronized void saveCachedUpgraded(ResourceLocation location, String hash, CompoundTag tagToSave) {
|
private static synchronized void saveCachedUpgraded(ResourceLocation location, String hash, CompoundTag tagToSave) {
|
||||||
File theFile = getCachePath(location, truncateHash(hash));
|
File theFile = getCachePath(location, truncateHash(hash));
|
||||||
try {
|
try(FileOutputStream stream = new FileOutputStream(theFile)) {
|
||||||
NbtIo.writeCompressed(tagToSave, theFile);
|
NbtIo.writeCompressed(tagToSave, stream);
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package org.embeddedt.modernfix.util;
|
|
||||||
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
|
|
||||||
public enum BakeReason {
|
|
||||||
FREEZE,
|
|
||||||
REMOTE_SNAPSHOT_INJECT,
|
|
||||||
LOCAL_SNAPSHOT_INJECT,
|
|
||||||
REVERT,
|
|
||||||
UNKNOWN;
|
|
||||||
private static BakeReason currentBakeReason = null;
|
|
||||||
private static boolean bakeReasonWarned = false;
|
|
||||||
|
|
||||||
public static BakeReason getCurrentBakeReason() {
|
|
||||||
if(currentBakeReason == null && !bakeReasonWarned) {
|
|
||||||
ModernFix.LOGGER.warn("No bake reason found, mixin probably not applied correctly", new IllegalStateException());
|
|
||||||
bakeReasonWarned = false;
|
|
||||||
}
|
|
||||||
return currentBakeReason;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setCurrentBakeReason(BakeReason reason) {
|
|
||||||
currentBakeReason = reason;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,6 +3,8 @@ package org.embeddedt.modernfix.world;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.util.datafix.DataFixTypes;
|
||||||
import net.minecraft.world.level.ChunkPos;
|
import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.dimension.DimensionType;
|
import net.minecraft.world.level.dimension.DimensionType;
|
||||||
import net.minecraft.world.level.saveddata.SavedData;
|
import net.minecraft.world.level.saveddata.SavedData;
|
||||||
|
|
@ -17,6 +19,11 @@ public class StrongholdLocationCache extends SavedData {
|
||||||
chunkPosList = new ArrayList<>();
|
chunkPosList = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static SavedData.Factory<StrongholdLocationCache> factory(ServerLevel serverLevel) {
|
||||||
|
// FIXME datafixer will probably throw on update
|
||||||
|
return new SavedData.Factory<>(StrongholdLocationCache::new, StrongholdLocationCache::load, DataFixTypes.SAVED_DATA_FORCED_CHUNKS);
|
||||||
|
}
|
||||||
|
|
||||||
public List<ChunkPos> getChunkPosList() {
|
public List<ChunkPos> getChunkPosList() {
|
||||||
return new ArrayList<>(chunkPosList);
|
return new ArrayList<>(chunkPosList);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,6 @@ repositories {
|
||||||
dependencies {
|
dependencies {
|
||||||
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
|
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
|
||||||
testImplementation "net.fabricmc:fabric-loader-junit:${rootProject.fabric_loader_version}"
|
testImplementation "net.fabricmc:fabric-loader-junit:${rootProject.fabric_loader_version}"
|
||||||
include(implementation(annotationProcessor("io.github.llamalad7:mixinextras-fabric:${rootProject.mixinextras_version}")))
|
|
||||||
|
|
||||||
modCompileOnly(fabricApi.module("fabric-api-base", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modCompileOnly(fabricApi.module("fabric-api-base", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
modCompileOnly(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modCompileOnly(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package org.embeddedt.modernfix.fabric.mappings;
|
||||||
import net.fabricmc.loader.api.*;
|
import net.fabricmc.loader.api.*;
|
||||||
import net.fabricmc.loader.impl.launch.FabricLauncherBase;
|
import net.fabricmc.loader.impl.launch.FabricLauncherBase;
|
||||||
import net.fabricmc.loader.impl.launch.MappingConfiguration;
|
import net.fabricmc.loader.impl.launch.MappingConfiguration;
|
||||||
import net.fabricmc.mapping.tree.TinyMappingFactory;
|
|
||||||
import org.embeddedt.modernfix.util.CommonModUtil;
|
import org.embeddedt.modernfix.util.CommonModUtil;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
|
@ -28,7 +27,9 @@ public class MappingsClearer {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static void clear() {
|
public static void clear() {
|
||||||
if(FabricLoader.getInstance().isDevelopmentEnvironment())
|
// TODO: Port this to Fabric Loader 0.15
|
||||||
|
|
||||||
|
if(true) //FabricLoader.getInstance().isDevelopmentEnvironment())
|
||||||
return; // never do this in dev
|
return; // never do this in dev
|
||||||
|
|
||||||
Optional<Version> loaderVersion = FabricLoader.getInstance().getModContainer("fabricloader").map(m -> m.getMetadata().getVersion());
|
Optional<Version> loaderVersion = FabricLoader.getInstance().getModContainer("fabricloader").map(m -> m.getMetadata().getVersion());
|
||||||
|
|
@ -50,7 +51,7 @@ public class MappingsClearer {
|
||||||
MappingConfiguration config = FabricLauncherBase.getLauncher().getMappingConfiguration();
|
MappingConfiguration config = FabricLauncherBase.getLauncher().getMappingConfiguration();
|
||||||
Field mappingsField = MappingConfiguration.class.getDeclaredField("mappings");
|
Field mappingsField = MappingConfiguration.class.getDeclaredField("mappings");
|
||||||
mappingsField.setAccessible(true);
|
mappingsField.setAccessible(true);
|
||||||
mappingsField.set(config, TinyMappingFactory.EMPTY_TREE);
|
//mappingsField.set(config, TinyMappingFactory.EMPTY_TREE);
|
||||||
|
|
||||||
// clear useless intermediary->intermediary mappings
|
// clear useless intermediary->intermediary mappings
|
||||||
MappingResolver resolver = FabricLoader.getInstance().getMappingResolver();
|
MappingResolver resolver = FabricLoader.getInstance().getMappingResolver();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package org.embeddedt.modernfix.fabric.mixin.core;
|
||||||
|
|
||||||
|
import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl;
|
||||||
|
import org.embeddedt.modernfix.ModernFixClientFabric;
|
||||||
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
|
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.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(ClientCommonPacketListenerImpl.class)
|
||||||
|
@ClientOnlyMixin
|
||||||
|
public class ClientCommonPacketListenerImplMixin {
|
||||||
|
@Inject(method = "handleUpdateTags", at = @At("RETURN"))
|
||||||
|
private void signalTags(CallbackInfo ci) {
|
||||||
|
ModernFixClientFabric.commonMod.onTagsUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
@Mixin(MinecraftServer.class)
|
@Mixin(MinecraftServer.class)
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public class ClientMinecraftServerMixin {
|
public class ClientMinecraftServerMixin {
|
||||||
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getMillis()J", ordinal = 0))
|
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getNanos()J", ordinal = 0))
|
||||||
private void markServerStarted(CallbackInfo ci) {
|
private void markServerStarted(CallbackInfo ci) {
|
||||||
ModernFixClient.INSTANCE.onServerStarted((MinecraftServer)(Object)this);
|
ModernFixClient.INSTANCE.onServerStarted((MinecraftServer)(Object)this);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,4 @@ public class ClientPlayNetHandlerMixin {
|
||||||
private void signalRecipes(CallbackInfo ci) {
|
private void signalRecipes(CallbackInfo ci) {
|
||||||
ModernFixClientFabric.commonMod.onRecipesUpdated();
|
ModernFixClientFabric.commonMod.onRecipesUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "handleUpdateTags", at = @At("RETURN"))
|
|
||||||
private void signalTags(CallbackInfo ci) {
|
|
||||||
ModernFixClientFabric.commonMod.onTagsUpdated();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ public class MinecraftServerMixin {
|
||||||
ModernFixFabric.theServer = new WeakReference<>((MinecraftServer)(Object)this);
|
ModernFixFabric.theServer = new WeakReference<>((MinecraftServer)(Object)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getMillis()J", ordinal = 0))
|
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getNanos()J", ordinal = 0))
|
||||||
private void hookServerStarted(CallbackInfo ci) {
|
private void hookServerStarted(CallbackInfo ci) {
|
||||||
ModernFix.INSTANCE.onServerStarted();
|
ModernFix.INSTANCE.onServerStarted();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import net.fabricmc.loader.api.metadata.CustomValue;
|
||||||
import net.fabricmc.loader.api.metadata.ModMetadata;
|
import net.fabricmc.loader.api.metadata.ModMetadata;
|
||||||
import net.minecraft.client.searchtree.SearchRegistry;
|
import net.minecraft.client.searchtree.SearchRegistry;
|
||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
|
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.item.CreativeModeTabs;
|
import net.minecraft.world.item.CreativeModeTabs;
|
||||||
|
|
@ -70,7 +71,7 @@ public class ModernFixPlatformHooksImpl implements ModernFixPlatformHooks {
|
||||||
return FabricLoader.getInstance().getGameDir();
|
return FabricLoader.getInstance().getGameDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendPacket(ServerPlayer player, Object packet) {
|
public void sendPacket(ServerPlayer player, CustomPacketPayload packet) {
|
||||||
//PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), packet);
|
//PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,8 @@
|
||||||
"modernfix-common.mixins.json"
|
"modernfix-common.mixins.json"
|
||||||
],
|
],
|
||||||
"depends": {
|
"depends": {
|
||||||
"minecraft": ">=1.16.2"
|
"minecraft": ">=1.16.2",
|
||||||
|
"fabricloader": ">=0.15.0"
|
||||||
},
|
},
|
||||||
"breaks": {
|
"breaks": {
|
||||||
"dashloader": "<5.0.0-beta.1"
|
"dashloader": "<5.0.0-beta.1"
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.world.level.EmptyBlockGetter;
|
import net.minecraft.world.level.EmptyBlockGetter;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.material.FluidState;
|
|
||||||
import org.embeddedt.modernfix.duck.IBlockState;
|
import org.embeddedt.modernfix.duck.IBlockState;
|
||||||
import org.embeddedt.modernfix.testing.util.BootstrapMinecraft;
|
import org.embeddedt.modernfix.testing.util.BootstrapMinecraft;
|
||||||
import org.junit.jupiter.api.*;
|
import org.junit.jupiter.api.*;
|
||||||
|
|
@ -79,6 +78,7 @@ public class BlockStateCacheTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
@Test
|
@Test
|
||||||
@Order(5)
|
@Order(5)
|
||||||
public void checkRecursiveFluidState() {
|
public void checkRecursiveFluidState() {
|
||||||
|
|
@ -93,4 +93,5 @@ public class BlockStateCacheTest {
|
||||||
// this should not throw
|
// this should not throw
|
||||||
state.getFluidState();
|
state.getFluidState();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ dependencies {
|
||||||
modImplementation(fabricApi.module("fabric-models-v0", "0.84.0+1.20.1")) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modImplementation(fabricApi.module("fabric-models-v0", "0.84.0+1.20.1")) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
modImplementation(fabricApi.module("fabric-registry-sync-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modImplementation(fabricApi.module("fabric-registry-sync-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
modImplementation(fabricApi.module("fabric-renderer-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modImplementation(fabricApi.module("fabric-renderer-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
modImplementation(fabricApi.module("fabric-rendering-data-attachment-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modImplementation("net.fabricmc.fabric-api:fabric-rendering-data-attachment-v1:0.3.36+92a0d36777") { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
modImplementation(fabricApi.module("fabric-rendering-fluids-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modImplementation(fabricApi.module("fabric-rendering-fluids-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
modRuntimeOnly(fabricApi.module("fabric-renderer-indigo", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
modRuntimeOnly(fabricApi.module("fabric-renderer-indigo", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.state.BlockBehaviour;
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
||||||
|
|
||||||
public class TestBlock extends Block {
|
public class TestBlock extends Block {
|
||||||
private static final BlockBehaviour.Properties PROPERTIES = BlockBehaviour.Properties.copy(Blocks.STONE);
|
private static final BlockBehaviour.Properties PROPERTIES = BlockBehaviour.Properties.ofFullCopy(Blocks.STONE);
|
||||||
|
|
||||||
public TestBlock() {
|
public TestBlock() {
|
||||||
super(PROPERTIES);
|
super(PROPERTIES);
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
loom.platform=forge
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.classloading;
|
|
||||||
|
|
||||||
import cpw.mods.jarhandling.SecureJar;
|
|
||||||
import cpw.mods.modlauncher.LaunchPluginHandler;
|
|
||||||
import cpw.mods.modlauncher.Launcher;
|
|
||||||
import cpw.mods.modlauncher.api.NamedPath;
|
|
||||||
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
|
|
||||||
import net.minecraftforge.fml.loading.FMLLoader;
|
|
||||||
import net.minecraftforge.fml.loading.moddiscovery.ModFile;
|
|
||||||
import net.minecraftforge.fml.loading.moddiscovery.ModValidator;
|
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
|
||||||
import org.embeddedt.modernfix.util.CommonModUtil;
|
|
||||||
import org.objectweb.asm.Type;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class ATInjector {
|
|
||||||
public static void injectModATs() {
|
|
||||||
CommonModUtil.runWithoutCrash(() -> {
|
|
||||||
ModValidator validator = ObfuscationReflectionHelper.getPrivateValue(FMLLoader.class, null, "modValidator");
|
|
||||||
List<ModFile> modFiles = ObfuscationReflectionHelper.getPrivateValue(ModValidator.class, validator, "candidateMods");
|
|
||||||
List<Pair<ModFile, Path>> list = modFiles.stream()
|
|
||||||
.filter(file -> file.getAccessTransformer().isPresent())
|
|
||||||
.map(file -> Pair.of(file, file.getAccessTransformer().get()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
if(list.size() > 0) {
|
|
||||||
ModernFixMixinPlugin.instance.logger.warn("Applying ATs from {} mods despite being in errored state, this might cause a crash!", list.size());
|
|
||||||
for(var pair : list) {
|
|
||||||
try {
|
|
||||||
FMLLoader.addAccessTransformer(pair.getRight(), pair.getLeft());
|
|
||||||
} catch(RuntimeException e) {
|
|
||||||
ModernFixMixinPlugin.instance.logger.error("Exception occured applying AT from {}", pair.getLeft().getFileName(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// inject into Launcher.INSTANCE.launchPlugins and wrap the mixin plugin, so that mixin transformations
|
|
||||||
// are not applied
|
|
||||||
try {
|
|
||||||
Launcher launcher = Launcher.INSTANCE;
|
|
||||||
Field launchPlugins = Launcher.class.getDeclaredField("launchPlugins");
|
|
||||||
launchPlugins.setAccessible(true);
|
|
||||||
|
|
||||||
LaunchPluginHandler handler = (LaunchPluginHandler) launchPlugins.get(launcher);
|
|
||||||
Field plugins = LaunchPluginHandler.class.getDeclaredField("plugins");
|
|
||||||
plugins.setAccessible(true);
|
|
||||||
|
|
||||||
//noinspection unchecked
|
|
||||||
Map<String, ILaunchPluginService> map = (Map<String, ILaunchPluginService>) plugins.get(handler);
|
|
||||||
Map<String, ILaunchPluginService> newMap = new HashMap<>(map);
|
|
||||||
NonTransformingLaunchPluginService.class.getName(); // trigger classloading, just to be safe
|
|
||||||
newMap.replaceAll((name, plugin) -> {
|
|
||||||
if(plugin.getClass().getName().startsWith("org.spongepowered.asm.launch.MixinLaunchPlugin")) {
|
|
||||||
ModernFixMixinPlugin.instance.logger.warn("Disabling plugin '{}': {}", name, plugin.getClass().getName());
|
|
||||||
return new NonTransformingLaunchPluginService(plugin);
|
|
||||||
} else {
|
|
||||||
return plugin;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
plugins.set(handler, newMap);
|
|
||||||
} catch (ReflectiveOperationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}, "applying mod ATs in errored state");
|
|
||||||
}
|
|
||||||
|
|
||||||
static class NonTransformingLaunchPluginService implements ILaunchPluginService {
|
|
||||||
|
|
||||||
private final ILaunchPluginService delegate;
|
|
||||||
|
|
||||||
NonTransformingLaunchPluginService(ILaunchPluginService delegate) {
|
|
||||||
this.delegate = delegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String name() {
|
|
||||||
return delegate.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final EnumSet<Phase> NEVER = EnumSet.noneOf(Phase.class);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumSet<Phase> handlesClass(Type classType, boolean isEmpty) {
|
|
||||||
return NEVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void offerResource(Path resource, String name) {
|
|
||||||
delegate.offerResource(resource, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addResources(List<SecureJar> resources) {
|
|
||||||
delegate.addResources(resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initializeLaunch(ITransformerLoader transformerLoader, NamedPath[] specialPaths) {
|
|
||||||
delegate.initializeLaunch(transformerLoader, specialPaths);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T> T getExtension() {
|
|
||||||
return delegate.getExtension();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void customAuditConsumer(String className, Consumer<String[]> auditDataAcceptor) {
|
|
||||||
delegate.customAuditConsumer(className, auditDataAcceptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.classloading;
|
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
|
|
||||||
import net.minecraftforge.accesstransformer.AccessTransformer;
|
|
||||||
import net.minecraftforge.accesstransformer.AccessTransformerEngine;
|
|
||||||
import net.minecraftforge.accesstransformer.INameHandler;
|
|
||||||
import net.minecraftforge.accesstransformer.Target;
|
|
||||||
import net.minecraftforge.accesstransformer.parser.AccessTransformerList;
|
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
|
||||||
import org.objectweb.asm.Type;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class FastAccessTransformerList extends AccessTransformerList {
|
|
||||||
private FastATMap accessTransformerMap;
|
|
||||||
|
|
||||||
public static void attemptReplace() {
|
|
||||||
AccessTransformerList masterList;
|
|
||||||
FastAccessTransformerList myList = new FastAccessTransformerList();
|
|
||||||
try {
|
|
||||||
Field master = AccessTransformerEngine.class.getDeclaredField("masterList");
|
|
||||||
master.setAccessible(true);
|
|
||||||
masterList = (AccessTransformerList)master.get(AccessTransformerEngine.INSTANCE);
|
|
||||||
Field transfomersMap = AccessTransformerList.class.getDeclaredField("accessTransformers");
|
|
||||||
transfomersMap.setAccessible(true);
|
|
||||||
Map<Target<?>, AccessTransformer> map = (Map<Target<?>, AccessTransformer>)transfomersMap.get(masterList);
|
|
||||||
INameHandler nameHandler = ObfuscationReflectionHelper.getPrivateValue(AccessTransformerList.class, masterList, "nameHandler");
|
|
||||||
myList.setNameHandler(nameHandler);
|
|
||||||
myList.accessTransformerMap = new FastATMap(map);
|
|
||||||
ObfuscationReflectionHelper.setPrivateValue(AccessTransformerList.class, myList, myList.accessTransformerMap, "accessTransformers");
|
|
||||||
master.set(AccessTransformerEngine.INSTANCE, myList);
|
|
||||||
} catch(ReflectiveOperationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean containsClassTarget(Type type) {
|
|
||||||
return this.accessTransformerMap.containsType(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class FastATMap implements Map<Target<?>, AccessTransformer> {
|
|
||||||
private final Map<Target<?>, AccessTransformer> delegate;
|
|
||||||
private final Set<Type> allContainedTypes;
|
|
||||||
|
|
||||||
public FastATMap(Map<Target<?>, AccessTransformer> delegate) {
|
|
||||||
this.delegate = new HashMap<>();
|
|
||||||
this.allContainedTypes = new ObjectOpenHashSet<>();
|
|
||||||
this.putAll(delegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size() {
|
|
||||||
return this.delegate.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return this.delegate.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean containsKey(Object o) {
|
|
||||||
return this.delegate.containsKey(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean containsValue(Object o) {
|
|
||||||
return this.delegate.containsValue(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AccessTransformer get(Object o) {
|
|
||||||
return this.delegate.get(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public AccessTransformer put(Target<?> target, AccessTransformer accessTransformer) {
|
|
||||||
this.allContainedTypes.add(target.getASMType());
|
|
||||||
return this.delegate.put(target, accessTransformer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AccessTransformer remove(Object o) {
|
|
||||||
if(o instanceof Target) {
|
|
||||||
this.allContainedTypes.remove(((Target<?>)o).getASMType());
|
|
||||||
}
|
|
||||||
return this.delegate.remove(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void putAll(@NotNull Map<? extends Target<?>, ? extends AccessTransformer> map) {
|
|
||||||
for(Target<?> key : map.keySet()) {
|
|
||||||
this.allContainedTypes.add(key.getASMType());
|
|
||||||
}
|
|
||||||
this.delegate.putAll(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clear() {
|
|
||||||
this.allContainedTypes.clear();
|
|
||||||
this.delegate.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Set<Target<?>> keySet() {
|
|
||||||
return this.delegate.keySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Collection<AccessTransformer> values() {
|
|
||||||
return this.delegate.values();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Set<Entry<Target<?>, AccessTransformer>> entrySet() {
|
|
||||||
return this.delegate.entrySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean containsType(Type type) {
|
|
||||||
return this.allContainedTypes.contains(type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.load;
|
|
||||||
|
|
||||||
import net.minecraftforge.fml.ModWorkManager;
|
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentLinkedDeque;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.locks.LockSupport;
|
|
||||||
|
|
||||||
public class ModWorkManagerQueue extends ConcurrentLinkedDeque<Runnable> {
|
|
||||||
private static final long PARK_TIME = TimeUnit.MILLISECONDS.toNanos(25);
|
|
||||||
|
|
||||||
private static final Runnable DUMMY_TASK = () -> {};
|
|
||||||
|
|
||||||
private boolean shouldReturnDummyTask = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sleep for a bit if there are no tasks.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Runnable pollFirst() {
|
|
||||||
Runnable r = super.pollFirst();
|
|
||||||
if(r == null) {
|
|
||||||
LockSupport.parkNanos(PARK_TIME);
|
|
||||||
boolean isReturning = shouldReturnDummyTask;
|
|
||||||
shouldReturnDummyTask = !shouldReturnDummyTask;
|
|
||||||
/*
|
|
||||||
* We need to kick FML to redraw the loading screen periodically,
|
|
||||||
* but also allow actually exiting the executor loop, so that
|
|
||||||
* loading can complete if async work is done.
|
|
||||||
*
|
|
||||||
* This is accomplished by alternating between returning a dummy
|
|
||||||
* task and nothing.
|
|
||||||
*/
|
|
||||||
return isReturning ? DUMMY_TASK : null;
|
|
||||||
} else {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
||||||
public static void replace() {
|
|
||||||
try {
|
|
||||||
Class<?> syncExecutorClass = Class.forName("net.minecraftforge.fml.ModWorkManager$SyncExecutor");
|
|
||||||
ConcurrentLinkedDeque<Runnable> taskQueue = (ConcurrentLinkedDeque<Runnable>) ObfuscationReflectionHelper.getPrivateValue((Class)syncExecutorClass, (Object)ModWorkManager.syncExecutor(), "tasks");
|
|
||||||
ModWorkManagerQueue q = new ModWorkManagerQueue();
|
|
||||||
Runnable task;
|
|
||||||
do {
|
|
||||||
task = taskQueue.pollFirst();
|
|
||||||
if(task != null)
|
|
||||||
q.push(task);
|
|
||||||
} while(task != null);
|
|
||||||
ObfuscationReflectionHelper.setPrivateValue((Class)syncExecutorClass, (Object)ModWorkManager.syncExecutor(), q, "tasks");
|
|
||||||
} catch(ReflectiveOperationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.forge_vehicle_packets;
|
|
||||||
|
|
||||||
import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket;
|
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
|
||||||
import net.minecraft.server.network.ServerGamePacketListenerImpl;
|
|
||||||
import net.minecraft.world.phys.Vec3;
|
|
||||||
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.Redirect;
|
|
||||||
|
|
||||||
@Mixin(ServerGamePacketListenerImpl.class)
|
|
||||||
public class ServerGamePacketListenerImplMixin {
|
|
||||||
@Shadow public ServerPlayer player;
|
|
||||||
|
|
||||||
@Redirect(method = "handleMoveVehicle", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;absMoveTo(DDDFF)V"))
|
|
||||||
private void movePlayerUsingPositionRider(ServerPlayer player, double x, double y, double z, float yRot, float xRot, ServerboundMoveVehiclePacket packet) {
|
|
||||||
if(player == this.player) {
|
|
||||||
// use positionRider
|
|
||||||
Vec3 oldPos = this.player.position();
|
|
||||||
yRot = this.player.getYRot();
|
|
||||||
xRot = this.player.getXRot();
|
|
||||||
float yHeadRot = this.player.getYHeadRot();
|
|
||||||
this.player.getRootVehicle().positionRider(this.player);
|
|
||||||
// keep old rotation
|
|
||||||
this.player.setYRot(yRot);
|
|
||||||
this.player.setXRot(xRot);
|
|
||||||
this.player.setYHeadRot(yHeadRot);
|
|
||||||
// save old position
|
|
||||||
this.player.xo = oldPos.x;
|
|
||||||
this.player.yo = oldPos.y;
|
|
||||||
this.player.zo = oldPos.z;
|
|
||||||
} else
|
|
||||||
player.absMoveTo(x, y, z, yRot, xRot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.model_data_manager_cme;
|
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.world.level.ChunkPos;
|
|
||||||
import net.minecraftforge.client.model.data.ModelDataManager;
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
|
||||||
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.ModifyArg;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fix several concurrency issues in the default ModelDataManager.
|
|
||||||
*/
|
|
||||||
@Mixin(ModelDataManager.class)
|
|
||||||
@ClientOnlyMixin
|
|
||||||
public abstract class ModelDataManagerMixin {
|
|
||||||
@Shadow protected abstract void refreshAt(ChunkPos chunk);
|
|
||||||
|
|
||||||
@Shadow @Final private Map<ChunkPos, Set<BlockPos>> needModelDataRefresh;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make the set of positions to refresh a real concurrent hash set rather than relying on synchronizedSet,
|
|
||||||
* because the returned iterator won't be thread-safe otherwise. See https://github.com/AppliedEnergistics/Applied-Energistics-2/issues/7511
|
|
||||||
*/
|
|
||||||
@ModifyArg(method = "requestRefresh", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;", ordinal = 0), index = 1, remap = false)
|
|
||||||
private Function<ChunkPos, Set<BlockPos>> changeTypeOfSetUsed(Function<ChunkPos, Set<BlockPos>> mappingFunction) {
|
|
||||||
return pos -> Collections.newSetFromMap(new ConcurrentHashMap<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "getAt(Lnet/minecraft/world/level/ChunkPos;)Ljava/util/Map;", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/model/data/ModelDataManager;refreshAt(Lnet/minecraft/world/level/ChunkPos;)V"), remap = false)
|
|
||||||
private void onlyRefreshOnMainThread(ModelDataManager instance, ChunkPos pos) {
|
|
||||||
// Only refresh model data on the main thread. This prevents calling getBlockEntity from worker threads
|
|
||||||
// which could cause weird CMEs or other behavior.
|
|
||||||
// Avoid the loop if no model data needs to be refreshed, to prevent unnecessary allocation.
|
|
||||||
if(Minecraft.getInstance().isSameThread() && !needModelDataRefresh.isEmpty()) {
|
|
||||||
// Refresh the given chunk, and all its neighbors. This is less efficient than the default code
|
|
||||||
// but we have no choice since we need to not do refreshing on workers, and blocks might
|
|
||||||
// try to access model data in neighboring chunks.
|
|
||||||
for(int x = -1; x <= 1; x++) {
|
|
||||||
for(int z = -1; z <= 1; z++) {
|
|
||||||
refreshAt(new ChunkPos(pos.x + x, pos.z + z));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.removed_dimensions;
|
|
||||||
|
|
||||||
import net.minecraft.world.level.storage.LevelStorageSource;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
|
||||||
|
|
||||||
@Mixin(LevelStorageSource.class)
|
|
||||||
public class LevelStorageSourceMixin {
|
|
||||||
@ModifyArg(method = "*", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/DataResult;getOrThrow(ZLjava/util/function/Consumer;)Ljava/lang/Object;", ordinal = 0), index = 0)
|
|
||||||
private static boolean alwaysAllowPartialDimensions(boolean flag) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.core;
|
|
||||||
|
|
||||||
import net.minecraft.network.Connection;
|
|
||||||
import net.minecraftforge.network.NetworkHooks;
|
|
||||||
import org.embeddedt.modernfix.forge.packet.NetworkUtils;
|
|
||||||
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;
|
|
||||||
|
|
||||||
@Mixin(NetworkHooks.class)
|
|
||||||
public abstract class NetworkHooksMixin {
|
|
||||||
@Shadow public static boolean isVanillaConnection(Connection manager) {
|
|
||||||
throw new AssertionError();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "handleClientLoginSuccess", at = @At("RETURN"), remap = false)
|
|
||||||
private static void setVanillaGlobalFlag(Connection manager, CallbackInfo ci) {
|
|
||||||
NetworkUtils.isCurrentlyVanilla = isVanillaConnection(manager);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.devenv;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.registries.ForgeRegistry;
|
|
||||||
import net.minecraftforge.registries.GameData;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
@Mixin(GameData.class)
|
|
||||||
public class GameDataMixin {
|
|
||||||
|
|
||||||
@Redirect(method = "*", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/registries/ForgeRegistry;dump(Lnet/minecraft/resources/ResourceLocation;)V", remap = false))
|
|
||||||
private static void noDump(ForgeRegistry<?> reg, ResourceLocation id) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.feature.registry_event_progress;
|
|
||||||
|
|
||||||
import net.minecraftforge.eventbus.api.Event;
|
|
||||||
import net.minecraftforge.fml.ModList;
|
|
||||||
import net.minecraftforge.fml.ModLoader;
|
|
||||||
import net.minecraftforge.fml.ModLoadingContext;
|
|
||||||
import net.minecraftforge.fml.StartupMessageManager;
|
|
||||||
import net.minecraftforge.fml.event.IModBusEvent;
|
|
||||||
import net.minecraftforge.registries.GameData;
|
|
||||||
import net.minecraftforge.registries.RegisterEvent;
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
|
||||||
import org.embeddedt.modernfix.forge.util.AsyncLoadingScreen;
|
|
||||||
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.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(value = GameData.class, remap = false)
|
|
||||||
@ClientOnlyMixin
|
|
||||||
public class GameDataMixin {
|
|
||||||
|
|
||||||
private static AsyncLoadingScreen mfix$asyncScreen;
|
|
||||||
|
|
||||||
@Inject(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", ordinal = 0))
|
|
||||||
private static void createAsyncScreen(CallbackInfo ci) {
|
|
||||||
mfix$asyncScreen = new AsyncLoadingScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Ljava/lang/RuntimeException;getSuppressed()[Ljava/lang/Throwable;", ordinal = 0))
|
|
||||||
private static void closeAsyncScreen(CallbackInfo ci) {
|
|
||||||
mfix$asyncScreen.close();
|
|
||||||
mfix$asyncScreen = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/ModLoader;postEventWrapContainerInModOrder(Lnet/minecraftforge/eventbus/api/Event;)V"))
|
|
||||||
private static <T extends Event & IModBusEvent> void swapThreadAndPost(ModLoader loader, T event) {
|
|
||||||
RegisterEvent registryEvent = (RegisterEvent)event;
|
|
||||||
var pb = StartupMessageManager.addProgressBar(registryEvent.getRegistryKey().location().toString(), ModList.get().size());
|
|
||||||
try {
|
|
||||||
loader.postEventWithWrapInModOrder(event, (mc, e) -> {
|
|
||||||
ModLoadingContext.get().setActiveContainer(mc);
|
|
||||||
pb.label(pb.name() + " - " + mc.getModInfo().getDisplayName());
|
|
||||||
pb.increment();
|
|
||||||
}, (mc, e) -> {
|
|
||||||
ModLoadingContext.get().setActiveContainer(null);
|
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
pb.complete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.fast_forge_dummies;
|
|
||||||
|
|
||||||
import com.mojang.serialization.Lifecycle;
|
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.MappedRegistry;
|
|
||||||
import net.minecraft.core.Registry;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import org.objectweb.asm.Opcodes;
|
|
||||||
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.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Mixin(targets = { "net/minecraftforge/registries/NamespacedWrapper" })
|
|
||||||
public abstract class NamespacedHolderHelperMixin<T> extends MappedRegistry<T> {
|
|
||||||
@Shadow(remap = false) private Map<ResourceLocation, Holder.Reference<T>> holdersByName;
|
|
||||||
|
|
||||||
public NamespacedHolderHelperMixin(ResourceKey<? extends Registry<T>> arg, Lifecycle lifecycle) {
|
|
||||||
super(arg, lifecycle);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "freeze", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraftforge/registries/NamespacedWrapper;holdersByName:Ljava/util/Map;", remap = false), cancellable = true)
|
|
||||||
private void fastDummyCheck(CallbackInfoReturnable<Registry<T>> cir) {
|
|
||||||
// Quickly iterate without making any streams, etc. to see if everything is fine
|
|
||||||
// Use the slow path (by returning without cancelling) when there is an error
|
|
||||||
for(Holder.Reference<T> ref : this.holdersByName.values()) {
|
|
||||||
if(!ref.isBound())
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.unregisteredIntrusiveHolders != null) {
|
|
||||||
for(Holder.Reference<T> ref : this.unregisteredIntrusiveHolders.values()) {
|
|
||||||
if(ref.getType() == Holder.Reference.Type.INTRUSIVE && !ref.isBound())
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Skip the creation of streams
|
|
||||||
cir.setReturnValue(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.fast_registry_validation;
|
|
||||||
|
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
|
||||||
import net.minecraftforge.registries.ForgeRegistry;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.apache.logging.log4j.Marker;
|
|
||||||
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.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
@Mixin(value = ForgeRegistry.class, remap = false)
|
|
||||||
public class ForgeRegistryMixin<V> {
|
|
||||||
private static Method bitSetTrimMethod = null;
|
|
||||||
private static boolean bitSetTrimMethodRetrieved = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cache the result of findMethod instead of running it multiple times.
|
|
||||||
* Null checks are not required as the surrounding code handles it already.
|
|
||||||
*/
|
|
||||||
@Redirect(method = "validateContent", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/util/ObfuscationReflectionHelper;findMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"), require = 0)
|
|
||||||
private Method skipMultipleRemap(Class<?> clz, String methodName, Class<?>[] params) {
|
|
||||||
if(!bitSetTrimMethodRetrieved) {
|
|
||||||
bitSetTrimMethodRetrieved = true;
|
|
||||||
bitSetTrimMethod = ObfuscationReflectionHelper.findMethod(clz, methodName, params);
|
|
||||||
}
|
|
||||||
return bitSetTrimMethod;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int expectedNextBit = -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Avoid calling nextClearBit and scanning the whole registry for every block registration.
|
|
||||||
*/
|
|
||||||
@Redirect(method = "add(ILnet/minecraft/resources/ResourceLocation;Ljava/lang/Object;Ljava/lang/String;)I", at = @At(value = "INVOKE", target = "Ljava/util/BitSet;nextClearBit(I)I"))
|
|
||||||
private int useCachedBit(BitSet availabilityMap, int minimum) {
|
|
||||||
int bit = availabilityMap.nextClearBit(expectedNextBit != -1 ? expectedNextBit : minimum);
|
|
||||||
expectedNextBit = bit + 1;
|
|
||||||
return bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = { "sync", "clear", "block" }, at = @At("HEAD"))
|
|
||||||
private void clearBitCache(CallbackInfo ci) {
|
|
||||||
expectedNextBit = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "add(ILnet/minecraft/resources/ResourceLocation;Ljava/lang/Object;Ljava/lang/String;)I", at = @At(value = "INVOKE", target = "Lorg/apache/logging/log4j/Logger;trace(Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V"))
|
|
||||||
private void skipTrace(Logger logger, Marker marker, String s, Object o, Object o1, Object o2, Object o3, Object o4) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.forge_cap_retrieval;
|
|
||||||
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
|
||||||
import net.minecraftforge.common.capabilities.ForgeCapabilities;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
@Mixin(LivingEntity.class)
|
|
||||||
public class LivingEntityMixin {
|
|
||||||
/**
|
|
||||||
* @author embeddedt (issue noted by XFactHD)
|
|
||||||
* @reason check capability equality before checking that entity is alive, the latter requires a lot more
|
|
||||||
* indirection
|
|
||||||
*/
|
|
||||||
@Redirect(method = "getCapability", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;isAlive()Z"))
|
|
||||||
private <T> boolean checkAliveAfterCap(LivingEntity entity, Capability<T> capability, @Nullable Direction facing) {
|
|
||||||
return capability == ForgeCapabilities.ITEM_HANDLER && entity.isAlive();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.forge_registry_alloc;
|
|
||||||
|
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.Registry;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.world.item.Item;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import org.embeddedt.modernfix.forge.registry.DelegateHolder;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
|
|
||||||
@Mixin({Block.class, Item.class})
|
|
||||||
public class DelegateHolderMixin<T> implements DelegateHolder<T> {
|
|
||||||
private Holder.Reference<T> mfix$delegate;
|
|
||||||
private ResourceKey<Registry<T>> mfix$key;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Holder.Reference<T> mfix$getDelegate(ResourceKey<Registry<T>> registryKey) {
|
|
||||||
if(mfix$key == registryKey) {
|
|
||||||
return mfix$delegate;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mfix$setDelegate(ResourceKey<Registry<T>> registryKey, Holder.Reference<T> holder) {
|
|
||||||
this.mfix$delegate = holder;
|
|
||||||
this.mfix$key = registryKey;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.forge_registry_alloc;
|
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.Hash;
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.Registry;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.registries.ForgeRegistry;
|
|
||||||
import net.minecraftforge.registries.RegistryManager;
|
|
||||||
import org.embeddedt.modernfix.forge.registry.DelegateHolder;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
|
||||||
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.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Mixin(value = ForgeRegistry.class, remap = false)
|
|
||||||
public abstract class ForgeRegistryMixin<V> {
|
|
||||||
// Replace the backing maps with fastutil maps for a bit more speed, since value->holder lookups in particular
|
|
||||||
// are a bottleneck in many areas (e.g. render type lookup)
|
|
||||||
@Shadow @Final private Map<ResourceLocation, Holder.Reference<V>> delegatesByName = new Object2ObjectOpenHashMap<>();
|
|
||||||
|
|
||||||
@Shadow @Final private Map<V, Holder.Reference<V>> delegatesByValue = new Object2ObjectOpenHashMap<>(Hash.DEFAULT_INITIAL_SIZE, 0.5F);
|
|
||||||
|
|
||||||
@Shadow public abstract ResourceKey<Registry<V>> getRegistryKey();
|
|
||||||
|
|
||||||
@Shadow @Final private RegistryManager stage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author embeddedt
|
|
||||||
* @reason stop allocating so many unneeded objects. stop.
|
|
||||||
*/
|
|
||||||
@Overwrite
|
|
||||||
public Holder.Reference<V> getDelegateOrThrow(ResourceLocation location) {
|
|
||||||
Holder.Reference<V> holder = delegatesByName.get(location);
|
|
||||||
|
|
||||||
if (holder == null) {
|
|
||||||
throw new IllegalArgumentException(String.format(Locale.ENGLISH, "No delegate exists for location %s", location));
|
|
||||||
}
|
|
||||||
|
|
||||||
return holder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author embeddedt
|
|
||||||
* @reason see above
|
|
||||||
*/
|
|
||||||
@Overwrite
|
|
||||||
public Holder.Reference<V> getDelegateOrThrow(ResourceKey<V> rkey) {
|
|
||||||
Holder.Reference<V> holder = delegatesByName.get(rkey.location());
|
|
||||||
|
|
||||||
if (holder == null) {
|
|
||||||
throw new IllegalArgumentException(String.format(Locale.ENGLISH, "No delegate exists for key %s", rkey));
|
|
||||||
}
|
|
||||||
|
|
||||||
return holder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author embeddedt
|
|
||||||
* @reason store delegates that are accessed extremely regularly on the registry entry itself, rather than
|
|
||||||
* going through a map lookup
|
|
||||||
*/
|
|
||||||
@Inject(method = "bindDelegate", at = @At("RETURN"))
|
|
||||||
private void attachDelegate(ResourceKey<V> rkey, V value, CallbackInfoReturnable<Holder.Reference<V>> cir) {
|
|
||||||
// Only attach delegates for the ACTIVE registry. The Forge registry system is weird and seems to keep multiple
|
|
||||||
// copies of itself at once.
|
|
||||||
if(this.stage == RegistryManager.ACTIVE && value instanceof DelegateHolder<?>) {
|
|
||||||
((DelegateHolder<V>)value).mfix$setDelegate(this.getRegistryKey(), cir.getReturnValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author embeddedt
|
|
||||||
* @reason skip map lookup for hot delegates, avoid allocations otherwise
|
|
||||||
*/
|
|
||||||
@Overwrite
|
|
||||||
public Holder.Reference<V> getDelegateOrThrow(V value) {
|
|
||||||
Holder.Reference<V> holder = null;
|
|
||||||
if (this.stage == RegistryManager.ACTIVE && value instanceof DelegateHolder<?>) {
|
|
||||||
holder = ((DelegateHolder<V>)value).mfix$getDelegate(this.getRegistryKey());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (holder == null) {
|
|
||||||
holder = delegatesByValue.get(value);
|
|
||||||
if (holder == null) {
|
|
||||||
throw new IllegalArgumentException(String.format(Locale.ENGLISH, "No delegate exists for value %s", value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return holder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.forge_registry_lambda;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.registries.RegistryObject;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
|
|
||||||
@Mixin(value = RegistryObject.class, remap = false)
|
|
||||||
public class RegistryObjectMixin<T> {
|
|
||||||
@Shadow private @Nullable T value;
|
|
||||||
|
|
||||||
@Shadow @Final private ResourceLocation name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author embeddedt
|
|
||||||
* @reason avoid lambda allocation on every call
|
|
||||||
*/
|
|
||||||
@Overwrite
|
|
||||||
public T get() {
|
|
||||||
T ret = this.value;
|
|
||||||
if(ret == null) {
|
|
||||||
throw new NullPointerException("Registry Object not present: " + this.name);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.potential_spawns_alloc;
|
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.util.random.WeightedRandomList;
|
|
||||||
import net.minecraft.world.entity.MobCategory;
|
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
|
||||||
import net.minecraft.world.level.biome.MobSpawnSettings;
|
|
||||||
import net.minecraftforge.event.ForgeEventFactory;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mixin(ForgeEventFactory.class)
|
|
||||||
public class ForgeEventFactoryMixin {
|
|
||||||
@Redirect(method = "getPotentialSpawns", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/random/WeightedRandomList;create(Ljava/util/List;)Lnet/minecraft/util/random/WeightedRandomList;"))
|
|
||||||
private static WeightedRandomList<MobSpawnSettings.SpawnerData> reuseOldList(List<MobSpawnSettings.SpawnerData> items, LevelAccessor level, MobCategory category, BlockPos pos, WeightedRandomList<MobSpawnSettings.SpawnerData> oldList) {
|
|
||||||
// Our patched version of PotentialSpawns will return the same list as unwrap() if no one mutated the list
|
|
||||||
if(items == oldList.unwrap()) {
|
|
||||||
return oldList;
|
|
||||||
}
|
|
||||||
return WeightedRandomList.create(items);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.potential_spawns_alloc;
|
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.util.random.WeightedRandomList;
|
|
||||||
import net.minecraft.world.entity.MobCategory;
|
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
|
||||||
import net.minecraft.world.level.biome.MobSpawnSettings;
|
|
||||||
import net.minecraftforge.event.level.LevelEvent;
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
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.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mixin(LevelEvent.PotentialSpawns.class)
|
|
||||||
public class PotentialSpawnsMixin {
|
|
||||||
@Shadow(remap = false) @Final @Mutable private List<MobSpawnSettings.SpawnerData> view;
|
|
||||||
@Shadow(remap = false) @Final @Mutable private List<MobSpawnSettings.SpawnerData> list;
|
|
||||||
|
|
||||||
private static final ArrayList<MobSpawnSettings.SpawnerData> SENTINEL = new ArrayList<>();
|
|
||||||
|
|
||||||
@Redirect(method = "<init>", at = @At(value = "NEW", target = "java/util/ArrayList", ordinal = 1))
|
|
||||||
private ArrayList<?> avoidListAlloc1() {
|
|
||||||
return SENTINEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "<init>", at = @At(value = "NEW", target = "java/util/ArrayList", ordinal = 0))
|
|
||||||
private ArrayList<?> avoidListAlloc2(Collection c) {
|
|
||||||
return SENTINEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Ljava/util/Collections;unmodifiableList(Ljava/util/List;)Ljava/util/List;"))
|
|
||||||
private List<?> avoidListAlloc3(List<?> l) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
private void initializeSmartLists(LevelAccessor level, MobCategory category, BlockPos pos, WeightedRandomList<MobSpawnSettings.SpawnerData> oldList, CallbackInfo ci) {
|
|
||||||
this.view = oldList.unwrap();
|
|
||||||
this.list = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void mfix$populateList() {
|
|
||||||
if(this.list == null) {
|
|
||||||
this.list = new ArrayList<>(this.view);
|
|
||||||
this.view = Collections.unmodifiableList(this.list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = {"addSpawnerData" }, at = @At("HEAD"), remap = false)
|
|
||||||
private void populateList(MobSpawnSettings.SpawnerData data, CallbackInfo ci) {
|
|
||||||
mfix$populateList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = {"removeSpawnerData" }, at = @At("HEAD"), remap = false)
|
|
||||||
private void populateList(MobSpawnSettings.SpawnerData data, CallbackInfoReturnable<Boolean> cir) {
|
|
||||||
mfix$populateList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.reduce_blockstate_cache_rebuilds;
|
|
||||||
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraftforge.registries.IForgeRegistryInternal;
|
|
||||||
import net.minecraftforge.registries.RegistryManager;
|
|
||||||
import org.embeddedt.modernfix.blockstate.BlockStateCacheHandler;
|
|
||||||
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.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(targets = { "net/minecraftforge/registries/GameData$BlockCallbacks" })
|
|
||||||
public class BlockCallbacksMixin {
|
|
||||||
@Redirect(method = "onBake", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;initCache()V"))
|
|
||||||
private void skipCache(BlockState instance) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "onBake", at = @At(value = "TAIL"), remap = false)
|
|
||||||
private void computeCaches(IForgeRegistryInternal<Block> owner, RegistryManager stage, CallbackInfo ci) {
|
|
||||||
BlockStateCacheHandler.rebuildParallel(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.reduce_blockstate_cache_rebuilds;
|
|
||||||
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.registries.ForgeRegistry;
|
|
||||||
import net.minecraftforge.registries.GameData;
|
|
||||||
import org.embeddedt.modernfix.util.BakeReason;
|
|
||||||
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.CallbackInfo;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Mixin(GameData.class)
|
|
||||||
public class GameDataMixin {
|
|
||||||
@Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false)
|
|
||||||
private static void markFreezeBakeReason(CallbackInfo ci) {
|
|
||||||
BakeReason.setCurrentBakeReason(BakeReason.FREEZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/registries/GameData;fireRemapEvent(Ljava/util/Map;Z)V"), remap = false)
|
|
||||||
private static void markEmptyBakeReason1(CallbackInfo ci) {
|
|
||||||
BakeReason.setCurrentBakeReason(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false)
|
|
||||||
private static void markRevertBakeReason(CallbackInfo ci) {
|
|
||||||
BakeReason.setCurrentBakeReason(BakeReason.REVERT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1, shift = At.Shift.AFTER), remap = false)
|
|
||||||
private static void markEmptyBakeReason2(CallbackInfo ci) {
|
|
||||||
BakeReason.setCurrentBakeReason(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "injectSnapshot", at = @At("HEAD"), remap = false)
|
|
||||||
private static void markSnapshotInjectBakeReason(Map<ResourceLocation, ForgeRegistry.Snapshot> snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable<Multimap<ResourceLocation, ResourceLocation>> cir) {
|
|
||||||
BakeReason.setCurrentBakeReason(isLocalWorld ? BakeReason.LOCAL_SNAPSHOT_INJECT : BakeReason.REMOTE_SNAPSHOT_INJECT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "injectSnapshot", at = @At("RETURN"), remap = false)
|
|
||||||
private static void markEmptyBakeReason2(Map<ResourceLocation, ForgeRegistry.Snapshot> snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable<Multimap<ResourceLocation, ResourceLocation>> cir) {
|
|
||||||
BakeReason.setCurrentBakeReason(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.resourcepacks;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.server.packs.PackResources;
|
|
||||||
import net.minecraft.server.packs.PackType;
|
|
||||||
import net.minecraftforge.forgespi.locating.IModFile;
|
|
||||||
import net.minecraftforge.resource.PathPackResources;
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
import org.embeddedt.modernfix.forge.load.ModResourcePackPathFixer;
|
|
||||||
import org.embeddedt.modernfix.resources.ICachingResourcePack;
|
|
||||||
import org.embeddedt.modernfix.resources.NewResourcePackAdapter;
|
|
||||||
import org.embeddedt.modernfix.resources.PackResourcesCacheEngine;
|
|
||||||
import org.embeddedt.modernfix.util.PackTypeHelper;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
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.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|
||||||
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.LinkOption;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@Mixin(value = PathPackResources.class, priority = 1100)
|
|
||||||
public abstract class ForgePathPackResourcesMixin implements ICachingResourcePack {
|
|
||||||
@Shadow(remap = false) protected abstract Path resolve(String... paths);
|
|
||||||
|
|
||||||
@Shadow(remap = false) @NotNull
|
|
||||||
protected abstract Set<String> getNamespacesFromDisk(PackType type);
|
|
||||||
|
|
||||||
@Shadow(remap = false) private static String[] getPathFromLocation(PackType type, ResourceLocation location) {
|
|
||||||
throw new AssertionError();
|
|
||||||
}
|
|
||||||
|
|
||||||
private PackResourcesCacheEngine cacheEngine;
|
|
||||||
|
|
||||||
private IModFile mfix$resolveFileOverride;
|
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("TAIL"))
|
|
||||||
private void cacheResources(String packId, boolean isBuiltin, final Path source, CallbackInfo ci) {
|
|
||||||
// handle buggy mods instantiating at the root path, but only if they didn't override at all
|
|
||||||
// (otherwise they may have handled resolve() already)
|
|
||||||
if(((Object)this).getClass() == PathPackResources.class)
|
|
||||||
this.mfix$resolveFileOverride = ModResourcePackPathFixer.getModFileByRootPath(source);
|
|
||||||
if(this.mfix$resolveFileOverride != null)
|
|
||||||
ModernFix.LOGGER.warn("PathResourcePack base class instantiated with root path of mod file {}. This probably means a mod should be calling ResourcePackLoader.createPackForMod instead. Applying workaround.", mfix$resolveFileOverride.getFileName());
|
|
||||||
invalidateCache();
|
|
||||||
PackResourcesCacheEngine.track(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "resolve", at = @At("HEAD"), cancellable = true, remap = false)
|
|
||||||
private void resolveViaModFile(String[] paths, CallbackInfoReturnable<Path> cir) {
|
|
||||||
if(this.mfix$resolveFileOverride != null)
|
|
||||||
cir.setReturnValue(this.mfix$resolveFileOverride.findResource(paths));
|
|
||||||
}
|
|
||||||
|
|
||||||
private PackResourcesCacheEngine generateResourceCache() {
|
|
||||||
synchronized (this) {
|
|
||||||
PackResourcesCacheEngine engine = this.cacheEngine;
|
|
||||||
if(engine != null)
|
|
||||||
return engine;
|
|
||||||
this.cacheEngine = engine = new PackResourcesCacheEngine(this::getNamespacesFromDisk, (type, namespace) -> this.resolve(type.getDirectory(), namespace));
|
|
||||||
return engine;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void invalidateCache() {
|
|
||||||
this.cacheEngine = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "getNamespaces", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/resource/PathPackResources;getNamespacesFromDisk(Lnet/minecraft/server/packs/PackType;)Ljava/util/Set;"))
|
|
||||||
private Set<String> useCacheForNamespaces(PathPackResources instance, PackType type) {
|
|
||||||
PackResourcesCacheEngine engine = cacheEngine;
|
|
||||||
if(engine != null) {
|
|
||||||
Set<String> namespaces = engine.getNamespaces(type);
|
|
||||||
if(namespaces != null)
|
|
||||||
return namespaces;
|
|
||||||
}
|
|
||||||
return this.getNamespacesFromDisk(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Redirect(method = "getRootResource", at = @At(value = "INVOKE", target = "Ljava/nio/file/Files;exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z"))
|
|
||||||
private boolean useCacheForExistence(Path path, LinkOption[] options, String[] originalPaths) {
|
|
||||||
// the cache only stores things with a namespace and pack type
|
|
||||||
if(originalPaths.length < 3 || (!Objects.equals(originalPaths[0], "assets") && !Objects.equals(originalPaths[0], "data")))
|
|
||||||
return Files.exists(path, options);
|
|
||||||
else
|
|
||||||
return this.generateResourceCache().hasResource(originalPaths);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author embeddedt
|
|
||||||
* @reason Use cached listing of mod resources
|
|
||||||
*/
|
|
||||||
@Inject(method = "listResources", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void fastGetResources(PackType type, String namespace, String path, PackResources.ResourceOutput resourceOutput, CallbackInfo ci)
|
|
||||||
{
|
|
||||||
if(!PackTypeHelper.isVanillaPackType(type))
|
|
||||||
return;
|
|
||||||
ci.cancel();
|
|
||||||
Collection<ResourceLocation> allPossibleResources = this.generateResourceCache().getResources(type, namespace, path, Integer.MAX_VALUE, p -> true);
|
|
||||||
NewResourcePackAdapter.sendToOutput(location -> {
|
|
||||||
Path target = resolve(getPathFromLocation(location.getPath().startsWith("lang/") ? PackType.CLIENT_RESOURCES : type, location));
|
|
||||||
return () -> Files.newInputStream(target);
|
|
||||||
}, resourceOutput, allPossibleResources);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.packet;
|
|
||||||
|
|
||||||
public class NetworkUtils {
|
|
||||||
public static boolean isCurrentlyVanilla;
|
|
||||||
}
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.packet;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.network.NetworkEvent;
|
|
||||||
import net.minecraftforge.network.NetworkRegistry;
|
|
||||||
import net.minecraftforge.network.simple.SimpleChannel;
|
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.fml.DistExecutor;
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
import org.embeddedt.modernfix.ModernFixClient;
|
|
||||||
import org.embeddedt.modernfix.packet.EntityIDSyncPacket;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
public class PacketHandler {
|
|
||||||
private static final String PROTOCOL_VERSION = "1";
|
|
||||||
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
|
|
||||||
new ResourceLocation(ModernFix.MODID, "main"),
|
|
||||||
() -> PROTOCOL_VERSION,
|
|
||||||
NetworkRegistry.acceptMissingOr(PROTOCOL_VERSION),
|
|
||||||
NetworkRegistry.acceptMissingOr(PROTOCOL_VERSION)
|
|
||||||
);
|
|
||||||
|
|
||||||
public static void register() {
|
|
||||||
int id = 1;
|
|
||||||
INSTANCE.registerMessage(id++, EntityIDSyncPacket.class, EntityIDSyncPacket::serialize, EntityIDSyncPacket::deserialize, PacketHandler::handleSyncPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void handleSyncPacket(EntityIDSyncPacket packet, Supplier<NetworkEvent.Context> contextSupplier) {
|
|
||||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
|
|
||||||
contextSupplier.get().enqueueWork(() -> ModernFixClient.handleEntityIDSync(packet));
|
|
||||||
contextSupplier.get().setPacketHandled(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.registry;
|
|
||||||
|
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.core.Registry;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
|
|
||||||
public interface DelegateHolder<T> {
|
|
||||||
Holder.Reference<T> mfix$getDelegate(ResourceKey<Registry<T>> registryKey);
|
|
||||||
void mfix$setDelegate(ResourceKey<Registry<T>> registryKey, Holder.Reference<T> holder);
|
|
||||||
}
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.registry;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
|
||||||
import net.minecraftforge.registries.ObjectHolderRegistry;
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
public class ObjectHolderClearer {
|
|
||||||
/**
|
|
||||||
* Many of the built-in Forge holders needlessly hold on to an exception.
|
|
||||||
*/
|
|
||||||
public static void clearThrowables() {
|
|
||||||
Set<Consumer<Predicate<ResourceLocation>>> holders = ObfuscationReflectionHelper.getPrivateValue(ObjectHolderRegistry.class, null, "objectHolders");
|
|
||||||
if(holders != null) {
|
|
||||||
int numCleared = 0;
|
|
||||||
HashMap<Class<?>, Field> throwableField = new HashMap<>();
|
|
||||||
Throwable singletonThrowable = new Throwable("[This stacktrace was cleared to save memory]");
|
|
||||||
try {
|
|
||||||
for(Consumer<Predicate<ResourceLocation>> holder : holders) {
|
|
||||||
Field target = throwableField.computeIfAbsent(holder.getClass(), clz -> {
|
|
||||||
Field[] clzFields = clz.getDeclaredFields();
|
|
||||||
for(Field f : clzFields) {
|
|
||||||
if(Throwable.class.isAssignableFrom(f.getType())) {
|
|
||||||
f.setAccessible(true);
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
if(target != null) {
|
|
||||||
target.set(holder, singletonThrowable);
|
|
||||||
numCleared++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch(RuntimeException | ReflectiveOperationException | NoClassDefFoundError ignored) {
|
|
||||||
}
|
|
||||||
ModernFix.LOGGER.debug("Cleared " + numCleared + " object holder stacktrace references");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.rs;
|
|
||||||
|
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
|
||||||
|
|
||||||
public interface IFluidExternalStorageCache {
|
|
||||||
boolean initCache(IFluidHandler handler);
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.rs;
|
|
||||||
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
|
|
||||||
public interface IItemExternalStorageCache {
|
|
||||||
boolean initCache(IItemHandler handler);
|
|
||||||
}
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
package org.embeddedt.modernfix.forge.util;
|
|
||||||
|
|
||||||
import net.minecraftforge.eventbus.EventBus;
|
|
||||||
import net.minecraftforge.eventbus.api.EventListenerHelper;
|
|
||||||
import net.minecraftforge.fml.ModContainer;
|
|
||||||
import net.minecraftforge.fml.ModList;
|
|
||||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.ForkJoinPool;
|
|
||||||
import java.util.concurrent.ForkJoinWorkerThread;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
public class ModUtil {
|
|
||||||
private static final Set<Class<?>> erroredContexts = new HashSet<>();
|
|
||||||
private static boolean busListensToEvent(EventBus bus, Class<?> eventClazz) {
|
|
||||||
try {
|
|
||||||
int busID = ObfuscationReflectionHelper.getPrivateValue(EventBus.class, bus, "busID");
|
|
||||||
return EventListenerHelper.getListenerList(eventClazz).getListeners(busID).length > 0;
|
|
||||||
} catch(Exception e) {
|
|
||||||
ModernFix.LOGGER.error(e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static Collection<String> findAllModsListeningToEvent(Class<?> eventClazz) {
|
|
||||||
Set<String> modsListening = new HashSet<>();
|
|
||||||
ModList.get().forEachModContainer((modId, container) -> {
|
|
||||||
Supplier<?> languageExtensionSupplier = ObfuscationReflectionHelper.getPrivateValue(ModContainer.class, container, "contextExtension");
|
|
||||||
Object context = languageExtensionSupplier.get();
|
|
||||||
if(context == null)
|
|
||||||
return;
|
|
||||||
if(context instanceof FMLJavaModLoadingContext) {
|
|
||||||
if(busListensToEvent((EventBus)((FMLJavaModLoadingContext) context).getModEventBus(), eventClazz)) {
|
|
||||||
modsListening.add(modId);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
synchronized(erroredContexts) {
|
|
||||||
if(!erroredContexts.contains(context.getClass())) {
|
|
||||||
ModernFix.LOGGER.warn("Unknown modloading context: " + context.getClass().getName());
|
|
||||||
erroredContexts.add(context.getClass());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return modsListening;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final ClassLoader targetClassLoader = Thread.currentThread().getContextClassLoader();
|
|
||||||
|
|
||||||
private static class ModernFixForkJoinWorkerThread extends ForkJoinWorkerThread {
|
|
||||||
ModernFixForkJoinWorkerThread(ForkJoinPool pool) {
|
|
||||||
super(pool);
|
|
||||||
/* Ensure that the context class loader is set correctly */
|
|
||||||
this.setContextClassLoader(targetClassLoader);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ForkJoinPool commonPool = new ForkJoinPool(
|
|
||||||
ForkJoinPool.getCommonPoolParallelism(),
|
|
||||||
ModernFixForkJoinWorkerThread::new,
|
|
||||||
null,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -5,29 +5,29 @@ junit_version=5.10.0-M1
|
||||||
mixinextras_version=0.3.2
|
mixinextras_version=0.3.2
|
||||||
|
|
||||||
mod_id=modernfix
|
mod_id=modernfix
|
||||||
minecraft_version=1.20.1
|
minecraft_version=1.20.4
|
||||||
enabled_platforms=fabric,forge
|
enabled_platforms=fabric,neoforge
|
||||||
forge_version=1.20.1-47.1.3
|
forge_version=20.4.190
|
||||||
parchment_version=2023.07.09
|
# parchment_version=2023.07.09
|
||||||
refined_storage_version=4392788
|
refined_storage_version=4392788
|
||||||
jei_version=13.1.0.2
|
jei_version=16.0.0.28
|
||||||
rei_version=11.0.597
|
rei_version=13.0.678
|
||||||
ctm_version=1.20.1-1.1.8+4
|
ctm_version=1.20.1-1.1.8+4
|
||||||
kubejs_version=1902.6.0-build.142
|
kubejs_version=1902.6.0-build.142
|
||||||
rhino_version=1902.2.2-build.268
|
rhino_version=1902.2.2-build.268
|
||||||
supported_minecraft_versions=1.20.1
|
supported_minecraft_versions=1.20.4
|
||||||
|
|
||||||
fabric_loader_version=0.14.25
|
fabric_loader_version=0.15.1
|
||||||
fabric_api_version=0.86.0+1.20.1
|
fabric_api_version=0.91.1+1.20.4
|
||||||
|
|
||||||
continuity_version=3.0.0-beta.2+1.19.3
|
continuity_version=3.0.0-beta.4+1.20.2
|
||||||
|
|
||||||
modmenu_version=7.0.0-beta.2
|
modmenu_version=7.0.0-beta.2
|
||||||
diagonal_fences_version=4558828
|
diagonal_fences_version=4558828
|
||||||
|
|
||||||
spark_version=4587310
|
spark_version=4587310
|
||||||
|
|
||||||
use_fabric_api_at_runtime=true
|
use_fabric_api_at_runtime=false
|
||||||
|
|
||||||
# Look up maven coordinates when changing shadow_version
|
# Look up maven coordinates when changing shadow_version
|
||||||
shadow_version=7.1.2
|
shadow_version=7.1.2
|
||||||
|
|
|
||||||
|
|
@ -6,18 +6,7 @@ plugins {
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
platformSetupLoomIde()
|
platformSetupLoomIde()
|
||||||
forge()
|
neoForge()
|
||||||
}
|
|
||||||
|
|
||||||
loom {
|
|
||||||
forge {
|
|
||||||
convertAccessWideners = true
|
|
||||||
extraAccessWideners.add loom.accessWidenerPath.get().asFile.name
|
|
||||||
|
|
||||||
mixinConfig "modernfix-common.mixins.json"
|
|
||||||
mixinConfig "modernfix-forge.mixins.json"
|
|
||||||
}
|
|
||||||
mixin.defaultRefmapName = "modernfix.refmap.json"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
|
|
@ -41,12 +30,12 @@ repositories {
|
||||||
includeGroup "extra-mods"
|
includeGroup "extra-mods"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
maven { url "https://maven.neoforged.net" }
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
forge "net.minecraftforge:forge:${rootProject.forge_version}"
|
neoForge "net.neoforged:neoforge:${rootProject.forge_version}"
|
||||||
implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${rootProject.mixinextras_version}"))
|
|
||||||
implementation(include("io.github.llamalad7:mixinextras-forge:${rootProject.mixinextras_version}"))
|
|
||||||
// Remove the next line if you don't want to depend on the API
|
// Remove the next line if you don't want to depend on the API
|
||||||
// modApi "me.shedaniel:architectury-forge:${rootProject.architectury_version}"
|
// modApi "me.shedaniel:architectury-forge:${rootProject.architectury_version}"
|
||||||
|
|
||||||
|
|
@ -56,7 +45,7 @@ dependencies {
|
||||||
modCompileOnly("me.shedaniel:RoughlyEnoughItems-forge:${rei_version}") { transitive false }
|
modCompileOnly("me.shedaniel:RoughlyEnoughItems-forge:${rei_version}") { transitive false }
|
||||||
modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}")
|
modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}")
|
||||||
//modRuntimeOnly("curse.maven:ferritecore-429235:4441949")
|
//modRuntimeOnly("curse.maven:ferritecore-429235:4441949")
|
||||||
modCompileOnly("team.chisel.ctm:CTM:${ctm_version}")
|
modCompileOnly files("deps/ctm.jar")
|
||||||
|
|
||||||
modCompileOnly("curse.maven:supermartijncore-454372:4455391")
|
modCompileOnly("curse.maven:supermartijncore-454372:4455391")
|
||||||
modCompileOnly("vazkii.patchouli:Patchouli:1.19.2-77")
|
modCompileOnly("vazkii.patchouli:Patchouli:1.19.2-77")
|
||||||
|
|
@ -72,7 +61,7 @@ dependencies {
|
||||||
}
|
}
|
||||||
|
|
||||||
common(project(path: ":common", configuration: "namedElements")) { transitive false }
|
common(project(path: ":common", configuration: "namedElements")) { transitive false }
|
||||||
shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }
|
shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false }
|
||||||
shadowCommon(project(path: ":annotations"))
|
shadowCommon(project(path: ":annotations"))
|
||||||
forgeRuntimeLibrary(project(path: ":annotations"))
|
forgeRuntimeLibrary(project(path: ":annotations"))
|
||||||
}
|
}
|
||||||
|
|
@ -97,6 +86,7 @@ remapJar {
|
||||||
input.set shadowJar.archiveFile
|
input.set shadowJar.archiveFile
|
||||||
dependsOn shadowJar
|
dependsOn shadowJar
|
||||||
archiveClassifier.set(null)
|
archiveClassifier.set(null)
|
||||||
|
atAccessWideners.add "modernfix.accesswidener"
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
BIN
neoforge/deps/ctm.jar
Normal file
BIN
neoforge/deps/ctm.jar
Normal file
Binary file not shown.
1
neoforge/gradle.properties
Normal file
1
neoforge/gradle.properties
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
loom.platform=neoforge
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package org.embeddedt.modernfix.forge;
|
package org.embeddedt.modernfix.neoforge;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraftforge.common.ForgeConfigSpec;
|
import net.neoforged.neoforge.common.ModConfigSpec;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
@ -10,10 +10,10 @@ import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ModernFixConfig {
|
public class ModernFixConfig {
|
||||||
private static final ForgeConfigSpec.Builder COMMON_BUILDER = new ForgeConfigSpec.Builder();
|
private static final ModConfigSpec.Builder COMMON_BUILDER = new ModConfigSpec.Builder();
|
||||||
public static ForgeConfigSpec COMMON_CONFIG;
|
public static ModConfigSpec COMMON_CONFIG;
|
||||||
|
|
||||||
public static ForgeConfigSpec.ConfigValue<List<? extends String>> BLACKLIST_ASYNC_JEI_PLUGINS;
|
public static ModConfigSpec.ConfigValue<List<? extends String>> BLACKLIST_ASYNC_JEI_PLUGINS;
|
||||||
|
|
||||||
private static Set<ResourceLocation> jeiPluginBlacklist;
|
private static Set<ResourceLocation> jeiPluginBlacklist;
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.classloading;
|
package org.embeddedt.modernfix.neoforge.classloading;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sometimes mods have classes that circularly reference each other. If each of these classes ends up being loaded
|
* Sometimes mods have classes that circularly reference each other. If each of these classes ends up being loaded
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package org.embeddedt.modernfix.forge.classloading;
|
package org.embeddedt.modernfix.neoforge.classloading;
|
||||||
|
|
||||||
import com.google.common.collect.Interner;
|
import com.google.common.collect.Interner;
|
||||||
import com.google.common.collect.Interners;
|
import com.google.common.collect.Interners;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.neoforged.fml.ModList;
|
||||||
import net.minecraftforge.forgespi.language.ModFileScanData;
|
import net.neoforged.neoforgespi.language.ModFileScanData;
|
||||||
import net.minecraftforge.forgespi.locating.IModFile;
|
import net.neoforged.neoforgespi.locating.IModFile;
|
||||||
import org.objectweb.asm.Type;
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package org.embeddedt.modernfix.forge.config;
|
package org.embeddedt.modernfix.neoforge.config;
|
||||||
|
|
||||||
import net.minecraftforge.fml.ModContainer;
|
import net.neoforged.fml.ModContainer;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.neoforged.fml.ModList;
|
||||||
import net.minecraftforge.fml.config.IConfigEvent;
|
import net.neoforged.fml.config.IConfigEvent;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
||||||
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package org.embeddedt.modernfix.forge.config;
|
package org.embeddedt.modernfix.neoforge.config;
|
||||||
|
|
||||||
import com.electronwill.nightconfig.core.file.FileWatcher;
|
import com.electronwill.nightconfig.core.file.FileWatcher;
|
||||||
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
|
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
|
||||||
import net.minecraftforge.fml.loading.FMLLoader;
|
import net.neoforged.fml.loading.FMLLoader;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
||||||
import org.embeddedt.modernfix.util.CommonModUtil;
|
import org.embeddedt.modernfix.util.CommonModUtil;
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package org.embeddedt.modernfix.forge.config;
|
package org.embeddedt.modernfix.neoforge.config;
|
||||||
|
|
||||||
import com.electronwill.nightconfig.core.file.FileWatcher;
|
import com.electronwill.nightconfig.core.file.FileWatcher;
|
||||||
import com.google.common.collect.ForwardingCollection;
|
import com.google.common.collect.ForwardingCollection;
|
||||||
import com.google.common.collect.ForwardingMap;
|
import com.google.common.collect.ForwardingMap;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.datagen;
|
package org.embeddedt.modernfix.neoforge.datagen;
|
||||||
|
|
||||||
import net.minecraft.Util;
|
import net.minecraft.Util;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
|
@ -10,15 +10,15 @@ import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.server.packs.PackResources;
|
import net.minecraft.server.packs.PackResources;
|
||||||
import net.minecraft.server.packs.PackType;
|
import net.minecraft.server.packs.PackType;
|
||||||
import net.minecraft.server.packs.resources.MultiPackResourceManager;
|
import net.minecraft.server.packs.resources.MultiPackResourceManager;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.neoforged.api.distmarker.Dist;
|
||||||
import net.minecraftforge.client.event.ScreenEvent;
|
import net.neoforged.bus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.common.data.ExistingFileHelper;
|
import net.neoforged.fml.ModLoader;
|
||||||
import net.minecraftforge.data.event.GatherDataEvent;
|
import net.neoforged.fml.common.Mod;
|
||||||
import net.minecraftforge.data.loading.DatagenModLoader;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.neoforged.neoforge.client.event.ScreenEvent;
|
||||||
import net.minecraftforge.fml.ModLoader;
|
import net.neoforged.neoforge.common.data.ExistingFileHelper;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.neoforged.neoforge.data.event.GatherDataEvent;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.neoforge.data.loading.DatagenModLoader;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.dynresources;
|
package org.embeddedt.modernfix.neoforge.dynresources;
|
||||||
|
|
||||||
public interface IModelBakerImpl {
|
public interface IModelBakerImpl {
|
||||||
void mfix$ignoreCache();
|
void mfix$ignoreCache();
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.dynresources;
|
package org.embeddedt.modernfix.neoforge.dynresources;
|
||||||
|
|
||||||
import com.google.common.collect.ForwardingMap;
|
import com.google.common.collect.ForwardingMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
@ -9,24 +9,17 @@ import net.minecraft.client.renderer.block.BlockModelShaper;
|
||||||
import net.minecraft.client.resources.model.BakedModel;
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
import net.minecraft.client.resources.model.ModelBakery;
|
import net.minecraft.client.resources.model.ModelBakery;
|
||||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||||
|
import net.minecraft.core.registries.BuiltInRegistries;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraftforge.fml.ModContainer;
|
import net.neoforged.fml.ModContainer;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.neoforged.fml.ModList;
|
||||||
import net.minecraftforge.forgespi.language.IModInfo;
|
import net.neoforged.neoforgespi.language.IModInfo;
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.util.ForwardingInclDefaultsMap;
|
import org.embeddedt.modernfix.util.ForwardingInclDefaultsMap;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -48,13 +41,13 @@ public class ModelBakeEventHelper {
|
||||||
this.modelRegistry = modelRegistry;
|
this.modelRegistry = modelRegistry;
|
||||||
this.topLevelModelLocations = new HashSet<>(modelRegistry.keySet());
|
this.topLevelModelLocations = new HashSet<>(modelRegistry.keySet());
|
||||||
// Skip going through ModelLocationCache because most of the accesses will be misses
|
// Skip going through ModelLocationCache because most of the accesses will be misses
|
||||||
ForgeRegistries.BLOCKS.getEntries().forEach(entry -> {
|
BuiltInRegistries.BLOCK.entrySet().forEach(entry -> {
|
||||||
var location = entry.getKey().location();
|
var location = entry.getKey().location();
|
||||||
for(BlockState state : entry.getValue().getStateDefinition().getPossibleStates()) {
|
for(BlockState state : entry.getValue().getStateDefinition().getPossibleStates()) {
|
||||||
topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(location, state));
|
topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(location, state));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ForgeRegistries.ITEMS.getKeys().forEach(key -> topLevelModelLocations.add(new ModelResourceLocation(key, "inventory")));
|
BuiltInRegistries.ITEM.keySet().forEach(location -> topLevelModelLocations.add(new ModelResourceLocation(location, "inventory")));
|
||||||
this.dependencyGraph = GraphBuilder.undirected().build();
|
this.dependencyGraph = GraphBuilder.undirected().build();
|
||||||
ModList.get().forEachModContainer((id, mc) -> {
|
ModList.get().forEachModContainer((id, mc) -> {
|
||||||
this.dependencyGraph.addNode(id);
|
this.dependencyGraph.addNode(id);
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.init;
|
package org.embeddedt.modernfix.neoforge.init;
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.InputConstants;
|
import com.mojang.blaze3d.platform.InputConstants;
|
||||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
|
|
@ -6,26 +6,26 @@ import net.minecraft.client.KeyMapping;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.components.DebugScreenOverlay;
|
import net.minecraft.client.gui.components.DebugScreenOverlay;
|
||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
import net.minecraftforge.client.ConfigScreenHandler;
|
import net.neoforged.bus.api.EventPriority;
|
||||||
import net.minecraftforge.client.event.CustomizeGuiOverlayEvent;
|
import net.neoforged.bus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.client.event.RecipesUpdatedEvent;
|
import net.neoforged.fml.ModLoader;
|
||||||
import net.minecraftforge.client.event.RegisterClientCommandsEvent;
|
import net.neoforged.fml.ModLoadingContext;
|
||||||
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
|
import net.neoforged.fml.ModLoadingStage;
|
||||||
import net.minecraftforge.client.gui.overlay.ForgeGui;
|
import net.neoforged.fml.ModLoadingWarning;
|
||||||
import net.minecraftforge.client.settings.KeyConflictContext;
|
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
|
||||||
import net.minecraftforge.event.TagsUpdatedEvent;
|
import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||||
import net.minecraftforge.event.TickEvent;
|
import net.neoforged.neoforge.client.ConfigScreenHandler;
|
||||||
import net.minecraftforge.event.level.LevelEvent;
|
import net.neoforged.neoforge.client.event.CustomizeGuiOverlayEvent;
|
||||||
import net.minecraftforge.event.server.ServerStartedEvent;
|
import net.neoforged.neoforge.client.event.RecipesUpdatedEvent;
|
||||||
import net.minecraftforge.eventbus.api.EventPriority;
|
import net.neoforged.neoforge.client.event.RegisterClientCommandsEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent;
|
||||||
import net.minecraftforge.fml.*;
|
import net.neoforged.neoforge.client.settings.KeyConflictContext;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
import net.neoforged.neoforge.event.TagsUpdatedEvent;
|
||||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
import net.neoforged.neoforge.event.TickEvent;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.neoforge.event.level.LevelEvent;
|
||||||
|
import net.neoforged.neoforge.event.server.ServerStartedEvent;
|
||||||
import org.embeddedt.modernfix.ModernFixClient;
|
import org.embeddedt.modernfix.ModernFixClient;
|
||||||
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
import org.embeddedt.modernfix.neoforge.config.NightConfigFixer;
|
||||||
import org.embeddedt.modernfix.forge.config.NightConfigFixer;
|
|
||||||
import org.embeddedt.modernfix.screen.ModernFixConfigScreen;
|
import org.embeddedt.modernfix.screen.ModernFixConfigScreen;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -52,8 +52,7 @@ public class ModernFixClientForge {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onClientSetup(FMLClientSetupEvent event) {
|
private void onClientSetup(FMLClientSetupEvent event) {
|
||||||
if(false && ModernFixMixinPlugin.instance.isOptionEnabled("perf.dynamic_resources.ConnectednessCheck")
|
if(false) {
|
||||||
&& ModList.get().isLoaded("connectedness")) {
|
|
||||||
event.enqueueWork(() -> {
|
event.enqueueWork(() -> {
|
||||||
ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.SIDED_SETUP, "modernfix.connectedness_dynresoruces"));
|
ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.SIDED_SETUP, "modernfix.connectedness_dynresoruces"));
|
||||||
});
|
});
|
||||||
|
|
@ -80,7 +79,7 @@ public class ModernFixClientForge {
|
||||||
|
|
||||||
@SubscribeEvent(priority = EventPriority.HIGHEST)
|
@SubscribeEvent(priority = EventPriority.HIGHEST)
|
||||||
public void onRenderOverlay(CustomizeGuiOverlayEvent.DebugText event) {
|
public void onRenderOverlay(CustomizeGuiOverlayEvent.DebugText event) {
|
||||||
if(commonMod.brandingString != null && Minecraft.getInstance().options.renderDebug) {
|
if(commonMod.brandingString != null && Minecraft.getInstance().getDebugOverlay().showDebugScreen()) {
|
||||||
if(brandingList.size() == 0) {
|
if(brandingList.size() == 0) {
|
||||||
brandingList.add("");
|
brandingList.add("");
|
||||||
brandingList.add(commonMod.brandingString);
|
brandingList.add(commonMod.brandingString);
|
||||||
|
|
@ -103,10 +102,8 @@ public class ModernFixClientForge {
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onDisconnect(LevelEvent.Unload event) {
|
public void onDisconnect(LevelEvent.Unload event) {
|
||||||
if(event.getLevel().isClientSide()) {
|
if(event.getLevel().isClientSide()) {
|
||||||
DebugScreenOverlay overlay = ObfuscationReflectionHelper.getPrivateValue(ForgeGui.class, (ForgeGui)Minecraft.getInstance().gui, "debugOverlay");
|
DebugScreenOverlay overlay = Minecraft.getInstance().getDebugOverlay();
|
||||||
if(overlay != null) {
|
Minecraft.getInstance().tell(overlay::clearChunkCache);
|
||||||
Minecraft.getInstance().tell(overlay::clearChunkCache);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,39 +1,36 @@
|
||||||
package org.embeddedt.modernfix.forge.init;
|
package org.embeddedt.modernfix.neoforge.init;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
import net.minecraft.commands.CommandSourceStack;
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.neoforged.api.distmarker.Dist;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.neoforged.bus.api.EventPriority;
|
||||||
import net.minecraftforge.event.OnDatapackSyncEvent;
|
import net.neoforged.bus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.event.RegisterCommandsEvent;
|
import net.neoforged.fml.*;
|
||||||
import net.minecraftforge.event.server.ServerStartedEvent;
|
import net.neoforged.fml.common.Mod;
|
||||||
import net.minecraftforge.event.server.ServerStoppedEvent;
|
import net.neoforged.fml.config.ModConfig;
|
||||||
import net.minecraftforge.eventbus.api.EventPriority;
|
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||||
import net.minecraftforge.fml.*;
|
import net.neoforged.fml.loading.FMLLoader;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.neoforged.neoforge.common.NeoForge;
|
||||||
import net.minecraftforge.fml.config.ModConfig;
|
import net.neoforged.neoforge.event.OnDatapackSyncEvent;
|
||||||
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
|
import net.neoforged.neoforge.event.RegisterCommandsEvent;
|
||||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
import net.neoforged.neoforge.event.server.ServerStartedEvent;
|
||||||
import net.minecraftforge.fml.loading.FMLLoader;
|
import net.neoforged.neoforge.event.server.ServerStoppedEvent;
|
||||||
import net.minecraftforge.network.NetworkConstants;
|
import net.neoforged.neoforge.registries.RegisterEvent;
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
import net.neoforged.neoforge.server.ServerLifecycleHooks;
|
||||||
import net.minecraftforge.registries.RegisterEvent;
|
|
||||||
import net.minecraftforge.server.ServerLifecycleHooks;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
||||||
import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler;
|
import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler;
|
||||||
import org.embeddedt.modernfix.forge.ModernFixConfig;
|
import org.embeddedt.modernfix.neoforge.ModernFixConfig;
|
||||||
import org.embeddedt.modernfix.forge.classloading.ClassLoadHack;
|
import org.embeddedt.modernfix.neoforge.classloading.ClassLoadHack;
|
||||||
import org.embeddedt.modernfix.forge.classloading.ModFileScanDataDeduplicator;
|
import org.embeddedt.modernfix.neoforge.classloading.ModFileScanDataDeduplicator;
|
||||||
import org.embeddedt.modernfix.forge.config.ConfigFixer;
|
import org.embeddedt.modernfix.neoforge.config.NightConfigFixer;
|
||||||
import org.embeddedt.modernfix.forge.config.NightConfigFixer;
|
import org.embeddedt.modernfix.neoforge.packet.PacketHandler;
|
||||||
import org.embeddedt.modernfix.forge.packet.PacketHandler;
|
|
||||||
import org.embeddedt.modernfix.forge.registry.ObjectHolderClearer;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -45,16 +42,16 @@ public class ModernFixForge {
|
||||||
public ModernFixForge() {
|
public ModernFixForge() {
|
||||||
commonMod = new ModernFix();
|
commonMod = new ModernFix();
|
||||||
// Register ourselves for server and other game events we are interested in
|
// Register ourselves for server and other game events we are interested in
|
||||||
MinecraftForge.EVENT_BUS.register(this);
|
NeoForge.EVENT_BUS.register(this);
|
||||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonSetup);
|
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonSetup);
|
||||||
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerItems);
|
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerItems);
|
||||||
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> MinecraftForge.EVENT_BUS.register(new ModernFixClientForge()));
|
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> NeoForge.EVENT_BUS.register(new ModernFixClientForge()));
|
||||||
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true));
|
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> IExtensionPoint.DisplayTest.IGNORESERVERONLY, (a, b) -> true));
|
||||||
ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModernFixConfig.COMMON_CONFIG);
|
ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModernFixConfig.COMMON_CONFIG);
|
||||||
PacketHandler.register();
|
PacketHandler.register();
|
||||||
ModFileScanDataDeduplicator.deduplicate();
|
ModFileScanDataDeduplicator.deduplicate();
|
||||||
ClassLoadHack.loadModClasses();
|
ClassLoadHack.loadModClasses();
|
||||||
ConfigFixer.replaceConfigHandlers();
|
//ConfigFixer.replaceConfigHandlers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
|
@ -80,7 +77,7 @@ public class ModernFixForge {
|
||||||
|
|
||||||
private void registerItems(RegisterEvent event) {
|
private void registerItems(RegisterEvent event) {
|
||||||
if(Boolean.getBoolean("modernfix.largeRegistryTest")) {
|
if(Boolean.getBoolean("modernfix.largeRegistryTest")) {
|
||||||
event.register(ForgeRegistries.Keys.ITEMS, helper -> {
|
event.register(Registries.ITEM, helper -> {
|
||||||
Item.Properties props = new Item.Properties();
|
Item.Properties props = new Item.Properties();
|
||||||
for(int i = 0; i < 1000000; i++) {
|
for(int i = 0; i < 1000000; i++) {
|
||||||
helper.register(new ResourceLocation("modernfix", "item_" + i), new Item(props));
|
helper.register(new ResourceLocation("modernfix", "item_" + i), new Item(props));
|
||||||
|
|
@ -93,7 +90,6 @@ public class ModernFixForge {
|
||||||
Pair.of(ImmutableList.of("ferritecore"), "modernfix.no_ferritecore")
|
Pair.of(ImmutableList.of("ferritecore"), "modernfix.no_ferritecore")
|
||||||
);
|
);
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public void commonSetup(FMLCommonSetupEvent event) {
|
public void commonSetup(FMLCommonSetupEvent event) {
|
||||||
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.warn_missing_perf_mods.Warnings")) {
|
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.warn_missing_perf_mods.Warnings")) {
|
||||||
event.enqueueWork(() -> {
|
event.enqueueWork(() -> {
|
||||||
|
|
@ -109,8 +105,8 @@ public class ModernFixForge {
|
||||||
ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, "modernfix.perf_mod_warning"));
|
ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, "modernfix.perf_mod_warning"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
ObjectHolderClearer.clearThrowables();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent(priority = EventPriority.LOWEST)
|
@SubscribeEvent(priority = EventPriority.LOWEST)
|
||||||
public void onServerDead(ServerStoppedEvent event) {
|
public void onServerDead(ServerStoppedEvent event) {
|
||||||
commonMod.onServerDead(event.getServer());
|
commonMod.onServerDead(event.getServer());
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package org.embeddedt.modernfix.forge.load;
|
package org.embeddedt.modernfix.neoforge.load;
|
||||||
|
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.neoforged.fml.ModList;
|
||||||
import net.minecraftforge.forgespi.language.IModFileInfo;
|
import net.neoforged.neoforgespi.language.IModFileInfo;
|
||||||
import net.minecraftforge.forgespi.locating.IModFile;
|
import net.neoforged.neoforgespi.locating.IModFile;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.chunk_deadlock;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.chunk_deadlock;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
import net.minecraft.server.level.ChunkHolder;
|
import net.minecraft.server.level.ChunkHolder;
|
||||||
import net.minecraft.server.level.ChunkMap;
|
import net.minecraft.server.level.ChunkMap;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.chunk_deadlock;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.chunk_deadlock;
|
||||||
|
|
||||||
import net.minecraft.server.level.ChunkHolder;
|
import net.minecraft.server.level.ChunkHolder;
|
||||||
import net.minecraft.server.level.ServerChunkCache;
|
import net.minecraft.server.level.ServerChunkCache;
|
||||||
|
|
@ -6,7 +6,7 @@ import net.minecraft.world.level.ChunkPos;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.ChunkStatus;
|
import net.minecraft.world.level.chunk.ChunkStatus;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.cofh_core_crash;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.cofh_core_crash;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import org.embeddedt.modernfix.annotation.RequiresMod;
|
import org.embeddedt.modernfix.annotation.RequiresMod;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.ctm_resourceutil_cme;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.ctm_resourceutil_cme;
|
||||||
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.embeddedt.modernfix.annotation.RequiresMod;
|
import org.embeddedt.modernfix.annotation.RequiresMod;
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.entity_pose_stack;
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
|
||||||
import net.minecraftforge.client.event.RenderLivingEvent;
|
import net.neoforged.neoforge.client.event.RenderLivingEvent;
|
||||||
import net.minecraftforge.eventbus.api.Event;
|
import net.neoforged.bus.api.Event;
|
||||||
import net.minecraftforge.eventbus.api.IEventBus;
|
import net.neoforged.bus.api.IEventBus;
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
@ -13,18 +13,17 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@Mixin(LivingEntityRenderer.class)
|
@Mixin(LivingEntityRenderer.class)
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public class LivingEntityRendererMixin {
|
public class LivingEntityRendererMixin {
|
||||||
@Redirect(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0))
|
@Redirect(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;", ordinal = 0))
|
||||||
private boolean fireCheckingPoseStack(IEventBus instance, Event event) {
|
private Event fireCheckingPoseStack(IEventBus instance, Event event) {
|
||||||
PoseStack stack = ((RenderLivingEvent)event).getPoseStack();
|
PoseStack stack = ((RenderLivingEvent)event).getPoseStack();
|
||||||
int size = ((PoseStackAccessor)stack).getPoseStack().size();
|
int size = ((PoseStackAccessor)stack).getPoseStack().size();
|
||||||
if (instance.post(event)) {
|
instance.post(event);
|
||||||
|
if (((RenderLivingEvent.Pre)event).isCanceled()) {
|
||||||
// Pop the stack if someone pushed it in the event
|
// Pop the stack if someone pushed it in the event
|
||||||
while (((PoseStackAccessor)stack).getPoseStack().size() > size) {
|
while (((PoseStackAccessor)stack).getPoseStack().size() > size) {
|
||||||
stack.popPose();
|
stack.popPose();
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return event;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.entity_pose_stack;
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
||||||
import net.minecraftforge.client.event.RenderPlayerEvent;
|
import net.neoforged.bus.api.Event;
|
||||||
import net.minecraftforge.eventbus.api.Event;
|
import net.neoforged.bus.api.IEventBus;
|
||||||
import net.minecraftforge.eventbus.api.IEventBus;
|
import net.neoforged.neoforge.client.event.RenderPlayerEvent;
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
@ -13,18 +13,17 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
@Mixin(PlayerRenderer.class)
|
@Mixin(PlayerRenderer.class)
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public class PlayerRendererMixin {
|
public class PlayerRendererMixin {
|
||||||
@Redirect(method = "render(Lnet/minecraft/client/player/AbstractClientPlayer;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0))
|
@Redirect(method = "render(Lnet/minecraft/client/player/AbstractClientPlayer;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;", ordinal = 0))
|
||||||
private boolean fireCheckingPoseStack(IEventBus instance, Event event) {
|
private Event fireCheckingPoseStack(IEventBus instance, Event event) {
|
||||||
PoseStack stack = ((RenderPlayerEvent)event).getPoseStack();
|
PoseStack stack = ((RenderPlayerEvent)event).getPoseStack();
|
||||||
int size = ((PoseStackAccessor)stack).getPoseStack().size();
|
int size = ((PoseStackAccessor)stack).getPoseStack().size();
|
||||||
if (instance.post(event)) {
|
instance.post(event);
|
||||||
|
if (((RenderPlayerEvent.Pre)event).isCanceled()) {
|
||||||
// Pop the stack if someone pushed it in the event
|
// Pop the stack if someone pushed it in the event
|
||||||
while (((PoseStackAccessor)stack).getPoseStack().size() > size) {
|
while (((PoseStackAccessor)stack).getPoseStack().size() > size) {
|
||||||
stack.popPose();
|
stack.popPose();
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return event;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.entity_pose_stack;
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.extra_experimental_screen;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.extra_experimental_screen;
|
||||||
|
|
||||||
import com.mojang.serialization.Lifecycle;
|
import com.mojang.serialization.Lifecycle;
|
||||||
import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen;
|
import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen;
|
||||||
|
|
@ -1,15 +1,9 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.recipe_book_type_desync;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.recipe_book_type_desync;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
|
||||||
import net.minecraft.stats.RecipeBookSettings;
|
import net.minecraft.stats.RecipeBookSettings;
|
||||||
import net.minecraft.world.inventory.RecipeBookType;
|
import net.minecraft.world.inventory.RecipeBookType;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.embeddedt.modernfix.forge.packet.NetworkUtils;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
|
|
@ -36,12 +30,14 @@ public class RecipeBookSettingsMixin {
|
||||||
}
|
}
|
||||||
mfix$maxVanillaOrdinal = ord;
|
mfix$maxVanillaOrdinal = ord;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
@Redirect(method = "read(Lnet/minecraft/network/FriendlyByteBuf;)Lnet/minecraft/stats/RecipeBookSettings;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/FriendlyByteBuf;readBoolean()Z"))
|
@Redirect(method = "read(Lnet/minecraft/network/FriendlyByteBuf;)Lnet/minecraft/stats/RecipeBookSettings;", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/FriendlyByteBuf;readBoolean()Z"))
|
||||||
private static boolean useDefaultBooleanIfVanilla(FriendlyByteBuf buf, @Local(ordinal = 0) RecipeBookType type) {
|
private static boolean useDefaultBooleanIfVanilla(FriendlyByteBuf buf, @Local(ordinal = 0) RecipeBookType type) {
|
||||||
if(type.ordinal() >= (mfix$maxVanillaOrdinal + 1) && NetworkUtils.isCurrentlyVanilla) {
|
if(type.ordinal() >= (mfix$maxVanillaOrdinal + 1)) {
|
||||||
ModernFix.LOGGER.warn("Not reading recipe book data for type '{}' as we are using vanilla connection", type.name());
|
ModernFix.LOGGER.warn("Not reading recipe book data for type '{}' as we are using vanilla connection", type.name());
|
||||||
return false; // skip actually reading buffer
|
return false; // skip actually reading buffer
|
||||||
}
|
}
|
||||||
return buf.readBoolean();
|
return buf.readBoolean();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.unsafe_modded_shape_caches;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.unsafe_modded_shape_caches;
|
||||||
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.annotation.RequiresMod;
|
import org.embeddedt.modernfix.annotation.RequiresMod;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.bugfix.unsafe_modded_shape_caches;
|
package org.embeddedt.modernfix.neoforge.mixin.bugfix.unsafe_modded_shape_caches;
|
||||||
|
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.annotation.RequiresMod;
|
import org.embeddedt.modernfix.annotation.RequiresMod;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.core;
|
package org.embeddedt.modernfix.neoforge.mixin.core;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.client.renderer.RenderType;
|
||||||
import net.minecraft.server.Bootstrap;
|
import net.minecraft.server.Bootstrap;
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.core;
|
package org.embeddedt.modernfix.neoforge.mixin.core;
|
||||||
|
|
||||||
import net.minecraft.server.Bootstrap;
|
import net.minecraft.server.Bootstrap;
|
||||||
import net.minecraftforge.network.NetworkConstants;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.embeddedt.modernfix.forge.load.ModWorkManagerQueue;
|
|
||||||
import org.embeddedt.modernfix.util.TimeFormatter;
|
import org.embeddedt.modernfix.util.TimeFormatter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
@ -24,13 +22,6 @@ public class BootstrapMixin {
|
||||||
private static void doModernFixBootstrap(CallbackInfo ci) {
|
private static void doModernFixBootstrap(CallbackInfo ci) {
|
||||||
if(!isBootstrapped) {
|
if(!isBootstrapped) {
|
||||||
LOGGER.info("ModernFix reached bootstrap stage ({} after launch)", TimeFormatter.formatNanos(ManagementFactory.getRuntimeMXBean().getUptime() * 1000L * 1000L));
|
LOGGER.info("ModernFix reached bootstrap stage ({} after launch)", TimeFormatter.formatNanos(ManagementFactory.getRuntimeMXBean().getUptime() * 1000L * 1000L));
|
||||||
ModWorkManagerQueue.replace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */
|
|
||||||
@Inject(method = "bootStrap", at = @At("RETURN"))
|
|
||||||
private static void doClassloadHack(CallbackInfo ci) {
|
|
||||||
NetworkConstants.init();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.feature.branding;
|
package org.embeddedt.modernfix.neoforge.mixin.feature.branding;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import net.minecraftforge.internal.BrandingControl;
|
import net.neoforged.fml.ModContainer;
|
||||||
import net.minecraftforge.fml.ModContainer;
|
import net.neoforged.fml.ModList;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.neoforged.neoforge.internal.BrandingControl;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
|
@ -14,7 +14,7 @@ import java.util.Optional;
|
||||||
|
|
||||||
@Mixin(value = BrandingControl.class, remap = false, priority = 1100)
|
@Mixin(value = BrandingControl.class, remap = false, priority = 1100)
|
||||||
public class BrandingControlMixin {
|
public class BrandingControlMixin {
|
||||||
@Inject(method = "computeBranding", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/ModList;get()Lnet/minecraftforge/fml/ModList;"), locals = LocalCapture.CAPTURE_FAILHARD, require = 0)
|
@Inject(method = "computeBranding", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModList;get()Lnet/neoforged/fml/ModList;"), locals = LocalCapture.CAPTURE_FAILHARD, require = 0)
|
||||||
private static void addModernFixBranding(CallbackInfo ci, ImmutableList.Builder<String> builder) {
|
private static void addModernFixBranding(CallbackInfo ci, ImmutableList.Builder<String> builder) {
|
||||||
Optional<? extends ModContainer> mfContainer = ModList.get().getModContainerById("modernfix");
|
Optional<? extends ModContainer> mfContainer = ModList.get().getModContainerById("modernfix");
|
||||||
if(mfContainer.isPresent())
|
if(mfContainer.isPresent())
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.feature.measure_time;
|
package org.embeddedt.modernfix.neoforge.mixin.feature.measure_time;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import org.embeddedt.modernfix.ModernFixClient;
|
import org.embeddedt.modernfix.ModernFixClient;
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package org.embeddedt.modernfix.neoforge.mixin.feature.registry_event_progress;
|
||||||
|
|
||||||
|
import net.neoforged.bus.api.Event;
|
||||||
|
import net.neoforged.bus.api.EventPriority;
|
||||||
|
import net.neoforged.fml.ModList;
|
||||||
|
import net.neoforged.fml.ModLoader;
|
||||||
|
import net.neoforged.fml.ModLoadingContext;
|
||||||
|
import net.neoforged.fml.StartupMessageManager;
|
||||||
|
import net.neoforged.fml.event.IModBusEvent;
|
||||||
|
import net.neoforged.neoforge.registries.GameData;
|
||||||
|
import net.neoforged.neoforge.registries.RegisterEvent;
|
||||||
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
|
import org.embeddedt.modernfix.neoforge.util.AsyncLoadingScreen;
|
||||||
|
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.Redirect;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(value = GameData.class, remap = false)
|
||||||
|
@ClientOnlyMixin
|
||||||
|
public class GameDataMixin {
|
||||||
|
|
||||||
|
private static AsyncLoadingScreen mfix$asyncScreen;
|
||||||
|
|
||||||
|
@Inject(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", ordinal = 0))
|
||||||
|
private static void createAsyncScreen(CallbackInfo ci) {
|
||||||
|
mfix$asyncScreen = new AsyncLoadingScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Ljava/lang/RuntimeException;getSuppressed()[Ljava/lang/Throwable;", ordinal = 0))
|
||||||
|
private static void closeAsyncScreen(CallbackInfo ci) {
|
||||||
|
mfix$asyncScreen.close();
|
||||||
|
mfix$asyncScreen = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModLoader;postEventWrapContainerInModOrder(Lnet/neoforged/bus/api/Event;)V"))
|
||||||
|
private static <T extends Event & IModBusEvent> void swapThreadAndPost(ModLoader loader, T event) {
|
||||||
|
RegisterEvent registryEvent = (RegisterEvent)event;
|
||||||
|
// We control phases ourselves so we can make a separate progress bar for each phase.
|
||||||
|
String registryName = registryEvent.getRegistryKey().location().toString();
|
||||||
|
for(EventPriority phase : EventPriority.values()) {
|
||||||
|
var pb = StartupMessageManager.addProgressBar(registryName, ModList.get().size());
|
||||||
|
try {
|
||||||
|
ModList.get().forEachModInOrder(mc -> {
|
||||||
|
ModLoadingContext.get().setActiveContainer(mc);
|
||||||
|
pb.label(pb.name() + " - " + mc.getModInfo().getDisplayName());
|
||||||
|
pb.increment();
|
||||||
|
var bus = mc.getEventBus();
|
||||||
|
if(bus != null) {
|
||||||
|
bus.post(phase, event);
|
||||||
|
}
|
||||||
|
ModLoadingContext.get().setActiveContainer(null);
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
pb.complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.datapack_reload_exceptions;
|
package org.embeddedt.modernfix.neoforge.mixin.perf.datapack_reload_exceptions;
|
||||||
|
|
||||||
import net.minecraft.world.item.crafting.RecipeManager;
|
import net.minecraft.world.item.crafting.RecipeManager;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
package org.embeddedt.modernfix.neoforge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import net.minecraft.client.resources.model.BakedModel;
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraftforge.client.ForgeHooksClient;
|
import net.neoforged.bus.api.Event;
|
||||||
import net.minecraftforge.client.event.ModelEvent;
|
import net.neoforged.fml.ModContainer;
|
||||||
import net.minecraftforge.eventbus.api.Event;
|
import net.neoforged.fml.ModList;
|
||||||
import net.minecraftforge.fml.ModContainer;
|
import net.neoforged.fml.ModLoader;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
||||||
import net.minecraftforge.fml.ModLoader;
|
import net.neoforged.neoforge.client.ClientHooks;
|
||||||
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
|
import net.neoforged.neoforge.client.event.ModelEvent;
|
||||||
import org.embeddedt.modernfix.ModernFix;
|
import org.embeddedt.modernfix.ModernFix;
|
||||||
import org.embeddedt.modernfix.forge.dynresources.ModelBakeEventHelper;
|
import org.embeddedt.modernfix.neoforge.dynresources.ModelBakeEventHelper;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
|
|
@ -20,12 +20,12 @@ import java.lang.reflect.Method;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Mixin(ForgeHooksClient.class)
|
@Mixin(ClientHooks.class)
|
||||||
public class ForgeHooksClientMixin {
|
public class ForgeHooksClientMixin {
|
||||||
/**
|
/**
|
||||||
* Generate a more realistic keySet that contains every item and block model location, to help with mod compat.
|
* Generate a more realistic keySet that contains every item and block model location, to help with mod compat.
|
||||||
*/
|
*/
|
||||||
@Redirect(method = "onModifyBakingResult", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/ModLoader;postEvent(Lnet/minecraftforge/eventbus/api/Event;)V"), remap = false)
|
@Redirect(method = "onModifyBakingResult", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModLoader;postEvent(Lnet/neoforged/bus/api/Event;)V"), remap = false)
|
||||||
private static void postNamespacedKeySetEvent(ModLoader loader, Event event) {
|
private static void postNamespacedKeySetEvent(ModLoader loader, Event event) {
|
||||||
if(!ModLoader.isLoadingStateValid())
|
if(!ModLoader.isLoadingStateValid())
|
||||||
return;
|
return;
|
||||||
|
|
@ -34,7 +34,7 @@ public class ForgeHooksClientMixin {
|
||||||
Method acceptEv = ObfuscationReflectionHelper.findMethod(ModContainer.class, "acceptEvent", Event.class);
|
Method acceptEv = ObfuscationReflectionHelper.findMethod(ModContainer.class, "acceptEvent", Event.class);
|
||||||
ModList.get().forEachModContainer((id, mc) -> {
|
ModList.get().forEachModContainer((id, mc) -> {
|
||||||
Map<ResourceLocation, BakedModel> newRegistry = helper.wrapRegistry(id);
|
Map<ResourceLocation, BakedModel> newRegistry = helper.wrapRegistry(id);
|
||||||
ModelEvent.ModifyBakingResult postedEvent = new ModelEvent.ModifyBakingResult(newRegistry, bakeEvent.getModelBakery());
|
ModelEvent.ModifyBakingResult postedEvent = new ModelEvent.ModifyBakingResult(newRegistry, bakeEvent.getTextureGetter(), bakeEvent.getModelBakery());
|
||||||
Stopwatch timer = Stopwatch.createStarted();
|
Stopwatch timer = Stopwatch.createStarted();
|
||||||
try {
|
try {
|
||||||
acceptEv.invoke(mc, postedEvent);
|
acceptEv.invoke(mc, postedEvent);
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
package org.embeddedt.modernfix.neoforge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.ItemModelShaper;
|
import net.minecraft.client.renderer.ItemModelShaper;
|
||||||
import net.minecraft.client.resources.model.BakedModel;
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
import net.minecraft.client.resources.model.ModelManager;
|
import net.minecraft.client.resources.model.ModelManager;
|
||||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||||
import net.minecraft.core.Holder;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraftforge.client.model.ForgeItemModelShaper;
|
import net.neoforged.neoforge.client.model.RegistryAwareItemModelShaper;
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
|
||||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.embeddedt.modernfix.dynamicresources.DynamicModelCache;
|
import org.embeddedt.modernfix.dynamicresources.DynamicModelCache;
|
||||||
import org.embeddedt.modernfix.dynamicresources.ModelLocationCache;
|
import org.embeddedt.modernfix.dynamicresources.ModelLocationCache;
|
||||||
|
|
@ -21,14 +19,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Mixin(ForgeItemModelShaper.class)
|
@Mixin(RegistryAwareItemModelShaper.class)
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public abstract class ItemModelMesherForgeMixin extends ItemModelShaper {
|
public abstract class ItemModelMesherForgeMixin extends ItemModelShaper {
|
||||||
@Shadow(remap = false) @Final @Mutable private Map<Holder.Reference<Item>, ModelResourceLocation> locations;
|
@Shadow(remap = false) @Final @Mutable private Map<Item, ModelResourceLocation> locations;
|
||||||
|
|
||||||
private Map<Holder.Reference<Item>, ModelResourceLocation> overrideLocations;
|
private Map<Item, ModelResourceLocation> overrideLocations;
|
||||||
|
|
||||||
private final DynamicModelCache<Holder.Reference<Item>> mfix$modelCache = new DynamicModelCache<>(k -> this.mfix$getModelSlow((Holder.Reference<Item>)k), true);
|
private final DynamicModelCache<Item> mfix$modelCache = new DynamicModelCache<>(k -> this.mfix$getModelSlow((Item)k), true);
|
||||||
|
|
||||||
public ItemModelMesherForgeMixin(ModelManager arg) {
|
public ItemModelMesherForgeMixin(ModelManager arg) {
|
||||||
super(arg);
|
super(arg);
|
||||||
|
|
@ -44,16 +42,16 @@ public abstract class ItemModelMesherForgeMixin extends ItemModelShaper {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private ModelResourceLocation mfix$getLocationForge(Holder.Reference<Item> item) {
|
private ModelResourceLocation mfix$getLocationForge(Item item) {
|
||||||
ModelResourceLocation map = overrideLocations.getOrDefault(item, SENTINEL);
|
ModelResourceLocation map = overrideLocations.getOrDefault(item, SENTINEL);
|
||||||
if(map == SENTINEL) {
|
if(map == SENTINEL) {
|
||||||
/* generate the appropriate location from our cache */
|
/* generate the appropriate location from our cache */
|
||||||
map = ModelLocationCache.get(item.get());
|
map = ModelLocationCache.get(item);
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
private BakedModel mfix$getModelSlow(Holder.Reference<Item> key) {
|
private BakedModel mfix$getModelSlow(Item key) {
|
||||||
ModelResourceLocation map = mfix$getLocationForge(key);
|
ModelResourceLocation map = mfix$getLocationForge(key);
|
||||||
return map == null ? null : getModelManager().getModel(map);
|
return map == null ? null : getModelManager().getModel(map);
|
||||||
}
|
}
|
||||||
|
|
@ -66,7 +64,7 @@ public abstract class ItemModelMesherForgeMixin extends ItemModelShaper {
|
||||||
@Overwrite
|
@Overwrite
|
||||||
@Override
|
@Override
|
||||||
public BakedModel getItemModel(Item item) {
|
public BakedModel getItemModel(Item item) {
|
||||||
return this.mfix$modelCache.get(ForgeRegistries.ITEMS.getDelegateOrThrow(item));
|
return this.mfix$modelCache.get(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -77,7 +75,7 @@ public abstract class ItemModelMesherForgeMixin extends ItemModelShaper {
|
||||||
@Overwrite
|
@Overwrite
|
||||||
@Override
|
@Override
|
||||||
public void register(Item item, ModelResourceLocation location) {
|
public void register(Item item, ModelResourceLocation location) {
|
||||||
overrideLocations.put(ForgeRegistries.ITEMS.getDelegateOrThrow(item), location);
|
overrideLocations.put(item, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
package org.embeddedt.modernfix.neoforge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
package org.embeddedt.modernfix.neoforge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||||
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
|
@ -13,7 +13,7 @@ import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration;
|
||||||
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||||
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
|
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
|
||||||
import org.embeddedt.modernfix.dynamicresources.ModelMissingException;
|
import org.embeddedt.modernfix.dynamicresources.ModelMissingException;
|
||||||
import org.embeddedt.modernfix.forge.dynresources.IModelBakerImpl;
|
import org.embeddedt.modernfix.neoforge.dynresources.IModelBakerImpl;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
package org.embeddedt.modernfix.neoforge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
import com.google.common.cache.Cache;
|
import com.google.common.cache.Cache;
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user