diff --git a/.gitignore b/.gitignore index 61563f7..403476e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,7 @@ logs eclipse run .vscode -**/extra-mods-*/ \ No newline at end of file +**/extra-mods-*/ + +.DS_Store +.architectury-transformer \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index bcf72bc..d065d91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +[2004.2.0] + +### Changed +* Ported to MC 1.20.4: Forge, NeoForge and Fabric all supported + [1902.1.16] ### Fixed diff --git a/build.gradle b/build.gradle index 433472b..ba64bb7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.2-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.5-SNAPSHOT" apply false } architectury { @@ -74,4 +74,4 @@ allprojects { } } -task curseforgePublish \ No newline at end of file +task curseforgePublish diff --git a/common/build.gradle b/common/build.gradle index f230820..3c1591c 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -9,7 +9,7 @@ dependencies { def ENV = System.getenv() architectury { - common("forge", "fabric") + common("forge", "fabric", "neoforge") } publishing { diff --git a/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java b/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java index 27f7d11..e18a818 100644 --- a/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java +++ b/common/src/main/java/dev/ftb/mods/ftbranks/impl/decorate/TextComponentParser.java @@ -116,7 +116,7 @@ private MutableComponent parse() { System.arraycopy(c, i + 1, rrggbb, 1, 6); i += 6; - style = style.withColor(TextColor.parseColor(new String(rrggbb))); + style = style.withColor(TextColor.parseColor(new String(rrggbb)).result().orElse(TextColor.fromRgb(0xFFFFFF))); } else { ChatFormatting formatting = CODE_TO_FORMATTING.get(c[i]); diff --git a/fabric/src/main/java/dev/ftb/mods/ftbranks/fabric/FTBRanksFabric.java b/fabric/src/main/java/dev/ftb/mods/ftbranks/fabric/FTBRanksFabric.java index 9de8567..1318b38 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftbranks/fabric/FTBRanksFabric.java +++ b/fabric/src/main/java/dev/ftb/mods/ftbranks/fabric/FTBRanksFabric.java @@ -8,8 +8,6 @@ import net.fabricmc.fabric.api.message.v1.ServerMessageDecoratorEvent; import net.minecraft.network.chat.MutableComponent; -import java.util.concurrent.CompletableFuture; - public class FTBRanksFabric implements ModInitializer { @Override public void onInitialize() { @@ -19,10 +17,10 @@ public void onInitialize() { if (sender != null) { MutableComponent mutableComponent = message.copy(); if (MessageDecorator.decorateMessage(sender, mutableComponent)) { - return CompletableFuture.completedFuture(mutableComponent); + return mutableComponent; } } - return CompletableFuture.completedFuture(message); + return message; }); PlayerDisplayNameCallback.EVENT.register(PlayerNameFormatting::formatPlayerName); diff --git a/forge/src/main/java/dev/ftb/mods/ftbranks/forge/FTBRanksForge.java b/forge/src/main/java/dev/ftb/mods/ftbranks/forge/FTBRanksForge.java index ff76f60..68c8195 100644 --- a/forge/src/main/java/dev/ftb/mods/ftbranks/forge/FTBRanksForge.java +++ b/forge/src/main/java/dev/ftb/mods/ftbranks/forge/FTBRanksForge.java @@ -13,7 +13,6 @@ import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.network.NetworkConstants; @Mod(FTBRanks.MOD_ID) public class FTBRanksForge { @@ -28,7 +27,7 @@ public FTBRanksForge() { // Nope. // PermissionAPI.setPermissionHandler(new PermissionAPIWrapper(PermissionAPI.getPermissionHandler())); - ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); + ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> DisplayTest.IGNORESERVERONLY, (a, b) -> true)); } private void playerNameFormatting(PlayerEvent.NameFormat event) { diff --git a/gradle.properties b/gradle.properties index 6df048f..299e9be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,20 @@ org.gradle.daemon=false mod_id=ftbranks archives_base_name=ftb-ranks maven_group=dev.ftb.mods -mod_version=2001.1.3 +mod_version=2004.2.0 mod_author=FTB Team -minecraft_version=1.20.1 -architectury_version=9.0.8 -fabric_loader_version=0.14.21 -fabric_api_version=0.83.1+1.20.1 -ftb_library_version=2001.1.2 -forge_version=47.0.1 +minecraft_version=1.20.4 + +# Deps +forge_version=49.0.31 +neoforge_version=20.4.196 +neoforge_loader_version=1 +fabric_loader_version=0.15.7 +fabric_api_version=0.96.4+1.20.4 +architectury_version=11.1.17 + +ftb_library_version=2004.2.0 curseforge_id_forge=314905 curseforge_id_fabric=472659 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d8d2475..0284600 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip diff --git a/neoforge/build.gradle b/neoforge/build.gradle new file mode 100644 index 0000000..dae9df6 --- /dev/null +++ b/neoforge/build.gradle @@ -0,0 +1,147 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.0" + id "com.matthewprenger.cursegradle" version "1.4.0" +} + +def ENV = System.getenv() + +architectury { + platformSetupLoomIde() + neoForge() +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentNeoForge.extendsFrom common +} + +//loom { +// forge { +// mixinConfigs = ["ftbranks-common.mixins.json"] +// } +//} + +repositories { + maven { + url "https://maven.neoforged.net/releases/" + } +} + +dependencies { + neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" + + modApi "dev.architectury:architectury-neoforge:${rootProject.architectury_version}" + modApi("dev.ftb.mods:ftb-library-neoforge:${rootProject.ftb_library_version}") { transitive false } + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive false } +} + +apply from: "https://raw.githubusercontent.com/FTBTeam/mods-meta/main/gradle/extra-local-mods.gradle" + +processResources { + exclude '.cache' + + inputs.property "version", project.version + + filesMatching("META-INF/mods.toml") { + expand "version": project.version, + "archversion": project.architectury_version, + "neoforgeversion": project.neoforge_version, + "neoforgeloaderversion": project.neoforge_loader_version, + "mcversion": project.minecraft_version, + "ftblibraryversion": project.ftb_library_version + } +} + +shadowJar { + exclude "fabric.mod.json" + + configurations = [project.configurations.shadowCommon] + setArchiveClassifier("dev-shadow") +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" + archiveClassifier.set null +} + +jar { + manifest { + attributes([ + "Specification-Title" : project.mod_id, + "Specification-Vendor" : project.mod_author, + "Specification-Version" : "1", + "Implementation-Title" : project.name, + "Implementation-Version" : version, + "Implementation-Vendor" : project.mod_author, + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } + + setArchiveClassifier("dev") +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +if (ENV.CURSEFORGE_KEY) { + curseforge { + apiKey = ENV.CURSEFORGE_KEY + project { + id = project.curseforge_id_forge + releaseType = ftbPublishing.relType + addGameVersion "Forge" + addGameVersion project.minecraft_version + mainArtifact(remapJar.archiveFile) + relations { + requiredDependency 'architectury-api' + requiredDependency 'ftb-library-forge' + } + changelog = ENV.CHANGELOG // expected to exist if ENV.CURSEFORGE does + changelogType = 'markdown' + } + } +} + +publishing { + publications { + mavenForge(MavenPublication) { + artifactId = "${rootProject.archives_base_name}-${project.name}" + version ftbPublishing.mavenVersion + from components.java + } + } + + repositories { + if (ftbPublishing.ftbToken) { + maven { + url ftbPublishing.ftbURL + credentials { + username = ftbPublishing.ftbUser + password = ftbPublishing.ftbToken + } + } + } + + if (ftbPublishing.sapsToken) { + maven { + url ftbPublishing.sapsURL + credentials { + username = ftbPublishing.sapsUser + password = ftbPublishing.sapsToken + } + } + } + } +} + +rootProject.tasks.getByName("curseforgePublish").dependsOn tasks.getByName("curseforge") diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..7da18ea --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/FTBRanksNeoForge.java b/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/FTBRanksNeoForge.java new file mode 100644 index 0000000..f95e104 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/FTBRanksNeoForge.java @@ -0,0 +1,41 @@ +package dev.ftb.mods.ftbranks.neoforge; + +import dev.ftb.mods.ftbranks.FTBRanks; +import dev.ftb.mods.ftbranks.PlayerNameFormatting; +import dev.ftb.mods.ftbranks.impl.decorate.MessageDecorator; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.fml.IExtensionPoint.DisplayTest; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.ServerChatEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; + +@Mod(FTBRanks.MOD_ID) +public class FTBRanksNeoForge { + public FTBRanksNeoForge() { + NeoForge.EVENT_BUS.addListener(this::playerNameFormatting); + NeoForge.EVENT_BUS.addListener(this::serverChat); + + FTBRanks.init(); + + // Nope. + // PermissionAPI.setPermissionHandler(new PermissionAPIWrapper(PermissionAPI.getPermissionHandler())); + + ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> DisplayTest.IGNORESERVERONLY, (a, b) -> true)); + } + + private void playerNameFormatting(PlayerEvent.NameFormat event) { + if (event.getEntity() instanceof ServerPlayer player) { + event.setDisplayname(PlayerNameFormatting.formatPlayerName(player, event.getDisplayname())); + } + } + + private void serverChat(ServerChatEvent event) { + MutableComponent text = event.getMessage().copy(); + if (MessageDecorator.decorateMessage(event.getPlayer(), text)) { + event.setMessage(text); + } + } +} diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/PermissionAPIWrapper.java b/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/PermissionAPIWrapper.java new file mode 100644 index 0000000..208fbaa --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftbranks/neoforge/PermissionAPIWrapper.java @@ -0,0 +1,44 @@ +package dev.ftb.mods.ftbranks.neoforge; + +/** + * @author LatvianModder + */ +public class PermissionAPIWrapper /* implements IPermissionHandler */ { + /* Nah, im not doing this lol + private final IPermissionHandler original; + + public PermissionAPIWrapper(IPermissionHandler h) { + original = h; + } + + @Override + public void registerNode(String node, DefaultPermissionLevel level, String desc) { + original.registerNode(node, level, desc); + } + + @Override + public Collection getRegisteredNodes() { + return original.getRegisteredNodes(); + } + + @Override + public boolean hasPermission(GameProfile profile, String node, @Nullable IContext context) { + if (context != null && context.getPlayer() instanceof ServerPlayer) { + return FTBRanksAPI.getPermissionValue((ServerPlayer) context.getPlayer(), node).asBoolean().orElseGet(() -> original.hasPermission(profile, node, context)); + } else if (context != null && context.getWorld() != null && !context.getWorld().isClientSide()) { + ServerPlayer player = context.getWorld().getServer().getPlayerList().getPlayer(profile.getId()); + + if (player != null) { + return FTBRanksAPI.getPermissionValue(player, node).asBoolean().orElseGet(() -> original.hasPermission(profile, node, context)); + } + } + + return original.hasPermission(profile, node, context); + } + + @Override + public String getNodeDescription(String node) { + return original.getNodeDescription(node); + } + */ +} diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..8e7bcf7 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,45 @@ +modLoader = "javafml" +loaderVersion = "[${neoforgeloaderversion},)" +issueTrackerURL = "https://go.ftb.team/support-mod-issues" +license = "All Rights Reserved" + +[[mods]] +modId = "ftbranks" +version = "${version}" +displayName = "FTB Ranks" +authors = "FTB Team" +description = ''' +A simple mod that lets you create ranks for players, similar to Discord roles, and manage permissions for them +''' + +[[mixins]] +config = "ftbranks-common.mixins.json" + +[[dependencies.ftbranks]] +modId = "neoforge" +type = "required" +versionRange = "[${neoforgeversion},)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.ftbranks]] +modId = "minecraft" +type = "required" +versionRange = "[${mcversion},)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.ftbranks]] +modId = "architectury" +type = "required" +versionRange = "[${archversion},)" +ordering = "AFTER" +side = "BOTH" + +[[dependencies.ftbranks]] +modId = "ftblibrary" +type = "required" +versionRange = "[${ftblibraryversion},)" +ordering = "AFTER" +side = "CLIENT" + diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..97115ac --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "FTB Ranks Resources", + "pack_format": 15 + } +} diff --git a/settings.gradle b/settings.gradle index 7628cae..43b5748 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,5 +9,6 @@ pluginManagement { include("common") include("fabric") include("forge") +include("neoforge") -rootProject.name = 'FTB-Ranks-1.20.1' +rootProject.name = 'FTB-Ranks-1.20.4'