Skip to content

Commit

Permalink
Add 1.20.5 support
Browse files Browse the repository at this point in the history
- Cleans up code in MinecraftVersion
- Makes the Forge platform optional like NeoForge
- Adds code to handle mods.toml vs neoforge.mods.toml depending on the
  game version
  • Loading branch information
Juuxel committed Apr 28, 2024
1 parent 0fb33aa commit 5fc7be1
Show file tree
Hide file tree
Showing 11 changed files with 257 additions and 108 deletions.
41 changes: 30 additions & 11 deletions res/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,16 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

import init, { create_state, generate, is_valid_mod_id, list_all_minecraft_versions, supports_neoforge, to_mod_id, validate_mod_id } from "./templateer.js";
import init, {
create_state,
generate,
is_valid_mod_id,
list_all_minecraft_versions,
supports_forge,
supports_neoforge,
to_mod_id,
validate_mod_id
} from "./templateer.js";
await init();

const state = create_state();
Expand Down Expand Up @@ -96,7 +105,7 @@ function updateState() {
state.project_type = getProjectType();
state.mapping_set = getMappingSet();
state.subprojects.fabric = document.getElementById("fabric-loader-input").checked;
state.subprojects.forge = document.getElementById("forge-loader-input").checked;
state.subprojects.forge = document.getElementById("forge-loader-input").checked && isForgeAvailable();
state.subprojects.neoforge = document.getElementById("neoforge-loader-input").checked && isNeoForgeAvailable();
state.subprojects.quilt = document.getElementById("quilt-loader-input").checked;
state.subprojects.fabric_likes = document.getElementById("fabric-like-input").checked && isFabricLikeAvailable();
Expand Down Expand Up @@ -134,17 +143,26 @@ function isNeoForgeAvailable() {
return supports_neoforge(version);
}

function isForgeAvailable() {
const version = mcSelect.value;
return supports_forge(version);
}

function refreshAvailablePlatforms() {
const hasNeoForge = isNeoForgeAvailable();
const neoForgeProjectInput = document.getElementById("neoforge-project-input");
const neoForgeLoaderInput = document.getElementById("neoforge-loader-input");
neoForgeProjectInput.disabled = !hasNeoForge;
neoForgeLoaderInput.disabled = !hasNeoForge;

// Change project type if Neo is not available.
if (!hasNeoForge && neoForgeProjectInput.checked) {
refreshForgeLikePlatform(isNeoForgeAvailable(), "neoforge");
refreshForgeLikePlatform(isForgeAvailable(), "forge");
}

function refreshForgeLikePlatform(available, id) {
const projectInput = document.getElementById(id + "-project-input");
const loaderInput = document.getElementById(id + "-loader-input");
projectInput.disabled = !available;
loaderInput.disabled = !available;

// Change project type if the platform is not available for this game version.
if (!available && projectInput.checked) {
multiplatformInput.checked = true;
neoForgeProjectInput.checked = false;
projectInput.checked = false;
refreshDisplayedProjectType();
}
}
Expand Down Expand Up @@ -178,5 +196,6 @@ document.getElementById("generate-button").onclick = async () => {
modNameInput.value = state.mod_name;
modIdInput.value = state.mod_id;
refreshModIdPlaceholder();
refreshAvailablePlatforms();
document.getElementById("package-input").value = state.package_name;
document.getElementById("architectury-api-input").checked = state.dependencies.architectury_api;
45 changes: 33 additions & 12 deletions src/app/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,16 @@ pub async fn generate(app: &super::GeneratorApp) -> Result<()> {
);
context.put("ARCHITECTURY_GROUP", game_version.architectury_maven_group());
context.put("ARCHITECTURY_PACKAGE", game_version.architectury_package());
context.put("FORGE_LOADER_MAJOR", game_version.forge_major_version());
context.maybe_put(
"FORGE_LOADER_MAJOR",
game_version.forge_major_version()
);
context.maybe_put(
"NEOFORGE_LOADER_MAJOR",
game_version.neoforge_loader_major(),
);
context.maybe_put("NEOFORGE_MAJOR", game_version.neoforge_major());
context.put("FORGE_PACK_FORMAT", game_version.forge_pack_version());
context.maybe_put("FORGE_PACK_FORMAT", game_version.forge_pack_version());

if let Some((data_pack_format_key, data_pack_format)) = game_version.forge_server_pack_version() {
context.put("FORGE_DATA_PACK_FORMAT_KEY", data_pack_format_key);
Expand Down Expand Up @@ -112,22 +115,31 @@ pub async fn generate(app: &super::GeneratorApp) -> Result<()> {
if app.subprojects.forge {
context.define("forge");
files.push(Box::pin(forge::all_files(client.clone())));
variables.push(Box::pin(add_key(
"FORGE_VERSION",
std::future::ready(Ok(versions.forge)),
)));
if let Some(version) = versions.forge {
variables.push(Box::pin(add_key(
"FORGE_VERSION",
std::future::ready(Ok(version)),
)));
}
platforms.push("forge");
}

if app.subprojects.neoforge {
context.define("neoforge");
files.push(Box::pin(neoforge::all_files(client.clone())));
files.push(Box::pin(neoforge::main_files(client.clone())));
if let Some(version) = versions.neoforge {
variables.push(Box::pin(add_key(
"NEOFORGE_VERSION",
std::future::ready(Ok(version)),
)));
}
if game_version == version_resolver::minecraft::MinecraftVersion::Minecraft1_20_4 {
context.put("NEOFORGE_METADATA_FILE_NAME", "mods.toml");
files.push(Box::pin(neoforge::mods_toml_files(client.clone())));
} else {
context.put("NEOFORGE_METADATA_FILE_NAME", "neoforge.mods.toml");
files.push(Box::pin(neoforge::neoforge_mods_toml_files(client.clone())));
}
platforms.push("neoforge");
}

Expand Down Expand Up @@ -159,20 +171,29 @@ pub async fn generate(app: &super::GeneratorApp) -> Result<()> {
}
}
ProjectType::NeoForge => {
files.push(Box::pin(neoforge_only::all_files(client.clone())));
files.push(Box::pin(neoforge_only::main_files(client.clone())));
if let Some(version) = versions.neoforge {
variables.push(Box::pin(add_key(
"NEOFORGE_VERSION",
std::future::ready(Ok(version)),
)));
}
if game_version == version_resolver::minecraft::MinecraftVersion::Minecraft1_20_4 {
context.put("NEOFORGE_METADATA_FILE_NAME", "mods.toml");
files.push(Box::pin(neoforge_only::mods_toml_files(client.clone())));
} else {
context.put("NEOFORGE_METADATA_FILE_NAME", "neoforge.mods.toml");
files.push(Box::pin(neoforge_only::neoforge_mods_toml_files(client.clone())));
}
}
ProjectType::Forge => {
files.push(Box::pin(forge_only::all_files(client.clone())));
variables.push(Box::pin(add_key(
"FORGE_VERSION",
std::future::ready(Ok(versions.forge)),
)));
if let Some(version) = versions.forge {
variables.push(Box::pin(add_key(
"FORGE_VERSION",
std::future::ready(Ok(version)),
)));
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/templates/neoforge/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ dependencies {
processResources {
inputs.property 'version', project.version

filesMatching('META-INF/mods.toml') {
filesMatching('META-INF/%NEOFORGE_METADATA_FILE_NAME%') {
expand version: project.version
}
}
Expand Down
12 changes: 10 additions & 2 deletions src/templates/neoforge/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,19 @@ super::file_data!(GRADLE_PROPERTIES gradle_properties, "neoforge", true, "gradle

// Code
super::file_data!(MODS_TOML mods_toml, "neoforge", true, "src/main/resources/META-INF/mods.toml");
super::file_data!(NEOFORGE_MODS_TOML neoforge_mods_toml, "neoforge", true, "src/main/resources/META-INF/neoforge.mods.toml");
super::file_data!(MOD_CLASS mod_class, "neoforge", true, "src/main/java/PACKAGE_DIR/neoforge/ExampleModNeoForge.java");

super::file_list!(pub all_files,
super::file_list!(pub main_files,
build_gradle
gradle_properties
mods_toml
mod_class
);

super::file_list!(pub mods_toml_files,
mods_toml
);

super::file_list!(pub neoforge_mods_toml_files,
neoforge_mods_toml
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
modLoader = "javafml"
loaderVersion = "[%NEOFORGE_LOADER_MAJOR%,)"
#issueTrackerURL = ""
license = "Insert License Here"

[[mods]]
modId = "%MOD_ID%"
version = "${version}"
displayName = "%MOD_NAME%"
authors = "Me!"
description = '''
This is an example description! Tell everyone what your mod is about!
'''
#logoFile = ""

[[dependencies.%MOD_ID%]]
modId = "neoforge"
type = "required"
versionRange = "[%NEOFORGE_MAJOR%,)"
ordering = "NONE"
side = "BOTH"

[[dependencies.%MOD_ID%]]
modId = "minecraft"
type = "required"
versionRange = "[%MINECRAFT_VERSION%,)"
ordering = "NONE"
side = "BOTH"
#% if architectury_api

[[dependencies.%MOD_ID%]]
modId = "architectury"
type = "required"
versionRange = "[%ARCHITECTURY_API_VERSION%,)"
ordering = "AFTER"
side = "BOTH"
#% end

[[mixins]]
config = "%MOD_ID%.mixins.json"
2 changes: 1 addition & 1 deletion src/templates/neoforge_only/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ dependencies {
processResources {
inputs.property 'version', project.version

filesMatching('META-INF/mods.toml') {
filesMatching('META-INF/%NEOFORGE_METADATA_FILE_NAME%') {
expand version: project.version
}
}
Expand Down
12 changes: 10 additions & 2 deletions src/templates/neoforge_only/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,21 @@ super::file_data!(SETTINGS_GRADLE settings_gradle, "neoforge_only", false, "sett
// Code
super::file_data!(MIXINS mixins, "neoforge_only", false, "src/main/resources/MOD_ID.mixins.json");
super::file_data!(MODS_TOML mods_toml, "neoforge_only", false, "src/main/resources/META-INF/mods.toml");
super::file_data!(NEOFORGE_MODS_TOML neoforge_mods_toml, "neoforge_only", false, "src/main/resources/META-INF/neoforge.mods.toml");
super::file_data!(MOD_CLASS mod_class, "neoforge_only", false, "src/main/java/PACKAGE_DIR/ExampleMod.java");

super::file_list!(pub all_files,
super::file_list!(pub main_files,
build_gradle
gradle_properties
settings_gradle
mixins
mods_toml
mod_class
);

super::file_list!(pub mods_toml_files,
mods_toml
);

super::file_list!(pub neoforge_mods_toml_files,
neoforge_mods_toml
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
modLoader = "javafml"
loaderVersion = "[%NEOFORGE_LOADER_MAJOR%,)"
#issueTrackerURL = ""
license = "Insert License Here"

[[mods]]
modId = "%MOD_ID%"
version = "${version}"
displayName = "%MOD_NAME%"
authors = "Me!"
description = '''
This is an example description! Tell everyone what your mod is about!
'''
#logoFile = ""

[[dependencies.%MOD_ID%]]
modId = "neoforge"
type = "required"
versionRange = "[%NEOFORGE_MAJOR%,)"
ordering = "NONE"
side = "BOTH"

[[dependencies.%MOD_ID%]]
modId = "minecraft"
type = "required"
versionRange = "[%MINECRAFT_VERSION%,)"
ordering = "NONE"
side = "BOTH"

[[mixins]]
config = "%MOD_ID%.mixins.json"
6 changes: 6 additions & 0 deletions src/web.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,9 @@ pub fn supports_neoforge(game_version: JsValue) -> Result<bool, JsValue> {
let game_version: version_resolver::minecraft::MinecraftVersion = serde_wasm_bindgen::from_value(game_version)?;
Ok(game_version.neoforge_major().is_some())
}

#[wasm_bindgen]
pub fn supports_forge(game_version: JsValue) -> Result<bool, JsValue> {
let game_version: version_resolver::minecraft::MinecraftVersion = serde_wasm_bindgen::from_value(game_version)?;
Ok(game_version.forge_major_version().is_some())
}
30 changes: 17 additions & 13 deletions version_resolver/src/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ impl VersionIndex {
#[derive(Clone, Serialize, Deserialize)]
pub struct Versions {
pub architectury_api: String,
pub forge: String,
pub forge: Option<String>,
pub neoforge: Option<String>,
}

Expand All @@ -51,18 +51,22 @@ impl Versions {
)
.await?;

let forge = crate::maven::resolve_matching_version(
&client,
crate::maven::MavenLibrary::forge(),
|version| {
version.starts_with(&format!(
"{}-{}.",
game_version.version(),
game_version.forge_major_version()
))
},
)
.await?;
let forge = if let Some(forge_major) = game_version.forge_major_version() {
Some(crate::maven::resolve_matching_version(
&client,
crate::maven::MavenLibrary::forge(),
|version| {
version.starts_with(&format!(
"{}-{}.",
game_version.version(),
forge_major
))
},
)
.await?)
} else {
None
};

let neoforge = if let Some(major) = game_version.neoforge_major() {
Some(
Expand Down
Loading

0 comments on commit 5fc7be1

Please sign in to comment.