diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 42fb63f..5fe15c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,5 +18,7 @@ jobs: java-version: 17 - name: Grant execute permission run: chmod +x ./gradlew + - name: Setup project + run: ./gradlew - name: Build with Gradle run: ./gradlew build diff --git a/build.gradle b/build.gradle index 1beb506..ddf74b2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'xyz.wagyourtail.unimined' version "1.3.9-SNAPSHOT" + id 'xyz.wagyourtail.unimined' version "1.4.1-SNAPSHOT" id 'maven-publish' } @@ -19,6 +19,8 @@ repositories { includeGroup "maven.modrinth" } } + unimined.ornitheMaven() + unimined.quiltMaven() maven { name = "Jitpack" @@ -26,18 +28,30 @@ repositories { } } +configurations { + ornitheImplementation +} + unimined.minecraft { version project.minecraft_version mappings { + calamus() searge() mcp(project.mcp_channel, "${project.mcp_version}-${project.minecraft_version}") + + devFallbackNamespace("searge") + devNamespace("mcp") } legacyFabric { loader project.loader_version accessWidener = file("src/main/resources/fabricated-rift.accesswidener") } + + mods.remap(configurations.ornitheImplementation) { + namespace("calamus") + } } dependencies { @@ -46,10 +60,24 @@ dependencies { implementation("com.github.thecatcore.CursedMixinExtensions:fabric:1.0.0") { exclude(module: 'fabric-loader') } - implementation("com.github.thecatcore:WFVAIO:1.1.0") { + implementation("com.github.thecatcore:WFVAIO:1.2.1") { exclude(module: 'fabric-loader') } implementation("net.legacyfabric.legacy-fabric-api:legacy-fabric-logger-api-v1:1.0.4+common+ae4aa0d092") + + if (file(".gradle/unimined/local/modTransform/core-0.6.0-mapped-mcp.jar").exists()) { + fabricApi.osl("1.13.2", "0.16.3").forEach { + modImplementation(ornitheImplementation(it)) + } + + modImplementation(ornitheImplementation("com.terraformersmc:modmenu:0.3.0+mc1.13.2")) + } else { + fabricApi.osl("1.13.2", "0.16.3").forEach { + ornitheImplementation(it) + } + + ornitheImplementation("com.terraformersmc:modmenu:0.3.0+mc1.13.2") + } } processResources { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23..df97d72 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/CompatibilityHelper.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/CompatibilityHelper.java new file mode 100644 index 0000000..2631174 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/CompatibilityHelper.java @@ -0,0 +1,31 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift; + +import io.github.fabriccompatibilitylayers.fabricatedrift.modmenu.ModMenuUtils; +import net.fabricmc.loader.api.FabricLoader; +import org.dimdev.riftloader.ModInfo; + +import java.util.Collection; +import java.util.Map; + +public class CompatibilityHelper { + public static void addToModList(Collection modInfos) { + if (FabricLoader.getInstance().isModLoaded("modmenu")) { + ModMenuUtils.addRiftMods(modInfos); + } + } + + public static void registerBuiltinMods(Map modInfos) { + if (FabricLoader.getInstance().isModLoaded("modmenu")) { + ModInfo info = new ModInfo(); + info.id = "riftmodlist"; + info.name = "Rift Mod List"; + info.authors.add("Danielshe"); + info.version = "2.1.0b"; + info.description = "Adds a mod list to your client."; + info.url = "https://modrinth.com/mod/rift-mod-list"; + info.source = modInfos.get("rift").source; + + modInfos.put(info.id, info); + } + } +} diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/FabricatedRift.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/FabricatedRift.java index b00ed0d..35e3d42 100644 --- a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/FabricatedRift.java +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/FabricatedRift.java @@ -37,6 +37,10 @@ public List getModDiscoverers() { @Override public List collectSubRemappers(List list) { + if (FabricLoader.getInstance().isModLoaded("modmenu")) { + list.removeIf(candidate -> "riftmodlist".equals(candidate.getId())); + } + return Collections.emptyList(); } @@ -70,7 +74,12 @@ public void addRemappingLibraries(List list, EnvType envType) { @Override public void registerAdditionalMappings(MappingBuilder mappingBuilder) { - + if (FabricLoader.getInstance().isModLoaded("modmenu")) { + mappingBuilder.addMapping("me/shedaniel/api/ConfigRegistry", "io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftModListConfigRegistry") + .method("registerConfig", "(Ljava/lang/String;Ljava/lang/Runnable;)V") + .method("unregisterConfig", "(Ljava/lang/String;)V") + .method("getConfigRunnable", "(Ljava/lang/String;)Ljava/util/Optional;"); + } } @Override diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/RiftCandidateCollector.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/RiftCandidateCollector.java index 5ce2162..0599134 100644 --- a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/RiftCandidateCollector.java +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/RiftCandidateCollector.java @@ -7,10 +7,7 @@ import java.io.IOException; import java.net.URI; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.file.*; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -58,7 +55,11 @@ public List collect(ModDiscovererConfig modDiscovererConfig, Path ZIP_PROPERTIES.put("encoding", "UTF-8"); } - private static FileSystem getJarFileSystem(Path path) throws IOException { - return FileSystems.newFileSystem(URI.create("jar:" + path.toUri()), ZIP_PROPERTIES); + public static FileSystem getJarFileSystem(Path path) throws IOException { + try { + return FileSystems.newFileSystem(URI.create("jar:" + path.toUri()), ZIP_PROPERTIES); + } catch (FileSystemAlreadyExistsException e) { + return FileSystems.getFileSystem(URI.create("jar:" + path.toUri())); + } } } diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/mixin/modmenu/FabricIconHandlerAccessor.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/mixin/modmenu/FabricIconHandlerAccessor.java new file mode 100644 index 0000000..bdc0f16 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/mixin/modmenu/FabricIconHandlerAccessor.java @@ -0,0 +1,18 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift.mixin.modmenu; + +import com.terraformersmc.modmenu.util.mod.fabric.FabricIconHandler; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.texture.DynamicTexture; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.nio.file.Path; +import java.util.Map; + +@Environment(EnvType.CLIENT) +@Mixin(value = FabricIconHandler.class, remap = false) +public interface FabricIconHandlerAccessor { + @Accessor(value = "modIconCache", remap = false) + Map getCache(); +} diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/FabricatedRiftModMenuCompat.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/FabricatedRiftModMenuCompat.java new file mode 100644 index 0000000..5ab1681 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/FabricatedRiftModMenuCompat.java @@ -0,0 +1,20 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift.modmenu; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; + +import java.util.HashMap; +import java.util.Map; + +public class FabricatedRiftModMenuCompat implements ModMenuApi { + @Override + public Map> getProvidedConfigScreenFactories() { + Map> factories = new HashMap<>(); + + for (Map.Entry entry : RiftModListConfigRegistry.modConfigRunnableMap.entrySet()) { + factories.put("rift_" + entry.getKey(), parent -> new FakeGuiScreen(parent, entry.getValue())); + } + + return factories; + } +} diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/FakeGuiScreen.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/FakeGuiScreen.java new file mode 100644 index 0000000..ce98319 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/FakeGuiScreen.java @@ -0,0 +1,22 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift.modmenu; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; + +public class FakeGuiScreen extends GuiScreen { + private final GuiScreen parent; + private final Runnable guiOpener; + + public FakeGuiScreen(GuiScreen parent, Runnable guiOpener) { + this.parent = parent; + this.guiOpener = guiOpener; + } + + @Override + public void setWorldAndResolution(Minecraft mc, int width, int height) { + super.setWorldAndResolution(mc, width, height); + + this.mc.displayGuiScreen(this.parent); + guiOpener.run(); + } +} diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/ModMenuUtils.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/ModMenuUtils.java new file mode 100644 index 0000000..c05ba22 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/ModMenuUtils.java @@ -0,0 +1,74 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift.modmenu; + +import com.terraformersmc.modmenu.ModMenu; +import com.terraformersmc.modmenu.util.mod.Mod; +import com.terraformersmc.modmenu.util.mod.fabric.FabricIconHandler; +import io.github.fabriccompatibilitylayers.fabricatedrift.RiftCandidateCollector; +import io.github.fabriccompatibilitylayers.fabricatedrift.mixin.modmenu.FabricIconHandlerAccessor; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.texture.NativeImage; +import org.apache.commons.lang3.Validate; +import org.dimdev.riftloader.ModInfo; + +import java.io.InputStream; +import java.nio.file.FileSystem; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Objects; + +public class ModMenuUtils { + public static DynamicTexture createIcon(FabricIconHandler handler, RiftMod info) { + try { + FabricIconHandlerAccessor accessor = (FabricIconHandlerAccessor) handler; + + Path iconPath = info.rootPath.resolve(info.modInfo.iconPath.replace("/", info.rootPath.getFileSystem().getSeparator())); + + if (!accessor.getCache().containsKey(iconPath)) { + try (FileSystem fs = RiftCandidateCollector.getJarFileSystem(info.modInfo.source.toPath())) { + InputStream inputStream = Files.newInputStream(fs.getPath("/" + info.modInfo.iconPath)); + + DynamicTexture var8; + try { + NativeImage image = NativeImage.read(Objects.requireNonNull(inputStream)); + Validate.validState(image.getWidth() == image.getHeight(), "Must be square icon"); + DynamicTexture tex = new DynamicTexture(image); + accessor.getCache().put(iconPath, tex); + var8 = tex; + } catch (Throwable var10) { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Throwable var9) { + var10.addSuppressed(var9); + } + } + + throw var10; + } + + if (inputStream != null) { + inputStream.close(); + } + + return var8; + } + } + + return accessor.getCache().get(iconPath); + } catch (Throwable t) { + t.printStackTrace(); + return null; + } + } + + public static void addRiftMods(Collection modInfos) { + for (ModInfo modInfo : modInfos) { + Mod mod = new RiftMod(modInfo); + + ModMenu.MODS.put(mod.getId(), mod); + } + + ModMenu.clearModCountCache(); + } +} diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftMod.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftMod.java new file mode 100644 index 0000000..c03152b --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftMod.java @@ -0,0 +1,188 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift.modmenu; + +import com.terraformersmc.modmenu.api.UpdateChecker; +import com.terraformersmc.modmenu.api.UpdateInfo; +import com.terraformersmc.modmenu.util.VersionUtil; +import com.terraformersmc.modmenu.util.mod.Mod; +import com.terraformersmc.modmenu.util.mod.fabric.FabricIconHandler; +import io.github.fabriccompatibilitylayers.fabricatedrift.RiftCandidateCollector; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.renderer.texture.DynamicTexture; +import org.dimdev.riftloader.ModInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.nio.file.FileSystem; +import java.nio.file.Path; +import java.util.*; + +public class RiftMod implements Mod { + public final ModInfo modInfo; + public final Path rootPath; + + public RiftMod(ModInfo modInfo) { + Path path; + this.modInfo = modInfo; + + try (FileSystem fs = RiftCandidateCollector.getJarFileSystem(modInfo.source.toPath())) { + path = fs.getRootDirectories().iterator().next(); + } catch (IOException e) { + path = null; + } + this.rootPath = path; + } + + @Override + public @NotNull String getId() { + return "rift_" + this.modInfo.id; + } + + @Override + public @NotNull String getName() { + return this.modInfo.name; + } + + @Override + public @NotNull DynamicTexture getIcon(FabricIconHandler fabricIconHandler, int i) { + DynamicTexture found = this.modInfo.iconPath != null ? ModMenuUtils.createIcon(fabricIconHandler, this) : null; + + if (found == null) { + return fabricIconHandler.createIcon(FabricLoader.getInstance().getModContainer("modmenu").orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Fabric mod with id modmenu")), "assets/modmenu/unknown_icon.png"); + } + + return found; + } + + @Override + public @NotNull String getDescription() { + return this.modInfo.description; + } + + @Override + public @NotNull String getVersion() { + return this.modInfo.version; + } + + @Override + public @NotNull String getPrefixedVersion() { + return VersionUtil.getPrefixedVersion(this.modInfo.version); + } + + @Override + public @NotNull List getAuthors() { + return this.modInfo.authors; + } + + @Override + public @NotNull Map> getContributors() { + return Collections.emptyMap(); + } + + @Override + public @NotNull SortedMap> getCredits() { + SortedMap> credits = new TreeMap<>(); + List authors = this.getAuthors(); + Map> contributors = new HashMap<>(); + + for(String author : authors) { + contributors.put(author, Collections.singletonList("Author")); + } + + for(Map.Entry> contributor : contributors.entrySet()) { + for(String role : contributor.getValue()) { + credits.computeIfAbsent(role, (key) -> new LinkedHashSet<>()); + credits.get(role).add((String)contributor.getKey()); + } + } + + return credits; + } + + @Override + public @NotNull Set getBadges() { + return Collections.emptySet(); + } + + @Override + public @Nullable String getWebsite() { + return this.modInfo.url; + } + + @Override + public @Nullable String getIssueTracker() { + return null; + } + + @Override + public @Nullable String getSource() { + return null; + } + + @Override + public @Nullable String getParent() { + String parent = null; + + if ((FabricLoader.getInstance().isModLoaded("modmenu") && modInfo.id.equals("riftmodlist")) || + modInfo.id.equals("rift")) { + parent = "fabricated-rift"; + } + + return parent; + } + + @Override + public @NotNull Set getLicense() { + return Collections.emptySet(); + } + + @Override + public @NotNull Map getLinks() { + return Collections.emptyMap(); + } + + @Override + public boolean isReal() { + return true; + } + + @Override + public boolean allowsUpdateChecks() { + return false; + } + + @Override + public @Nullable UpdateChecker getUpdateChecker() { + return null; + } + + @Override + public void setUpdateChecker(@Nullable UpdateChecker updateChecker) { + + } + + @Override + public @Nullable UpdateInfo getUpdateInfo() { + return null; + } + + @Override + public void setUpdateInfo(@Nullable UpdateInfo updateInfo) { + + } + + @Override + public void setChildHasUpdate() { + + } + + @Override + public boolean getChildHasUpdate() { + return false; + } + + @Override + public boolean isHidden() { + return false; + } +} diff --git a/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftModListConfigRegistry.java b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftModListConfigRegistry.java new file mode 100644 index 0000000..41c80a4 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibilitylayers/fabricatedrift/modmenu/RiftModListConfigRegistry.java @@ -0,0 +1,24 @@ +package io.github.fabriccompatibilitylayers.fabricatedrift.modmenu; + +import com.google.common.collect.Maps; + +import java.util.Map; +import java.util.Optional; + +public class RiftModListConfigRegistry { + protected static Map modConfigRunnableMap = Maps.newHashMap(); + + public static void registerConfig(String modid, Runnable runnable) { + modConfigRunnableMap.put(modid, runnable); + } + + public static void unregisterConfig(String modid) { + registerConfig(modid, null); + } + + public static Optional getConfigRunnable(String modid) { + if (modConfigRunnableMap.containsKey(modid)) + return Optional.ofNullable(modConfigRunnableMap.get(modid)); + return Optional.empty(); + } +} diff --git a/src/main/java/org/dimdev/riftloader/ModInfo.java b/src/main/java/org/dimdev/riftloader/ModInfo.java index 559d156..424e8f7 100644 --- a/src/main/java/org/dimdev/riftloader/ModInfo.java +++ b/src/main/java/org/dimdev/riftloader/ModInfo.java @@ -2,6 +2,8 @@ import com.google.gson.*; import com.google.gson.annotations.SerializedName; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.ArrayList; @@ -73,6 +75,28 @@ public class ModInfo { } } + if (object.has("version")) { + modInfo.version = object.get("version").getAsString(); + } else { + modInfo.version = "Unidentified"; + } + + if (object.has("url")) { + modInfo.url = object.get("url").getAsString(); + } else { + modInfo.url = "Unidentified"; + } + + if (object.has("description")) { + modInfo.description = object.get("description").getAsString(); + } else { + modInfo.description = "A mod for Rift."; + } + + if (object.has("icon_file")) { + modInfo.iconPath = object.get("icon_file").getAsString(); + } + return modInfo; }) .create(); @@ -93,4 +117,8 @@ public Listener(String className) { public String name; public List authors = new ArrayList<>(); public List listeners = new ArrayList<>(); + @ApiStatus.Internal + public String version, url, description; + @ApiStatus.Internal + public @Nullable String iconPath; } diff --git a/src/main/java/org/dimdev/riftloader/RiftLoader.java b/src/main/java/org/dimdev/riftloader/RiftLoader.java index 68cabad..4349d23 100644 --- a/src/main/java/org/dimdev/riftloader/RiftLoader.java +++ b/src/main/java/org/dimdev/riftloader/RiftLoader.java @@ -1,6 +1,7 @@ package org.dimdev.riftloader; import com.google.gson.JsonParseException; +import io.github.fabriccompatibilitylayers.fabricatedrift.CompatibilityHelper; import io.github.fabriccompatibilitylayers.modremappingapi.api.v2.CacheHandler; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer; import net.fabricmc.loader.api.FabricLoader; @@ -133,6 +134,8 @@ private void findMods(File modsDir) { } } + CompatibilityHelper.registerBuiltinMods(modInfoMap); + log.info("Loaded " + modInfoMap.size() + " mods"); } @@ -201,6 +204,8 @@ private void initMods() { } log.info("Done initializing mods"); + + CompatibilityHelper.addToModList(this.getMods()); } private static void addURLToClasspath(URL url) throws URISyntaxException { diff --git a/src/main/resources/assets/fabricated-rift/icon.png b/src/main/resources/assets/fabricated-rift/icon.png new file mode 100644 index 0000000..ed7c363 Binary files /dev/null and b/src/main/resources/assets/fabricated-rift/icon.png differ diff --git a/src/main/resources/assets/fabricated-rift/lang/en_us.json b/src/main/resources/assets/fabricated-rift/lang/en_us.json new file mode 100644 index 0000000..653119f --- /dev/null +++ b/src/main/resources/assets/fabricated-rift/lang/en_us.json @@ -0,0 +1,3 @@ +{ + "modmenu.descriptionTranslation.rift_rift": "Rift is a lightweight modding API, library, and mod loader for Minecraft 1.13. The main objective of Rift is to make a more modular and lightweight modding API for Minecraft. Rift is not intended to compete with or replace Forge, but rather Rift and a set of optional community-made library mods is." +} \ No newline at end of file diff --git a/src/main/resources/assets/fabricated-rift/lang/et_ee.json b/src/main/resources/assets/fabricated-rift/lang/et_ee.json new file mode 100644 index 0000000..492ea59 --- /dev/null +++ b/src/main/resources/assets/fabricated-rift/lang/et_ee.json @@ -0,0 +1,3 @@ +{ + "modmenu.descriptionTranslation.rift_rift": "Rift on kergekaaluline modifitseerimise API, teek ja modilaadija Minecraft 1.13-le. Rifti põhieesmärk on luua Minecraftile modulaarsem ja kergem modifitseerimise API. Rift ei ole mõeldud Forge'ga konkureerima või seda asendama, pigem teeb seda Rift koos valikuliste kogukonna poolt loodud teegi modidega." +} \ No newline at end of file diff --git a/src/main/resources/assets/fabricated-rift/lang/zh_cn.json b/src/main/resources/assets/fabricated-rift/lang/zh_cn.json new file mode 100644 index 0000000..5c8d341 --- /dev/null +++ b/src/main/resources/assets/fabricated-rift/lang/zh_cn.json @@ -0,0 +1,3 @@ +{ + "modmenu.descriptionTranslation.rift_rift": "Rift是Minecraft 1.13的一个轻量级模块编程接口、数据库和模块加载器。Rift的主要目标是为Minecraft制作更加模块化和轻量级的模块编程接口。Rift并不打算与Forge竞争或取代Forge,而是Rift和一组由小区制作而且可以选择的模块数据库。" +} \ No newline at end of file diff --git a/src/main/resources/assets/fabricated-rift/lang/zh_tw.json b/src/main/resources/assets/fabricated-rift/lang/zh_tw.json new file mode 100644 index 0000000..8d9aa10 --- /dev/null +++ b/src/main/resources/assets/fabricated-rift/lang/zh_tw.json @@ -0,0 +1,3 @@ +{ + "modmenu.descriptionTranslation.rift_rift": "Rift是Minecraft 1.13的一個輕量級模組編程介面、資料庫和模組載入器。Rift的主要目標是為Minecraft製作更加模塊化和輕量級的模組編程介面。Rift並不打算與Forge競爭或取代Forge,而是Rift和一組由社區製作而且可以選擇的模組資料庫。" +} \ No newline at end of file diff --git a/src/main/resources/assets/modid/icon.png b/src/main/resources/assets/modid/icon.png deleted file mode 100644 index 2fdb658..0000000 Binary files a/src/main/resources/assets/modid/icon.png and /dev/null differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3946ab5..90868c2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -8,11 +8,11 @@ "Cat Core" ], "contact": { - "homepage": "https://legacyfabric.net/", - "sources": "https://github.com/Legacy-Fabric/fabric-example-mod" + "homepage": "https://modrinth.com/mod/fabricated-rift", + "sources": "https://github.com/FabricCompatibilityLayers/Fabricated-Rift" }, "license": "MIT", - "icon": "assets/modid/icon.png", + "icon": "assets/fabricated-rift/icon.png", "environment": "*", "entrypoints": { "mod-remapper-api:modremapper_v2": [ @@ -20,14 +20,18 @@ ], "preLaunch": [ "io.github.fabriccompatibilitylayers.fabricatedrift.FabricatedRiftPreLaunch" + ], + "modmenu": [ + "io.github.fabriccompatibilitylayers.fabricatedrift.modmenu.FabricatedRiftModMenuCompat" ] }, "mixins": [ "mixins.rift.core.json", - "mixins.rift.hooks.json" + "mixins.rift.hooks.json", + "mixins.fabricated-rift.json" ], "depends": { - "fabricloader": ">=0.14.19", + "fabricloader": ">=0.15.10", "minecraft": "${mc_version}", "mod-remapping-api": ">=${mrapi_version}" } diff --git a/src/main/resources/mixins.fabricated-rift.json b/src/main/resources/mixins.fabricated-rift.json new file mode 100644 index 0000000..72f99e1 --- /dev/null +++ b/src/main/resources/mixins.fabricated-rift.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "package": "io.github.fabriccompatibilitylayers.fabricatedrift.mixin", + "mixins": [ + ], + "client": [ + "modmenu.FabricIconHandlerAccessor" + ], + "injectors": { + "defaultRequire": 1 + } +}