-
Couldn't load subscription status.
- Fork 4
Add NeoForge support #25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 4 commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
5067f63
Add NeoForge support
Thatsmusic99 4765ba7
Use JarInJar for jar shading
Thatsmusic99 c5031e2
Tidy up properties and neoforge.mods.toml file
Thatsmusic99 0f0a900
Add neoforge to workflow
Thatsmusic99 256f470
Add NeoForge Adventure platform
Thatsmusic99 44101ad
Fixes to event priority and jar-in-jar shading
Thatsmusic99 9159a38
Fix JDA not shutting down
Thatsmusic99 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,6 +3,7 @@ target/ | |
| .idea | ||
| .gradle | ||
| **/build/ | ||
| **/run | ||
| !src/**/build/ | ||
| gradle-app.setting | ||
| !gradle-wrapper.jar | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,177 @@ | ||
| plugins { | ||
| id 'java-library' | ||
| id 'maven-publish' | ||
| id 'idea' | ||
| id 'net.neoforged.moddev' version '2.0.92' | ||
| } | ||
|
|
||
| version = mod_version | ||
| group = mod_group_id | ||
|
|
||
| repositories { | ||
| mavenLocal() | ||
| } | ||
|
|
||
| base { | ||
| archivesName = mod_id + "-neoforge" | ||
| } | ||
|
|
||
| java.toolchain.languageVersion = JavaLanguageVersion.of(21) | ||
|
|
||
| neoForge { | ||
| // Specify the version of NeoForge to use. | ||
| version = project.neo_version | ||
|
|
||
| parchment { | ||
| mappingsVersion = project.parchment_mappings_version | ||
| minecraftVersion = project.parchment_minecraft_version | ||
| } | ||
|
|
||
| // This line is optional. Access Transformers are automatically detected | ||
| // accessTransformers.add('src/main/resources/META-INF/accesstransformer.cfg') | ||
|
|
||
| // Default run configurations. | ||
| // These can be tweaked, removed, or duplicated as needed. | ||
| runs { | ||
| client { | ||
| client() | ||
|
|
||
| // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. | ||
| systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id | ||
| } | ||
|
|
||
| server { | ||
| server() | ||
| programArgument '--nogui' | ||
| systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id | ||
| } | ||
|
|
||
| // This run config launches GameTestServer and runs all registered gametests, then exits. | ||
| // By default, the server will crash when no gametests are provided. | ||
| // The gametest system is also enabled by default for other run configs under the /test command. | ||
| gameTestServer { | ||
| type = "gameTestServer" | ||
| systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id | ||
| } | ||
|
|
||
| data { | ||
| data() | ||
|
|
||
| // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it | ||
| // gameDirectory = project.file('run-data') | ||
|
|
||
| // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. | ||
| programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() | ||
| } | ||
|
|
||
| // applies to all the run configs above | ||
| configureEach { | ||
| // Recommended logging data for a userdev environment | ||
| // The markers can be added/remove as needed separated by commas. | ||
| // "SCAN": For mods scan. | ||
| // "REGISTRIES": For firing of registry events. | ||
| // "REGISTRYDUMP": For getting the contents of all registries. | ||
| systemProperty 'forge.logging.markers', 'REGISTRIES' | ||
|
|
||
| // Recommended logging level for the console | ||
| // You can set various levels here. | ||
| // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels | ||
| logLevel = org.slf4j.event.Level.DEBUG | ||
| } | ||
| } | ||
|
|
||
| mods { | ||
| // define mod <-> source bindings | ||
| // these are used to tell the game which sources are for which mod | ||
| // mostly optional in a single mod project | ||
| // but multi mod projects should define one per mod | ||
| "${mod_id}" { | ||
| sourceSet(sourceSets.main) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| // Include resources generated by data generators. | ||
| sourceSets.main.resources { srcDir 'src/generated/resources' } | ||
|
|
||
|
|
||
| dependencies { | ||
| // Example mod dependency with JEI | ||
| // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime | ||
| // compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" | ||
| // compileOnly "mezz.jei:jei-${mc_version}-forge-api:${jei_version}" | ||
| // runtimeOnly "mezz.jei:jei-${mc_version}-forge:${jei_version}" | ||
|
|
||
| // Example mod dependency using a mod jar from ./libs with a flat dir repository | ||
| // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar | ||
| // The group id is ignored when searching -- in this case, it is "blank" | ||
| // implementation "blank:coolmod-${mc_version}:${coolmod_version}" | ||
|
|
||
| // Example mod dependency using a file as dependency | ||
| // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") | ||
|
|
||
| // Example project dependency using a sister or child project: | ||
| // implementation project(":myproject") | ||
|
|
||
| // For more info: | ||
| // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html | ||
| // http://www.gradle.org/docs/current/userguide/dependency_management.html | ||
|
|
||
| // implementation "net.neoforged:neoforge:${neo_version}" | ||
|
|
||
| jarJar(implementation("net.kyori:adventure-api:4.17.0")) { | ||
| exclude(module: "adventure-bom") | ||
| exclude(module: "annotations") | ||
| } | ||
| jarJar(implementation("net.kyori:adventure-text-serializer-gson:4.17.0")) { | ||
| exclude(module: "adventure-bom") | ||
| exclude(module: "adventure-api") | ||
| exclude(module: "annotations") | ||
| exclude(module: "auto-service-annotations") | ||
| exclude(module: "gson") | ||
| } | ||
|
|
||
| jarJar(implementation(project(path: ":common", configuration: "shadow"))) | ||
|
|
||
| // additionalRuntimeClasspath("com.cssbham:common:.*") | ||
| additionalRuntimeClasspath("net.kyori:adventure-api:4.17.0") | ||
| additionalRuntimeClasspath("net.kyori:adventure-text-serializer-gson:4.17.0") | ||
| } | ||
|
|
||
| tasks.shadowJar.enabled = false | ||
|
|
||
| // This block of code expands all declared replace properties in the specified resource targets. | ||
| // A missing property will result in an error. Properties are expanded using ${} Groovy notation. | ||
| var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { | ||
| var replaceProperties = [ | ||
| minecraft_version : minecraft_version, | ||
| minecraft_version_range: minecraft_version_range, | ||
| neo_version : neo_version, | ||
| neo_version_range : neo_version_range, | ||
| loader_version_range : loader_version_range, | ||
| mod_id : mod_id, | ||
| mod_name : mod_name, | ||
| mod_license : mod_license, | ||
| mod_version : mod_version, | ||
| mod_authors : mod_authors, | ||
| mod_description : mod_description | ||
| ] | ||
| inputs.properties replaceProperties | ||
| expand replaceProperties | ||
| from "src/main/templates" | ||
| into "build/generated/sources/modMetadata" | ||
| } | ||
|
|
||
| // Include the output of "generateModMetadata" as an input directory for the build | ||
| // this works with both building through Gradle and the IDE. | ||
| sourceSets.main.resources.srcDir generateModMetadata | ||
| // To avoid having to run "generateModMetadata" manually, make it run on every project reload | ||
| neoForge.ideSyncTask generateModMetadata | ||
|
|
||
| // IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. | ||
| idea { | ||
| module { | ||
| downloadSources = true | ||
| downloadJavadoc = true | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,44 @@ | ||
| # Sets default memory used for gradle commands. Can be overridden by user or command line properties. | ||
| org.gradle.jvmargs=-Xmx2G | ||
| org.gradle.daemon=true | ||
| org.gradle.parallel=true | ||
| org.gradle.caching=true | ||
| org.gradle.configuration-cache=true | ||
|
|
||
| ## Environment Properties | ||
| # You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge | ||
| # The Minecraft version must agree with the Neo version to get a valid artifact | ||
| minecraft_version=1.21.1 | ||
| # The Minecraft version range can use any release version of Minecraft as bounds. | ||
| # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly | ||
| # as they do not follow standard versioning conventions. | ||
| minecraft_version_range=[1.21.1,1.22) | ||
| # The Neo version must agree with the Minecraft version to get a valid artifact | ||
| neo_version=21.1.176 | ||
| # The Neo version range can use any version of Neo as bounds | ||
| neo_version_range=[21,) | ||
| # The loader version range can only use the major version of FML as bounds | ||
| loader_version_range=[4,) | ||
|
|
||
| parchment_minecraft_version=1.21.4 | ||
| parchment_mappings_version=2025.03.23 | ||
|
|
||
| ## Mod Properties | ||
|
|
||
| # The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} | ||
| # Must match the String constant located in the main mod class annotated with @Mod. | ||
| mod_id=cssminecraft | ||
| # The human-readable display name for the mod. | ||
| mod_name=CSS-Minecraft | ||
| # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. | ||
| mod_license=todo | ||
| # The mod version. See https://semver.org/ | ||
| mod_version=1.0.0 | ||
| # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. | ||
| # This should match the base package used for the mod sources. | ||
| # See https://maven.apache.org/guides/mini/guide-naming-conventions.html | ||
| mod_group_id=com.cssbham.cssminecraft.neoforge | ||
| # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. | ||
| mod_authors= | ||
| # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. | ||
| mod_description= |
35 changes: 35 additions & 0 deletions
35
neoforge/src/main/java/com/cssbham/cssminecraft/neoforge/CSSMinecraftLoader.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| package com.cssbham.cssminecraft.neoforge; | ||
|
|
||
| import net.neoforged.fml.common.Mod; | ||
| import net.neoforged.neoforge.common.NeoForge; | ||
| import net.neoforged.neoforge.event.server.ServerStartingEvent; | ||
| import net.neoforged.neoforge.event.server.ServerStoppingEvent; | ||
|
|
||
| /** | ||
| * Entrypoint for Forge | ||
| */ | ||
| @Mod(value = "cssminecraft") | ||
| public class CSSMinecraftLoader { | ||
|
|
||
| private final NeoForgeCSSMinecraftPlugin plugin; | ||
|
|
||
| public CSSMinecraftLoader() { | ||
| this.plugin = new NeoForgeCSSMinecraftPlugin(); | ||
| NeoForge.EVENT_BUS.addListener(this::onServerStarted); | ||
| } | ||
|
|
||
| public void onServerStarted(ServerStartingEvent event) { | ||
| this.plugin.setServer(event.getServer()); | ||
| try { | ||
| this.plugin.enable(); | ||
| } catch (Exception e) { | ||
| this.plugin.getLogger().severe("Mod initialisation failed - disabling"); | ||
| this.plugin.disable(); | ||
| } | ||
| } | ||
|
|
||
| public void onServerStopping(ServerStoppingEvent event) { | ||
| this.plugin.disable(); | ||
| } | ||
|
|
||
| } |
75 changes: 75 additions & 0 deletions
75
neoforge/src/main/java/com/cssbham/cssminecraft/neoforge/NeoForgeCSSMinecraftPlugin.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| package com.cssbham.cssminecraft.neoforge; | ||
|
|
||
| import com.cssbham.cssminecraft.common.AbstractCSSMinecraftPlugin; | ||
| import com.cssbham.cssminecraft.common.adapter.ServerChatAdapter; | ||
| import com.cssbham.cssminecraft.common.command.CommandService; | ||
| import com.cssbham.cssminecraft.common.executor.ServerExecutor; | ||
| import com.cssbham.cssminecraft.common.logger.Logger; | ||
| import com.cssbham.cssminecraft.neoforge.adapter.ForgeServerChatAdapter; | ||
| import com.cssbham.cssminecraft.neoforge.command.ForgeCommandService; | ||
| import com.cssbham.cssminecraft.neoforge.executor.ForgeServerExecutor; | ||
| import com.cssbham.cssminecraft.neoforge.listener.ForgeEventAdapter; | ||
| import com.cssbham.cssminecraft.neoforge.logger.ForgeLogger; | ||
| import net.minecraft.server.MinecraftServer; | ||
| import net.neoforged.fml.loading.FMLPaths; | ||
|
|
||
| import java.nio.file.Path; | ||
|
|
||
| /** | ||
| * Implementation of CSS Minecraft Plugin for Forge | ||
| */ | ||
| public class NeoForgeCSSMinecraftPlugin extends AbstractCSSMinecraftPlugin { | ||
|
|
||
| public static final String MOD_ID = "cssminecraft"; | ||
| private final ForgeLogger logger; | ||
| private ForgeServerChatAdapter serverChatAdapter; | ||
|
|
||
| private MinecraftServer server; | ||
| private ForgeServerExecutor executor; | ||
| private ForgeCommandService commandService; | ||
|
|
||
| public NeoForgeCSSMinecraftPlugin() { | ||
| this.logger = new ForgeLogger(MOD_ID); | ||
| } | ||
|
|
||
| @Override | ||
| public void enable() { | ||
| this.serverChatAdapter = new ForgeServerChatAdapter(server); | ||
| this.executor = new ForgeServerExecutor(logger, server); | ||
| this.commandService = new ForgeCommandService(logger, executor, serverChatAdapter, server); | ||
|
|
||
| super.enable(); | ||
|
|
||
| ForgeEventAdapter eventAdapter = new ForgeEventAdapter(server, executor); | ||
| eventAdapter.bindPlatformToEventBus(super.getEventBus()); | ||
| } | ||
|
|
||
| @Override | ||
| public Logger getLogger() { | ||
| return logger; | ||
| } | ||
|
|
||
| @Override | ||
| public ServerChatAdapter provideServerChatAdapter() { | ||
| return serverChatAdapter; | ||
| } | ||
|
|
||
| @Override | ||
| public Path provideConfigurationPath() { | ||
| return FMLPaths.CONFIGDIR.get().resolve(MOD_ID).resolve("config.yml"); | ||
| } | ||
|
|
||
| @Override | ||
| public ServerExecutor provideServerExecutor() { | ||
| return executor; | ||
| } | ||
|
|
||
| @Override | ||
| public CommandService provideCommandService() { | ||
| return commandService; | ||
| } | ||
|
|
||
| public void setServer(MinecraftServer server) { | ||
| this.server = server; | ||
| } | ||
| } | ||
42 changes: 42 additions & 0 deletions
42
neoforge/src/main/java/com/cssbham/cssminecraft/neoforge/adapter/ForgeServerChatAdapter.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| package com.cssbham.cssminecraft.neoforge.adapter; | ||
|
|
||
| import com.cssbham.cssminecraft.common.adapter.ServerChatAdapter; | ||
| import net.kyori.adventure.text.Component; | ||
| import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; | ||
| import net.minecraft.core.RegistryAccess; | ||
| import net.minecraft.server.MinecraftServer; | ||
| import net.minecraft.server.level.ServerPlayer; | ||
|
|
||
| import java.util.UUID; | ||
|
|
||
| public class ForgeServerChatAdapter implements ServerChatAdapter { | ||
|
|
||
| private final MinecraftServer server; | ||
|
|
||
| public ForgeServerChatAdapter(MinecraftServer server) { | ||
| this.server = server; | ||
| } | ||
|
|
||
| @Override | ||
| public void broadcastMessage(Component message) { | ||
| server.getPlayerList().broadcastSystemMessage(componentToMinecraftComponent(message), false); | ||
| } | ||
|
|
||
| @Override | ||
| public void sendMessageToPlayer(UUID user, Component component) { | ||
| ServerPlayer player = server.getPlayerList().getPlayer(user); | ||
| if (null != player) { | ||
| player.sendSystemMessage(componentToMinecraftComponent(component)); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public void sendMessageToConsole(Component component) { | ||
| server.sendSystemMessage(componentToMinecraftComponent(component)); | ||
| } | ||
|
|
||
| public net.minecraft.network.chat.Component componentToMinecraftComponent(Component component) { | ||
| return net.minecraft.network.chat.Component.Serializer.fromJson(GsonComponentSerializer.gson().serializeToTree(component), RegistryAccess.EMPTY); | ||
| } | ||
|
|
||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.