From 4da029729cc79305da6f89208e4526384b363b6f Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 22 May 2022 18:01:35 +0200 Subject: [PATCH 1/7] Add rudimentary support for modrinth publishing (#263) * Add rudimentary support for modrinth publishing Signed-off-by: Max * Reformat, disambiguate version number Signed-off-by: Max --- .github/workflows/1.18_push.yml | 3 ++- build.gradle | 11 +++++---- fabric/build.gradle | 29 ++++++++++++++++++++---- forge/build.gradle | 27 ++++++++++++++++++---- gradle.properties | 5 +++- gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 59 insertions(+), 18 deletions(-) diff --git a/.github/workflows/1.18_push.yml b/.github/workflows/1.18_push.yml index 49de097d..88c3f43f 100644 --- a/.github/workflows/1.18_push.yml +++ b/.github/workflows/1.18_push.yml @@ -71,5 +71,6 @@ jobs: # GIT_PREVIOUS_COMMIT: ${{ github.event.before }} MAVEN_PASS: ${{ secrets.MAVEN_PASS }} CURSE_API_KEY: ${{ secrets.CURSE_API_KEY }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} with: - arguments: publish curseforge --stacktrace --no-daemon + arguments: publish curseforge modrinth --stacktrace --no-daemon diff --git a/build.gradle b/build.gradle index 3e8abac5..048083d4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import java.text.SimpleDateFormat + buildscript { configurations.classpath { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' @@ -6,9 +8,10 @@ buildscript { plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "0.11.0-SNAPSHOT" apply false + id "dev.architectury.loom" version "0.12.0-SNAPSHOT" apply false id "org.cadixdev.licenser" version "0.6.1" id "com.matthewprenger.cursegradle" version "1.4.0" apply false + id "com.modrinth.minotaur" version "2.2.0" apply false id "maven-publish" } @@ -37,7 +40,7 @@ allprojects { apply plugin: "java" apply plugin: "architectury-plugin" apply plugin: "org.cadixdev.licenser" - + ext { isSnapshot = System.getenv("PR_NUM") != null } @@ -81,7 +84,7 @@ allprojects { ext { releaseChangelog = { - def dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm") + def dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm") dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")) def branch if (System.env.BRANCH_NAME) { @@ -115,5 +118,3 @@ allprojects { task licenseFormatAll subprojects { p -> licenseFormatAll.dependsOn("${p.path}:licenseFormat") } - -task curseforgePublish diff --git a/fabric/build.gradle b/fabric/build.gradle index a0032e09..b0c5bd60 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,6 +1,7 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.2" id "com.matthewprenger.cursegradle" + id "com.modrinth.minotaur" } loom { @@ -99,11 +100,12 @@ publishing { } curseforge { - if (project.hasProperty("CURSE_API_KEY") || System.getenv("CURSE_API_KEY") != null) { - apiKey = project.hasProperty("CURSE_API_KEY") ? project.property("CURSE_API_KEY") : System.getenv("CURSE_API_KEY") + var CURSE_API_KEY = project.findProperty("CURSE_API_KEY") ?: System.getenv("CURSE_API_KEY") + if (CURSE_API_KEY != null) { + apiKey = CURSE_API_KEY project { - id = "419699" - releaseType = "$rootProject.cf_type" + id = rootProject.curseforge_id + releaseType = "$rootProject.artifact_type" changelogType = "html" changelog = releaseChangelog() addGameVersion "1.18.2" @@ -127,4 +129,21 @@ curseforge { } } -rootProject.tasks.getByName("curseforgePublish").dependsOn tasks.getByName("curseforge") +modrinth { + var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") + if (MODRINTH_TOKEN != null) { + token = MODRINTH_TOKEN + projectId = rootProject.modrinth_id + versionType = "$rootProject.artifact_type" + versionNumber = "$project.version+$project.name" + versionName = "[Fabric $rootProject.supported_version] v$project.version" + changelog = releaseChangelog() + uploadFile = remapJar + gameVersions = ["1.18.2"] + loaders = ["fabric"] + dependencies { + // TODO: move to slugs if that functionality becomes available in minotaur + required.project("P7dR8mSH") // Fabric API + } + } +} diff --git a/forge/build.gradle b/forge/build.gradle index d91b4213..d2858bec 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,6 +1,7 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.2" id "com.matthewprenger.cursegradle" + id "com.modrinth.minotaur" } loom { @@ -112,11 +113,12 @@ publishing { } curseforge { - if (project.hasProperty("CURSE_API_KEY") || System.getenv("CURSE_API_KEY") != null) { - apiKey = project.hasProperty("CURSE_API_KEY") ? project.property("CURSE_API_KEY") : System.getenv("CURSE_API_KEY") + var CURSE_API_KEY = project.findProperty("CURSE_API_KEY") ?: System.getenv("CURSE_API_KEY") + if (CURSE_API_KEY != null) { + apiKey = CURSE_API_KEY project { - id = "419699" - releaseType = "$rootProject.cf_type" + id = rootProject.curseforge_id + releaseType = "$rootProject.artifact_type" changelogType = "html" changelog = releaseChangelog() addGameVersion "1.18.2" @@ -136,4 +138,19 @@ curseforge { } } -rootProject.tasks.getByName("curseforgePublish").dependsOn tasks.getByName("curseforge") +modrinth { + var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") + if (MODRINTH_TOKEN != null) { + token = MODRINTH_TOKEN + projectId = rootProject.modrinth_id + versionType = "$rootProject.artifact_type" + versionNumber = "$project.version+$project.name" + versionName = "[Forge $rootProject.supported_version] v$project.version" + changelog = releaseChangelog() + uploadFile = remapJar + gameVersions = ["1.18.2"] + loaders = ["forge"] + dependencies { + } + } +} diff --git a/gradle.properties b/gradle.properties index 5fee3f9d..e18df335 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ forgeEnabled=true minecraft_version=1.18.2 supported_version=1.18.2 -cf_type=release +artifact_type=release archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot @@ -18,3 +18,6 @@ fabric_api_version=0.50.0+1.18.2 mod_menu_version=3.0.0 forge_version=40.1.14 + +curseforge_id=419699 +modrinth_id=lhGA9TYQ \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 84d1f85f..aa991fce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 56c36e21627ab1f5add191160c97f6c72af2576a Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 22 May 2022 18:55:26 +0200 Subject: [PATCH 2/7] [ci skip] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bfe62716..d4faea59 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,14 @@ Architectury Plugin. ### Getting started with making multiplatform mods -Gradle Plugin: https://github.com/architectury/architectury-plugin +Architectury Loom: https://github.com/architectury/architectury-loom (a fork of Fabric Loom adding multiplatform development capabilities) +Gradle Plugin: https://github.com/architectury/architectury-plugin (includes Architectury Injectables, for the `@ExpectPlatform` annotation) +Example Mod: https://github.com/architectury/architectury-example-mod (a discontinued example mod using Architectury, if possible, use the templates instead) +Mod Templates: https://github.com/architectury/architectury-templates (a set of templates to get started using the Architectury toolchain) -Example Mod: https://github.com/architectury/architectury-example-mod +### Example: Usage of @ExpectPlatform +![Exmaple of the @ExpectPlatform annotation, part of Architectury Injectables](https://camo.githubusercontent.com/78c68766affb70fbd88f9806e0e95f78765ec339448d7102065f2942be2b3215/68747470733a2f2f6d656469612e646973636f72646170702e6e65742f6174746163686d656e74732f3538363138363230323738313138383130382f3737363432383831343330393738353632302f756e6b6e6f776e2e706e673f77696474683d31313931266865696768743d343339) ### Credits -This library bundles typetools, which you can find its -license [here](https://github.com/jhalterman/typetools/blob/master/LICENSE.txt "") +In certain older versions, this library used to bundle typetools; you can find its license [here](https://github.com/jhalterman/typetools/blob/master/LICENSE.txt "") From 7abfd95e7b9afb38582c04b61e3d272dfd919629 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 22 May 2022 19:49:23 +0200 Subject: [PATCH 3/7] Add quilt to list of supported loaders (thanks to @wafflecoffee for confirming!) [ci skip] Signed-off-by: Max --- fabric/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index b0c5bd60..9c67c1dd 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -140,7 +140,7 @@ modrinth { changelog = releaseChangelog() uploadFile = remapJar gameVersions = ["1.18.2"] - loaders = ["fabric"] + loaders = ["fabric", "quilt"] dependencies { // TODO: move to slugs if that functionality becomes available in minotaur required.project("P7dR8mSH") // Fabric API From 42684fd87abbcec8c570291cb0b6fc8cc890355a Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 27 May 2022 02:15:30 +0800 Subject: [PATCH 4/7] Add way for other mods to indicate that they are fake players (#202) * Add way for other mods to indicate that they are fake players * Implement "reasonable default" for fake players and fix inverted logic Signed-off-by: Max Co-authored-by: Max --- .../level/entity/fabric/FakePlayers.java | 31 +++++++++++++++++++ .../level/entity/fabric/PlayerHooksImpl.java | 9 +++++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/FakePlayers.java diff --git a/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/FakePlayers.java b/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/FakePlayers.java new file mode 100644 index 00000000..41d736b6 --- /dev/null +++ b/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/FakePlayers.java @@ -0,0 +1,31 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.hooks.level.entity.fabric; + +import dev.architectury.event.Event; +import dev.architectury.event.EventFactory; +import dev.architectury.event.EventResult; +import net.minecraft.world.entity.player.Player; + +public interface FakePlayers { + Event EVENT = EventFactory.createEventResult(); + + EventResult isFakePlayer(Player player); +} diff --git a/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/PlayerHooksImpl.java b/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/PlayerHooksImpl.java index d1014a45..d5a76347 100644 --- a/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/PlayerHooksImpl.java +++ b/fabric/src/main/java/dev/architectury/hooks/level/entity/fabric/PlayerHooksImpl.java @@ -19,10 +19,17 @@ package dev.architectury.hooks.level.entity.fabric; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; public class PlayerHooksImpl { public static boolean isFake(Player player) { - return false; + var result = FakePlayers.EVENT.invoker().isFakePlayer(player); + if (result.isPresent()) { + return result.isTrue(); + } + // If no result has been returned, assume that player classes extending ServerPlayer + // (apart from ServerPlayer itself) are fake players, as a "reasonable default" + return player instanceof ServerPlayer && player.getClass() != ServerPlayer.class; } } From 517205efdc5a8c7791b3eae088420221a9b4f1a6 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 27 May 2022 17:31:05 +0200 Subject: [PATCH 5/7] Add Platform#getFilePaths (#268) Signed-off-by: Max --- .../main/java/dev/architectury/platform/Mod.java | 14 ++++++++++++++ .../architectury/platform/fabric/PlatformImpl.java | 8 +++++++- .../architectury/platform/forge/PlatformImpl.java | 7 ++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/dev/architectury/platform/Mod.java b/common/src/main/java/dev/architectury/platform/Mod.java index 117cc795..8aa80a28 100644 --- a/common/src/main/java/dev/architectury/platform/Mod.java +++ b/common/src/main/java/dev/architectury/platform/Mod.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.Nullable; import java.nio.file.Path; import java.util.Collection; +import java.util.List; import java.util.Optional; public interface Mod { @@ -45,6 +46,19 @@ public interface Mod { */ Optional getLogoFile(int preferredSize); + /** + * Gets a list of all possible root paths for the mod. + * This is especially relevant on Fabric, as a single mod may have multiple source sets + * (such as client / server-specific ones), each corresponding to one root path. + * + * @return A list of root paths belonging to the mod + */ + List getFilePaths(); + + /** + * @deprecated Use {@link #getFilePaths()} instead + */ + @Deprecated(forRemoval = true) Path getFilePath(); Collection getAuthors(); diff --git a/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java b/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java index 8dadf8a9..2419158f 100644 --- a/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java +++ b/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable; import java.nio.file.Path; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -121,7 +122,12 @@ public class PlatformImpl { public Optional getLogoFile(int preferredSize) { return metadata.getIconPath(preferredSize); } - + + @Override + public List getFilePaths() { + return container.getRootPaths(); + } + @Override public Path getFilePath() { return container.getRootPath(); diff --git a/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java b/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java index 19a9ece3..16926d02 100644 --- a/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java +++ b/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java @@ -126,7 +126,12 @@ public class PlatformImpl { public Optional getLogoFile(int i) { return this.info.getLogoFile(); } - + + @Override + public List getFilePaths() { + return List.of(getFilePath()); + } + @Override public Path getFilePath() { return this.info.getOwningFile().getFile().getFilePath(); From 3b8b9049e051d5ae78e8435aee40a55aabee786b Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 28 May 2022 11:54:44 +0200 Subject: [PATCH 6/7] Fix Platform#getFilePath not returning the *root* file path on Forge (#269) * Platform#getFilePath now actually returns the *root* path on forge Signed-off-by: Max * Add Mod#findResource (please stop yelling at me now kthx) Signed-off-by: Max --- .../src/main/java/dev/architectury/platform/Mod.java | 9 +++++++++ .../architectury/platform/fabric/PlatformImpl.java | 7 ++++++- .../architectury/platform/forge/PlatformImpl.java | 12 +++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/dev/architectury/platform/Mod.java b/common/src/main/java/dev/architectury/platform/Mod.java index 8aa80a28..68e67cb4 100644 --- a/common/src/main/java/dev/architectury/platform/Mod.java +++ b/common/src/main/java/dev/architectury/platform/Mod.java @@ -61,6 +61,15 @@ public interface Mod { @Deprecated(forRemoval = true) Path getFilePath(); + /** + * Gets an NIO Path to the given resource contained within the mod file / folder. + * The path is verified to exist, and an empty optional is returned if it doesn't. + * + * @param path The resource to search for + * @return The path of the resource if it exists, or {@link Optional#empty()} if it doesn't + */ + Optional findResource(String... path); + Collection getAuthors(); @Nullable diff --git a/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java b/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java index 2419158f..bf11e5a2 100644 --- a/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java +++ b/fabric/src/main/java/dev/architectury/platform/fabric/PlatformImpl.java @@ -132,7 +132,12 @@ public class PlatformImpl { public Path getFilePath() { return container.getRootPath(); } - + + @Override + public Optional findResource(String... path) { + return container.findPath(String.join("/", path)); + } + @Override public Collection getAuthors() { return metadata.getAuthors().stream() diff --git a/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java b/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java index 16926d02..f39b80e4 100644 --- a/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java +++ b/forge/src/main/java/dev/architectury/platform/forge/PlatformImpl.java @@ -35,6 +35,7 @@ import org.jetbrains.annotations.Nullable; import javax.annotation.Nonnull; import java.net.URL; +import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -126,15 +127,20 @@ public class PlatformImpl { public Optional getLogoFile(int i) { return this.info.getLogoFile(); } - + @Override public List getFilePaths() { return List.of(getFilePath()); } - + @Override public Path getFilePath() { - return this.info.getOwningFile().getFile().getFilePath(); + return this.info.getOwningFile().getFile().getSecureJar().getRootPath(); + } + + @Override + public Optional findResource(String... path) { + return Optional.of(this.info.getOwningFile().getFile().findResource(path)).filter(Files::exists); } @Override From 23c558744263b33ced023b6321881c104ffc4edd Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 28 May 2022 19:30:39 +0800 Subject: [PATCH 7/7] Fix split packet transformer splitting into wrong parts, minus 10 more bytes for safety (#270) --- .../networking/transformers/SplitPacketTransformer.java | 4 ++-- .../java/dev/architectury/test/networking/TestModNet.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/dev/architectury/networking/transformers/SplitPacketTransformer.java b/common/src/main/java/dev/architectury/networking/transformers/SplitPacketTransformer.java index b5287478..7214b3d7 100644 --- a/common/src/main/java/dev/architectury/networking/transformers/SplitPacketTransformer.java +++ b/common/src/main/java/dev/architectury/networking/transformers/SplitPacketTransformer.java @@ -179,7 +179,7 @@ public class SplitPacketTransformer implements PacketTransformer { @Override public void outbound(NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf buf, TransformationSink sink) { - int maxSize = (side == NetworkManager.Side.C2S ? 32767 : 1048576) - 1 - 10; + int maxSize = (side == NetworkManager.Side.C2S ? 32767 : 1048576) - 1 - 20; if (buf.readableBytes() <= maxSize) { ByteBuf stateBuf = Unpooled.buffer(1); stateBuf.writeByte(ONLY); @@ -187,7 +187,7 @@ public class SplitPacketTransformer implements PacketTransformer { sink.accept(side, id, packetBuffer); } else { int partSize = maxSize - 4; - int parts = Math.round(buf.readableBytes() / (float) partSize); + int parts = (int) Math.ceil(buf.readableBytes() / (float) partSize); for (int i = 0; i < parts; i++) { FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer()); if (i == 0) { diff --git a/testmod-common/src/main/java/dev/architectury/test/networking/TestModNet.java b/testmod-common/src/main/java/dev/architectury/test/networking/TestModNet.java index 65a8a5d0..c65e551c 100644 --- a/testmod-common/src/main/java/dev/architectury/test/networking/TestModNet.java +++ b/testmod-common/src/main/java/dev/architectury/test/networking/TestModNet.java @@ -41,7 +41,7 @@ public interface TestModNet { // An example Server to Client message MessageType SYNC_DATA = NET.registerS2C("sync_data", SyncDataMessage::new); ResourceLocation BIG_DATA = new ResourceLocation(TestMod.MOD_ID, "big_data"); - String BIG_STRING = StringUtils.repeat('a', 60000); + String BIG_STRING = StringUtils.repeat('a', 100000); static void initialize() { NetworkManager.registerReceiver(NetworkManager.Side.C2S, BIG_DATA, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> {