Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ maven_group=CCBlueX

loom_version=1.16-SNAPSHOT

moddev_version=2.0.141
neoforge_version=26.1.2.75
neoforge_version_range=[26.1,)
# The same range as mod_mc_version, in Maven syntax - keep the two in sync
mod_mc_version_range=(1.21.11,26.2)

mod_id=mcef
mod_name=MCEF (Minecraft Chromium Embedded Framework)
mod_vendor=CCBlueX
164 changes: 164 additions & 0 deletions neoforge/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
plugins {
id 'net.neoforged.moddev'
id 'maven-publish'
}

static def getCheckedOutGitCommitHash(Project mcefParent) {
def gitFolder = "$mcefParent.projectDir/.git/modules/java-cef/"
def takeFromHash = 40
/*
* '.git/HEAD' contains either
* in case of detached head: the currently checked out commit hash
* otherwise: a reference to a file containing the current commit hash
*/
def gitHeadFile = new File(gitFolder + "HEAD")
if (gitHeadFile.exists()) {
def head = gitHeadFile.text.split(":") // .git/HEAD
def isCommit = head.length == 1 // e5a7c79edabbf7dd39888442df081b1c9d8e88fd

if (isCommit) return head[0].trim().take(takeFromHash) // e5a7c79edabb

def refHead = new File(gitFolder + head[1].trim()) // .git/refs/heads/master
refHead.text.trim().take takeFromHash
} else {
return ""
}
}

tasks.register('generateJcefCommitFile') {
def commitFile = layout.buildDirectory.file("jcef.commit")
outputs.file commitFile
doLast {
def commitHash = getCheckedOutGitCommitHash(rootProject)
if (!commitHash.isEmpty()) {
commitFile.get().asFile.text = commitHash
} else {
throw new GradleException("Unable to determine JCEF commit hash.")
}
}
}

version = project.mod_version
group = 'net.ccbluex'

base {
archivesName = "${project.archives_base_name}-neoforge"
}

// If NeoForge lags behind after a Minecraft update, it must not break the Fabric
// build or its publishing: disable this module's tasks while the versions do not match.
def neoForgeMinecraftVersion = neoforge_version.tokenize('.').take(3).join('.')
def paddedMinecraftVersion = (minecraft_version.tokenize('.') + ['0', '0']).take(3).join('.')

if (neoForgeMinecraftVersion != paddedMinecraftVersion) {
logger.warn("NeoForge ${neoforge_version} targets Minecraft ${neoForgeMinecraftVersion}, but the " +
"project is on Minecraft ${minecraft_version}. The neoforge tasks are disabled " +
"until a matching NeoForge version is available.")

tasks.configureEach { enabled = false }
}

repositories {
mavenCentral()
mavenLocal()
}

neoForge {
version = project.neoforge_version
}

dependencies {
implementation "com.squareup.okhttp3:okhttp:4.12.0"
implementation "org.lwjgl:lwjgl-egl:3.4.1"
}

// NeoForge 26.1 requires Java 25, so this artifact targets a newer level than
// the Fabric artifact (Java 21)
tasks.withType(JavaCompile).configureEach {
options.release = 25
}

sourceSets {
jcef {
java {
srcDir rootProject.file("java-cef/java")
exclude "**/tests/**"
}
}

main {
java {
srcDir rootProject.file("src/main/java")
}
resources {
srcDir rootProject.file("src/main/resources")
}
compileClasspath += jcef.output
runtimeClasspath += jcef.output
}
}

processResources {
exclude 'fabric.mod.json'

filesMatching('META-INF/neoforge.mods.toml') {
expand 'mod_id': mod_id,
'mod_name': mod_name,
'mod_vendor': mod_vendor,
'mod_version': mod_version,
'minecraft_version_range': mod_mc_version_range,
'neoforge_version_range': neoforge_version_range
}

inputs.property "version", project.version
inputs.property "minecraft_version_range", mod_mc_version_range
inputs.property "neoforge_version_range", neoforge_version_range
}

jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest {
attributes(['Specification-Title' : "${archives_base_name}-neoforge",
'Specification-Vendor' : group,
'Specification-Version' : "1",
'Implementation-Title' : "${archives_base_name}-neoforge",
'Implementation-Version' : mod_version,
'Implementation-Vendor' : group,
'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'java-cef-commit' : getCheckedOutGitCommitHash(rootProject)
])
}
from sourceSets.jcef.output
from(rootProject.file("LICENSE")) {
rename { "${it}_${project.base.archivesName.get()}" }
}
from tasks.named('generateJcefCommitFile')
}

java {
withSourcesJar()
}

publishing {
publications {
mavenJava(MavenPublication) {
artifactId = "${project.archives_base_name}-neoforge"
from components.java
}
}

repositories {
maven {
name = "ccbluex-maven"
def isSnapshot = version.toString().endsWith("-SNAPSHOT")
url = isSnapshot ? uri("https://maven.ccbluex.net/snapshots") : uri("https://maven.ccbluex.net/releases")
credentials {
username = System.getenv("MAVEN_TOKEN_NAME")
password = System.getenv("MAVEN_TOKEN_SECRET")
}
authentication {
basic(BasicAuthentication)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* MCEF (Minecraft Chromium Embedded Framework)
* Copyright (C) 2025 CCBlueX
* Copyright (C) 2023 CinemaMod Group
*
* This library 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 2.1 of the License, or (at your option) any later version.
*
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/

package net.ccbluex.liquidbounce.mcef.neoforge;

import net.neoforged.fml.common.Mod;

/**
* NeoForge mod entry point. MCEF is a pure library mod and performs no
* initialization on its own; this class only exists because the javafml
* language provider requires an {@link Mod @Mod} annotated class per mod id.
*/
@Mod("mcef")
public final class MCEFNeoForge {
}
25 changes: 25 additions & 0 deletions neoforge/src/main/resources/META-INF/neoforge.mods.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
modLoader = "javafml"
loaderVersion = "[1,)"
license = "LGPL 2.1"

[[mods]]
modId = "${mod_id}"
version = "${mod_version}"
displayName = "${mod_name}"
authors = "${mod_vendor}"
description = "A Minecraft mod and library for adding the Chromium web browser into the game (Minecraft Chromium Embedded Framework)."
logoFile = "icon.png"

[[dependencies.${mod_id}]]
modId = "minecraft"
type = "required"
versionRange = "${minecraft_version_range}"
ordering = "NONE"
side = "BOTH"

[[dependencies.${mod_id}]]
modId = "neoforge"
type = "required"
versionRange = "${neoforge_version_range}"
ordering = "NONE"
side = "BOTH"
10 changes: 10 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,23 @@ pluginManagement {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
maven {
name = 'NeoForged'
url = 'https://maven.neoforged.net/releases'
content {
includeGroupAndSubgroups 'net.neoforged'
}
}
gradlePluginPortal()
}

plugins {
id 'fabric-loom' version loom_version
id 'net.neoforged.moddev' version moddev_version
}

}

rootProject.name = 'mcef'

include 'neoforge'