mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-14 01:04:24 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1f057278d | ||
|
|
6bbe2c64a9 | ||
|
|
684cd96e32 | ||
|
|
1f4e13fce0 | ||
|
|
55ad9e6d7d | ||
|
|
5c8d1618bc | ||
|
|
a6f5057840 | ||
|
|
1b0360928f | ||
|
|
921771bd11 | ||
|
|
089bb1fc84 | ||
|
|
602f1ef947 | ||
|
|
3b18e003f6 | ||
|
|
c33f2d1be6 | ||
|
|
022116141c | ||
|
|
a8b243c0cd | ||
|
|
c22355cc45 | ||
|
|
74bc36307e | ||
|
|
88d2dc6c8f | ||
|
|
de13ba8ab8 | ||
|
|
4f838a87d4 | ||
|
|
70d700e630 | ||
|
|
78fffcf45a | ||
|
|
cdba403ab6 | ||
|
|
6821d7b1cc | ||
|
|
9524ce4580 | ||
|
|
f2bbeab3b9 | ||
|
|
4a8adf5465 | ||
|
|
f5fa2f2a57 | ||
|
|
b33e168969 | ||
|
|
1f6e1ff257 | ||
|
|
7f8897141e | ||
|
|
b9a097c9e1 | ||
|
|
62f00266c5 | ||
|
|
6986cd7ab3 | ||
|
|
e7051b3484 | ||
|
|
f667d25d0b | ||
|
|
48d72fb7c6 | ||
|
|
2fb2bbeed0 | ||
|
|
12d24df4f6 | ||
|
|
e69f5e262a | ||
|
|
23cee57d88 | ||
|
|
ab70bde1d6 | ||
|
|
f65381fbff | ||
|
|
b680d09359 | ||
|
|
7969daf81a | ||
|
|
f157567d2a | ||
|
|
93a615e900 | ||
|
|
7c84249996 | ||
|
|
881725c7d5 | ||
|
|
2745531f08 | ||
|
|
bcdd44aece | ||
|
|
bad5b1b5d4 | ||
|
|
30f255d76c | ||
|
|
ebb316a15c | ||
|
|
e6bb7eecbd | ||
|
|
c66f70d6c2 | ||
|
|
26adf4da44 | ||
|
|
30d0a630d6 | ||
|
|
00ad61b4ae | ||
|
|
09bc73d5cd | ||
|
|
1ee53c0464 | ||
|
|
16863c8d3b | ||
|
|
150e8281ae | ||
|
|
4385eb2155 | ||
|
|
5c40bef28e | ||
|
|
55aa419100 | ||
|
|
a4bef82836 | ||
|
|
b741df5f18 | ||
|
|
0c81a71308 | ||
|
|
ea7f755a11 | ||
|
|
d947d35eb1 | ||
|
|
5271ef79fe | ||
|
|
b7131824f0 | ||
|
|
3e624db4f8 | ||
|
|
fc7af96bde | ||
|
|
b1965db30b | ||
|
|
8df5a80725 | ||
|
|
d9043298d3 | ||
|
|
e91ff9a5a6 | ||
|
|
77fb08713f | ||
|
|
2c965fac90 | ||
|
|
2f229c5bb1 | ||
|
|
54b08d2711 | ||
|
|
46f641a502 | ||
|
|
6304cb655b |
No files matched your search
Vendored
+2
-2
@@ -36,8 +36,8 @@ project {
|
||||
buildType(PullRequestCompatibility)
|
||||
|
||||
params {
|
||||
text("docker_jdk_version", "17", label = "Gradle version", description = "The version of the JDK to use during execution of tasks in a JDK.", display = ParameterDisplay.HIDDEN, allowEmpty = false)
|
||||
text("docker_gradle_version", "7.5.1", label = "Gradle version", description = "The version of Gradle to use during execution of Gradle tasks.", display = ParameterDisplay.HIDDEN, allowEmpty = false)
|
||||
text("docker_jdk_version", "21", label = "Gradle version", description = "The version of the JDK to use during execution of tasks in a JDK.", display = ParameterDisplay.HIDDEN, allowEmpty = false)
|
||||
text("docker_gradle_version", "8.8", label = "Gradle version", description = "The version of Gradle to use during execution of Gradle tasks.", display = ParameterDisplay.HIDDEN, allowEmpty = false)
|
||||
text("git_main_branch", "1.20.x", label = "Git Main Branch", description = "The git main or default branch to use in VCS operations.", display = ParameterDisplay.HIDDEN, allowEmpty = false)
|
||||
text("git_branch_spec", """
|
||||
+:refs/heads/(main*)
|
||||
|
||||
Vendored
-125
@@ -1,125 +0,0 @@
|
||||
@Library('forge-shared-library')_
|
||||
|
||||
pipeline {
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
}
|
||||
agent {
|
||||
docker {
|
||||
image 'gradle:7-jdk16'
|
||||
//args '-v forgegc:/home/gradle/.gradle_cache/'
|
||||
}
|
||||
}
|
||||
environment {
|
||||
GRADLE_ARGS = '--no-daemon --console=plain' // No daemon for now as FG3 kinda derps. //'-Dorg.gradle.daemon.idletimeout=5000'
|
||||
DISCORD_WEBHOOK = credentials('forge-discord-jenkins-webhook')
|
||||
DISCORD_PREFIX = "Job: Forge Branch: ${BRANCH_NAME} Build: #${BUILD_NUMBER}"
|
||||
JENKINS_HEAD = 'https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('notify_start') {
|
||||
when {
|
||||
not {
|
||||
changeRequest()
|
||||
}
|
||||
}
|
||||
steps {
|
||||
discordSend(
|
||||
title: "${DISCORD_PREFIX} Started",
|
||||
successful: true,
|
||||
result: 'ABORTED', //White border
|
||||
thumbnail: JENKINS_HEAD,
|
||||
webhookURL: DISCORD_WEBHOOK
|
||||
)
|
||||
}
|
||||
}
|
||||
/*
|
||||
stage('pull_cache') {
|
||||
steps {
|
||||
sh 'cp -r /home/gradle/.gradle_cache/jdks/ /home/gradle/.gradle/jdks/'
|
||||
sh 'cp -r /home/gradle/.gradle_cache/wrapper/ /home/gradle/.gradle/wrapper/'
|
||||
sh 'cp -r /home/gradle/.gradle_cache/caches/ /home/gradle/.gradle/caches/'
|
||||
}
|
||||
}
|
||||
*/
|
||||
stage('setup') {
|
||||
steps {
|
||||
withGradle {
|
||||
sh './gradlew ${GRADLE_ARGS} --refresh-dependencies --continue setup'
|
||||
}
|
||||
script {
|
||||
env.MYVERSION = sh(returnStdout: true, script: './gradlew :forge:properties -q | grep "^version:" | cut -d" " -f2').trim()
|
||||
env.FMLONLY_VERSION = sh(returnStdout: true, script: './gradlew :fmlonly:properties -q | grep "^version:" | cut -d" " -f2').trim()
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('changelog') {
|
||||
when {
|
||||
not {
|
||||
changeRequest()
|
||||
}
|
||||
}
|
||||
steps {
|
||||
writeChangelog(currentBuild, 'build/changelog.txt')
|
||||
}
|
||||
}
|
||||
stage('publish') {
|
||||
when {
|
||||
not {
|
||||
changeRequest()
|
||||
}
|
||||
}
|
||||
environment {
|
||||
CROWDIN = credentials('forge-crowdin')
|
||||
KEYSTORE = credentials('forge-jenkins-keystore-old')
|
||||
KEYSTORE_KEYPASS = credentials('forge-jenkins-keystore-old-keypass')
|
||||
KEYSTORE_STOREPASS = credentials('forge-jenkins-keystore-old-keypass')
|
||||
}
|
||||
steps {
|
||||
withCredentials([usernamePassword(credentialsId: 'maven-forge-user', usernameVariable: 'MAVEN_USER', passwordVariable: 'MAVEN_PASSWORD')]) {
|
||||
withGradle {
|
||||
sh './gradlew ${GRADLE_ARGS} publish -PkeystoreKeyPass=${KEYSTORE_KEYPASS} -PkeystoreStorePass=${KEYSTORE_STOREPASS} -Pkeystore=${KEYSTORE} -PcrowdinKey=${CROWDIN}'
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success {
|
||||
build job: 'filegenerator', parameters: [string(name: 'COMMAND', value: "promote net.minecraftforge:forge ${env.MYVERSION} latest")], propagate: false, wait: false
|
||||
build job: 'filegenerator', parameters: [string(name: 'COMMAND', value: "promote net.minecraftforge:fmlonly ${env.FMLONLY_VERSION} latest")], propagate: false, wait: false
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('test_publish_pr') { //Publish to local repo to test full process, but don't include credentials so it can't sign/publish to maven
|
||||
when {
|
||||
changeRequest()
|
||||
}
|
||||
environment {
|
||||
CROWDIN = credentials('forge-crowdin')
|
||||
}
|
||||
steps {
|
||||
withGradle {
|
||||
sh './gradlew ${GRADLE_ARGS} publish -PcrowdinKey=${CROWDIN}'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
archiveArtifacts artifacts: 'projects/forge/build/libs/**/*.*', fingerprint: true, onlyIfSuccessful: true, allowEmptyArchive: true
|
||||
|
||||
if (env.CHANGE_ID == null) { // This is unset for non-PRs
|
||||
discordSend(
|
||||
title: "${DISCORD_PREFIX} Finished ${currentBuild.currentResult}",
|
||||
description: '```\n' + getChanges(currentBuild) + '\n```',
|
||||
successful: currentBuild.resultIsBetterOrEqualTo("SUCCESS"),
|
||||
result: currentBuild.currentResult,
|
||||
thumbnail: JENKINS_HEAD,
|
||||
webhookURL: DISCORD_WEBHOOK
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+37
-21
@@ -1,3 +1,4 @@
|
||||
import de.undercouch.gradle.tasks.download.Download
|
||||
import groovy.json.JsonBuilder
|
||||
import net.minecraftforge.forge.tasks.checks.CheckATs
|
||||
import net.minecraftforge.forge.tasks.checks.CheckExcs
|
||||
@@ -24,11 +25,11 @@ import org.objectweb.asm.Opcodes
|
||||
plugins {
|
||||
id 'org.cadixdev.licenser' version '0.6.1'
|
||||
id 'com.github.ben-manes.versions' version '0.46.0'
|
||||
id 'net.minecraftforge.gradleutils' version '2.+'
|
||||
id 'net.minecraftforge.gradleutils' version '[2.2,2.3)'
|
||||
id 'eclipse'
|
||||
id 'de.undercouch.download' version '5.4.0'
|
||||
id 'net.minecraftforge.gradle.patcher' version '[6.0.6,6.2)' apply false
|
||||
id 'net.minecraftforge.gradle.mcp' version '[6.0.6,6.2)' apply false
|
||||
id 'net.minecraftforge.gradle.patcher' version '[6.0.11,6.2)' apply false
|
||||
id 'net.minecraftforge.gradle.mcp' version '[6.0.11,6.2)' apply false
|
||||
}
|
||||
|
||||
Util.init() //Init all our extension methods!
|
||||
@@ -52,13 +53,13 @@ ext {
|
||||
SPI_VERSION = '7.0.1'
|
||||
MERGETOOL_VERSION = '1.1.5'
|
||||
ACCESSTRANSFORMERS_VERSION = '8.0.4'
|
||||
COREMODS_VERSION = '5.0.1'
|
||||
COREMODS_VERSION = '5.1.6'
|
||||
EVENTBUS_VERSION = '6.0.5'
|
||||
MODLAUNCHER_VERSION = '10.0.9'
|
||||
SECUREJARHANDLER_VERSION = '2.1.10'
|
||||
BOOTSTRAPLAUNCHER_VERSION = '1.1.2'
|
||||
ASM_VERSION = '9.5'
|
||||
INSTALLER_VERSION = '2.1.+'
|
||||
ASM_VERSION = '9.7'
|
||||
INSTALLER_VERSION = '2.2.+'
|
||||
MIXIN_VERSION = '0.8.5'
|
||||
TERMINALCONSOLEAPPENDER_VERSION = '1.2.0'
|
||||
JLINE_VERSION = '3.12.+'
|
||||
@@ -84,7 +85,7 @@ ext {
|
||||
FORGE_VERSION = VERSION.substring(MC_VERSION.length() + 1)
|
||||
|
||||
BINPATCH_TOOL = 'net.minecraftforge:binarypatcher:1.1.1:fatjar'
|
||||
INSTALLER_TOOLS = 'net.minecraftforge:installertools:1.3.0'
|
||||
INSTALLER_TOOLS = 'net.minecraftforge:installertools:1.4.1'
|
||||
JAR_SPLITTER = 'net.minecraftforge:jarsplitter:1.1.4'
|
||||
FART = 'net.minecraftforge:ForgeAutoRenamingTool:0.1.22:all'
|
||||
MIN_TAG_FOR_CHANGELOG = '41.0'
|
||||
@@ -209,6 +210,11 @@ subprojects {
|
||||
maven gradleutils.getPublishingForgeMaven()
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
|
||||
options.warnings = false // Shutup deprecated for removal warnings
|
||||
}
|
||||
}
|
||||
|
||||
project(':mcp') {
|
||||
@@ -349,7 +355,7 @@ def sharedFmlonlyForge = { Project prj ->
|
||||
}
|
||||
|
||||
prj.task([type: DownloadMavenArtifact], 'downloadInstaller') {
|
||||
artifact = "net.minecraftforge:installer:${INSTALLER_VERSION}:shrunk"
|
||||
artifact = "net.minecraftforge:installer:${INSTALLER_VERSION}:fatjar"
|
||||
changing = true
|
||||
}
|
||||
|
||||
@@ -887,9 +893,8 @@ project(':forge') {
|
||||
apply plugin: 'org.cadixdev.licenser'
|
||||
|
||||
applyPatches {
|
||||
verbose = true
|
||||
//failOnError = false
|
||||
}
|
||||
level 'WARNING'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
@@ -1173,9 +1178,12 @@ project(':forge') {
|
||||
]
|
||||
}
|
||||
|
||||
task crowdin(type: Crowdin) {
|
||||
key = project.hasProperty('crowdinKey') ? project.crowdinKey : null
|
||||
//TODO: Merge our english.json?
|
||||
tasks.register('downloadCrowdin', Download) {
|
||||
src 'https://files.minecraftforge.net/crowdin.zip'
|
||||
dest file('build/crowdin.zip')
|
||||
useETag 'all'
|
||||
onlyIfModified true
|
||||
quiet true
|
||||
}
|
||||
|
||||
sharedFmlonlyForge.call(project)
|
||||
@@ -1586,9 +1594,12 @@ project(':forge') {
|
||||
from extraTxts
|
||||
|
||||
// add crowdin locales
|
||||
from { crowdin.output.present && crowdin.output.get().asFile.exists() ? zipTree(crowdin.output) : null}
|
||||
dependsOn crowdin
|
||||
duplicatesStrategy = 'exclude'
|
||||
from zipTree(downloadCrowdin.dest).matching {
|
||||
include 'assets/forge/lang/*.json'
|
||||
}
|
||||
|
||||
dependsOn downloadCrowdin
|
||||
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||
|
||||
doFirst {
|
||||
MANIFESTS.each{ pkg, values ->
|
||||
@@ -1775,10 +1786,10 @@ project(':forge') {
|
||||
}
|
||||
// Since we need the modules in the bootstrap, we need to make sure they are compiled before we do each run
|
||||
afterEvaluate { prepareRuns.dependsOn(PACKED_DEPS) }
|
||||
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
|
||||
}
|
||||
|
||||
// Make sure we run bin compat checking during local testing.
|
||||
if (!System.env.MAVEN_USER || !System.env.MAVEN_PASSWORD)
|
||||
publish.dependsOn(':forge:checkJarCompatibility')
|
||||
}
|
||||
|
||||
//evaluationDependsOnChildren()
|
||||
@@ -1789,6 +1800,11 @@ task setup() { //These must be strings so that we can do lazy resolution. Else
|
||||
dependsOn ':forge:extractMapped'
|
||||
}
|
||||
|
||||
task doChecks {
|
||||
dependsOn ':forge:checkJarCompatibility'
|
||||
dependsOn ':forge:publish'
|
||||
}
|
||||
|
||||
if (symlinkValid)
|
||||
project.gradle.startParameter.excludedTaskNames.add(':fmlonly:genPatches')
|
||||
project.gradle.startParameter.excludedTaskNames.add(':clean:genPatches')
|
||||
|
||||
+1
-1
@@ -27,6 +27,6 @@ abstract class BytecodePredicateFinder extends BytecodeFinder {
|
||||
@Internal
|
||||
@Override
|
||||
protected Object getData() {
|
||||
return matches.toSorted(Comparator.naturalOrder()) ?: {throw new RuntimeException('Failed to find any targets, please ensure that method names and descriptors are correct.')}()
|
||||
return matches.stream().sorted().toList() ?: {throw new RuntimeException('Failed to find any targets, please ensure that method names and descriptors are correct.')}()
|
||||
}
|
||||
}
|
||||
+7
-7
@@ -2,7 +2,7 @@
|
||||
|
||||
MinecraftForge
|
||||
=============
|
||||
[][Download]
|
||||
[][Download]
|
||||
[][Download] [][Discord] [][Patreon]
|
||||
|
||||
@@ -27,7 +27,7 @@ You can download the installer for the *Recommended Build* or the
|
||||
*Latest build* there. Latest builds may have newer features but may be
|
||||
more unstable as a result. The installer will attempt to install Forge
|
||||
into your vanilla launcher environment, where you can then create a new
|
||||
profile using that version and play the game!
|
||||
profile using that version and play the game!
|
||||
|
||||
For support and questions, visit [the Support Forum][Support-Forum] or [the Forge Discord server][Discord].
|
||||
|
||||
@@ -68,9 +68,9 @@ Please ensure you have a valid email address associated with your GitHub account
|
||||
|
||||
[Discord]: https://discord.minecraftforge.net/
|
||||
|
||||
[Documentation]: https://docs.minecraftforge.net/
|
||||
[Getting-Started]: https://docs.minecraftforge.net/en/latest/gettingstarted/
|
||||
[ForgeDev]: https://docs.minecraftforge.net/en/latest/forgedev/
|
||||
[Pull-Requests]: https://docs.minecraftforge.net/en/latest/forgedev/#making-changes-and-pull-requests
|
||||
[Documentation]: https://docs.minecraftforge.net/en/1.20.1/
|
||||
[Getting-Started]: https://docs.minecraftforge.net/en/1.20.1/gettingstarted/
|
||||
[ForgeDev]: https://docs.minecraftforge.net/en/1.20.1/forgedev/
|
||||
[Pull-Requests]: https://docs.minecraftforge.net/en/1.20.1/forgedev/#making-changes-and-pull-requests
|
||||
|
||||
[Patreon]: https://www.patreon.com/MinecraftForge
|
||||
[Patreon]: https://www.patreon.com/LexManos
|
||||
@@ -95,5 +95,24 @@ public interface IExtensionPoint<T extends Record>
|
||||
@SuppressWarnings("JavadocReference") // reference to NetworkConstants, ForgeHooksClient
|
||||
record DisplayTest(Supplier<String> suppliedVersion, BiPredicate<String, Boolean> remoteVersionTest) implements IExtensionPoint<DisplayTest> {
|
||||
public static final String IGNORESERVERONLY = "OHNOES\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31\uD83D\uDE31";
|
||||
|
||||
/**
|
||||
* Ignores any version information coming from the server - use for server only mods
|
||||
*/
|
||||
public static final Supplier<DisplayTest> IGNORE_SERVER_VERSION = () -> new DisplayTest(IGNORESERVERONLY, (remoteVersion, isFromServer) -> true);
|
||||
|
||||
/**
|
||||
* Ignores all information and provides no information
|
||||
*/
|
||||
public static final Supplier<DisplayTest> IGNORE_ALL_VERSION = () -> new DisplayTest("", (remoteVersion, isFromServer) -> true);
|
||||
|
||||
/**
|
||||
* An optional alternative to {@link #DisplayTest(Supplier, BiPredicate)} which accepts a constant version string
|
||||
* instead of a {@link Supplier}.
|
||||
* <p>Internally, the provided version string is wrapped in a Supplier for you.</p>
|
||||
*/
|
||||
public DisplayTest(String version, BiPredicate<String, Boolean> remoteVersionTest) {
|
||||
this(() -> version, remoteVersionTest);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@@ -64,9 +65,9 @@ public abstract class ModContainer
|
||||
() -> new IExtensionPoint.DisplayTest(() -> this.modInfo.getVersion().toString(),
|
||||
(incoming, isNetwork) -> Objects.equals(incoming, this.modInfo.getVersion().toString()));
|
||||
case "IGNORE_SERVER_VERSION" -> // Ignores any version information coming from the server - use for server only mods
|
||||
() -> new IExtensionPoint.DisplayTest(() -> IExtensionPoint.DisplayTest.IGNORESERVERONLY, (incoming, isNetwork) -> true);
|
||||
IExtensionPoint.DisplayTest.IGNORE_SERVER_VERSION;
|
||||
case "IGNORE_ALL_VERSION" -> // Ignores all information and provides no information
|
||||
() -> new IExtensionPoint.DisplayTest(() -> "", (incoming, isNetwork) -> true);
|
||||
IExtensionPoint.DisplayTest.IGNORE_ALL_VERSION;
|
||||
case "NONE" -> null; // NO display test at all - use this if you're going to do your own display test
|
||||
default -> // any other value throws an exception
|
||||
throw new IllegalArgumentException("Invalid displayTest value supplied in mods.toml");
|
||||
@@ -145,6 +146,22 @@ public abstract class ModContainer
|
||||
extensionPoints.put(point, extension);
|
||||
}
|
||||
|
||||
public void registerDisplayTest(IExtensionPoint.DisplayTest displayTest) {
|
||||
registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> displayTest);
|
||||
}
|
||||
|
||||
public void registerDisplayTest(Supplier<IExtensionPoint.DisplayTest> displayTest) {
|
||||
registerExtensionPoint(IExtensionPoint.DisplayTest.class, displayTest);
|
||||
}
|
||||
|
||||
public void registerDisplayTest(String version, BiPredicate<String, Boolean> remoteVersionTest) {
|
||||
registerDisplayTest(new IExtensionPoint.DisplayTest(version, remoteVersionTest));
|
||||
}
|
||||
|
||||
public void registerDisplayTest(Supplier<String> suppliedVersion, BiPredicate<String, Boolean> remoteVersionTest) {
|
||||
registerDisplayTest(new IExtensionPoint.DisplayTest(suppliedVersion, remoteVersionTest));
|
||||
}
|
||||
|
||||
public void addConfig(final ModConfig modConfig) {
|
||||
configs.put(modConfig.getType(), modConfig);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import net.minecraftforge.fml.loading.FMLLoader;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class ModLoadingContext
|
||||
@@ -50,6 +51,44 @@ public class ModLoadingContext
|
||||
getActiveContainer().registerExtensionPoint(point, extension);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a {@link IExtensionPoint.DisplayTest} with the mod container.
|
||||
* <p>A shorthand for registering a DisplayTest with {@link #registerExtensionPoint(Class, Supplier)}.</p>
|
||||
* @param displayTest The {@link IExtensionPoint.DisplayTest} to register
|
||||
*/
|
||||
public void registerDisplayTest(IExtensionPoint.DisplayTest displayTest) {
|
||||
getActiveContainer().registerDisplayTest(() -> displayTest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a {@link IExtensionPoint.DisplayTest} with the mod container.
|
||||
* <p>A shorthand for registering a DisplayTest supplier with {@link #registerExtensionPoint(Class, Supplier)}.</p>
|
||||
* @param displayTest The {@link Supplier<IExtensionPoint.DisplayTest>} to register
|
||||
*/
|
||||
public void registerDisplayTest(Supplier<IExtensionPoint.DisplayTest> displayTest) {
|
||||
getActiveContainer().registerDisplayTest(displayTest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a {@link IExtensionPoint.DisplayTest} with the mod container.
|
||||
* <p>A shorthand for registering a DisplayTest with {@link #registerExtensionPoint(Class, Supplier)} that also
|
||||
* creates the DisplayTest instance for you using the provided parameters.</p>
|
||||
* @see IExtensionPoint.DisplayTest#DisplayTest(String, BiPredicate)
|
||||
*/
|
||||
public void registerDisplayTest(String version, BiPredicate<String, Boolean> remoteVersionTest) {
|
||||
getActiveContainer().registerDisplayTest(new IExtensionPoint.DisplayTest(version, remoteVersionTest));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a {@link IExtensionPoint.DisplayTest} with the mod container.
|
||||
* <p>A shorthand for registering a DisplayTest with {@link #registerExtensionPoint(Class, Supplier)} that also
|
||||
* creates the DisplayTest instance for you using the provided parameters.</p>
|
||||
* @see IExtensionPoint.DisplayTest#DisplayTest(Supplier, BiPredicate)
|
||||
*/
|
||||
public void registerDisplayTest(Supplier<String> suppliedVersion, BiPredicate<String, Boolean> remoteVersionTest) {
|
||||
getActiveContainer().registerDisplayTest(new IExtensionPoint.DisplayTest(suppliedVersion, remoteVersionTest));
|
||||
}
|
||||
|
||||
public void registerConfig(ModConfig.Type type, IConfigSpec<?> spec) {
|
||||
if (spec.isEmpty())
|
||||
{
|
||||
|
||||
+29
-15
@@ -32,7 +32,7 @@ import java.lang.reflect.Modifier;
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
@@ -40,15 +40,16 @@ import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.IntConsumer;
|
||||
import java.util.function.IntSupplier;
|
||||
import java.util.function.LongSupplier;
|
||||
@@ -78,7 +79,7 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger("EARLYDISPLAY");
|
||||
private final AtomicBoolean animationTimerTrigger = new AtomicBoolean(true);
|
||||
|
||||
private ColourScheme colourScheme;
|
||||
private ColourScheme colourScheme = ColourScheme.RED;
|
||||
private ElementShader elementShader;
|
||||
|
||||
private RenderElement.DisplayContext context;
|
||||
@@ -86,6 +87,7 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
private int framecount;
|
||||
private EarlyFramebuffer framebuffer;
|
||||
private ScheduledFuture<?> windowTick;
|
||||
private ScheduledFuture<?> initializationFuture;
|
||||
|
||||
private PerformanceInfo performanceInfo;
|
||||
private ScheduledFuture<?> performanceTick;
|
||||
@@ -134,13 +136,17 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
this.colourScheme = ColourScheme.BLACK;
|
||||
} else {
|
||||
try {
|
||||
var optionLines = Files.readAllLines(FMLPaths.GAMEDIR.get().resolve(Paths.get("options.txt")));
|
||||
var options = optionLines.stream().map(l -> l.split(":")).filter(a -> a.length == 2).collect(Collectors.toMap(a -> a[0], a -> a[1]));
|
||||
var colourScheme = Boolean.parseBoolean(options.getOrDefault("darkMojangStudiosBackground", "false"));
|
||||
this.colourScheme = colourScheme ? ColourScheme.BLACK : ColourScheme.RED;
|
||||
} catch (IOException ioe) {
|
||||
// No options
|
||||
this.colourScheme = ColourScheme.RED; // default to red colourscheme
|
||||
// check the options file for the colour scheme
|
||||
var optionLines = Files.readAllLines(FMLPaths.GAMEDIR.get().resolve(Path.of("options.txt")));
|
||||
var keyName = "darkMojangStudiosBackground:";
|
||||
for (String line : optionLines) {
|
||||
if (line.startsWith(keyName)) {
|
||||
this.colourScheme = line.startsWith("true", keyName.length()) ? ColourScheme.BLACK : ColourScheme.RED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
this.colourScheme = ColourScheme.RED; // fallback to red colourScheme
|
||||
}
|
||||
}
|
||||
this.maximized = parsed.has(maximizedopt) || FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_MAXIMIZED);
|
||||
@@ -225,7 +231,7 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
LOGGER.error("Crash during font initialization", t);
|
||||
crashElegantly("An error occurred initializing a font for rendering. "+t.getMessage());
|
||||
}
|
||||
this.elements = new ArrayList<>(Arrays.asList(
|
||||
this.elements = new ArrayList<>(List.of(
|
||||
RenderElement.anvil(font),
|
||||
RenderElement.logMessageOverlay(font),
|
||||
RenderElement.forgeVersionOverlay(font, mcVersion+"-"+forgeVersion.split("-")[0]),
|
||||
@@ -264,7 +270,6 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
public void render(int alpha) {
|
||||
var currentVAO = glGetInteger(GL_VERTEX_ARRAY_BINDING);
|
||||
var currentFB = glGetInteger(GL_READ_FRAMEBUFFER_BINDING);
|
||||
glfwSwapInterval(0);
|
||||
glViewport(0, 0, this.context.scaledWidth(), this.context.scaledHeight());
|
||||
RenderElement.globalAlpha = alpha;
|
||||
framebuffer.activate();
|
||||
@@ -287,7 +292,7 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
return thread;
|
||||
});
|
||||
initWindow(mcVersion);
|
||||
renderScheduler.schedule(() -> initRender(mcVersion, forgeVersion), 1, TimeUnit.MILLISECONDS);
|
||||
this.initializationFuture = renderScheduler.schedule(() -> initRender(mcVersion, forgeVersion), 1, TimeUnit.MILLISECONDS);
|
||||
return this::periodicTick;
|
||||
}
|
||||
|
||||
@@ -518,6 +523,16 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
* @return the Window we own.
|
||||
*/
|
||||
public long setupMinecraftWindow(final IntSupplier width, final IntSupplier height, final Supplier<String> title, final LongSupplier monitorSupplier) {
|
||||
// wait for the window to actually be initialized
|
||||
try {
|
||||
this.initializationFuture.get(30, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (TimeoutException e) {
|
||||
Thread.dumpStack();
|
||||
crashElegantly("We seem to be having trouble initializing the window, waited for 30 seconds");
|
||||
}
|
||||
|
||||
// we have to spin wait for the window ticker
|
||||
ImmediateWindowHandler.updateProgress("Initializing Game Graphics");
|
||||
while (!this.windowTick.isDone()) {
|
||||
@@ -584,8 +599,7 @@ public class DisplayWindow implements ImmediateWindowProvider {
|
||||
var fm = layer.findModule("forge").orElseThrow();
|
||||
getClass().getModule().addReads(fm);
|
||||
var clz = FMLLoader.getGameLayer().findModule("forge").map(l->Class.forName(l, "net.minecraftforge.client.loading.ForgeLoadingOverlay")).orElseThrow();
|
||||
var methods = Arrays.stream(clz.getMethods()).filter(m-> Modifier.isStatic(m.getModifiers())).collect(Collectors.toMap(Method::getName, Function.identity()));
|
||||
loadingOverlay = methods.get("newInstance");
|
||||
loadingOverlay = Arrays.stream(clz.getMethods()).filter(m-> Modifier.isStatic(m.getModifiers()) && m.getName().equals("newInstance")).findFirst().orElseThrow();
|
||||
}
|
||||
|
||||
public int getFramebufferTextureId() {
|
||||
|
||||
+14
-4
@@ -6,6 +6,7 @@
|
||||
package net.minecraftforge.fml.earlydisplay;
|
||||
|
||||
import com.sun.management.OperatingSystemMXBean;
|
||||
import net.minecraftforge.fml.loading.FMLConfig;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.MemoryMXBean;
|
||||
@@ -13,28 +14,37 @@ import java.lang.management.MemoryUsage;
|
||||
|
||||
public class PerformanceInfo {
|
||||
|
||||
private final boolean showCPUUsage;
|
||||
private final OperatingSystemMXBean osBean;
|
||||
private final MemoryMXBean memoryBean;
|
||||
|
||||
float memory;
|
||||
private String text;
|
||||
|
||||
PerformanceInfo() {
|
||||
osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
|
||||
showCPUUsage = FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_SHOW_CPU);
|
||||
osBean = showCPUUsage ? ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class) : null;
|
||||
memoryBean = ManagementFactory.getMemoryMXBean();
|
||||
}
|
||||
|
||||
void update() {
|
||||
final MemoryUsage heapusage = memoryBean.getHeapMemoryUsage();
|
||||
memory = (float) heapusage.getUsed() / heapusage.getMax();
|
||||
|
||||
if (!showCPUUsage) {
|
||||
text = "Heap: %d/%d MB (%.1f%%) OffHeap: %d MB".formatted(heapusage.getUsed() >> 20, heapusage.getMax() >> 20, memory * 100.0, memoryBean.getNonHeapMemoryUsage().getUsed() >> 20);
|
||||
return;
|
||||
}
|
||||
|
||||
var cpuLoad = osBean.getProcessCpuLoad();
|
||||
String cpuText;
|
||||
if (cpuLoad == -1) {
|
||||
cpuText = String.format("*CPU: %.1f%%", osBean.getCpuLoad() * 100f);
|
||||
cpuText = "*CPU: %.1f%%".formatted(osBean.getCpuLoad() * 100f);
|
||||
} else {
|
||||
cpuText = String.format("CPU: %.1f%%", cpuLoad * 100f);
|
||||
cpuText = "CPU: %.1f%%".formatted(cpuLoad * 100f);
|
||||
}
|
||||
|
||||
text = String.format("Heap: %d/%d MB (%.1f%%) OffHeap: %d MB %s", heapusage.getUsed() >> 20, heapusage.getMax() >> 20, memory * 100.0, memoryBean.getNonHeapMemoryUsage().getUsed() >> 20, cpuText);
|
||||
text = "Heap: %d/%d MB (%.1f%%) OffHeap: %d MB %s".formatted(heapusage.getUsed() >> 20, heapusage.getMax() >> 20, memory * 100.0, memoryBean.getNonHeapMemoryUsage().getUsed() >> 20, cpuText);
|
||||
}
|
||||
|
||||
String text() {
|
||||
|
||||
+8
-2
@@ -34,11 +34,14 @@ public class RenderElement {
|
||||
};
|
||||
}
|
||||
}
|
||||
@FunctionalInterface
|
||||
interface TextureRenderer {
|
||||
void accept(SimpleBufferBuilder bb, DisplayContext context, int[] size, int frame);
|
||||
}
|
||||
@FunctionalInterface
|
||||
interface Initializer extends Supplier<Renderer> {}
|
||||
|
||||
@FunctionalInterface
|
||||
interface TextGenerator {
|
||||
void accept(SimpleBufferBuilder bb, SimpleFont fh, DisplayContext ctx);
|
||||
}
|
||||
@@ -201,14 +204,17 @@ public class RenderElement {
|
||||
bar.then(label).accept(buffer, context, frameNumber);
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
interface ColourFunction {
|
||||
int colour(int frame);
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
interface ProgressDisplay {
|
||||
float[] progress(int frame);
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
interface BarPosition {
|
||||
int[] location(DisplayContext context);
|
||||
}
|
||||
@@ -280,7 +286,7 @@ public class RenderElement {
|
||||
if (num < min) {
|
||||
return min;
|
||||
} else {
|
||||
return num > max ? max : num;
|
||||
return Math.min(num, max);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -288,7 +294,7 @@ public class RenderElement {
|
||||
if (num < min) {
|
||||
return min;
|
||||
} else {
|
||||
return num > max ? max : num;
|
||||
return Math.min(num, max);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.4 MiB |
@@ -77,7 +77,7 @@ jar.doFirst {
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
options.compilerArgs << '-Xlint:unchecked'
|
||||
options.compilerArgs << '-Xlint:-unchecked'
|
||||
}
|
||||
|
||||
license {
|
||||
|
||||
@@ -36,7 +36,8 @@ public class FMLConfig
|
||||
EARLY_WINDOW_FBSCALE("earlyWindowFBScale", 1, "Early window framebuffer scale"),
|
||||
EARLY_WINDOW_MAXIMIZED("earlyWindowMaximized", Boolean.FALSE, "Early window starts maximized"),
|
||||
EARLY_WINDOW_SKIP_GL_VERSIONS("earlyWindowSkipGLVersions", List.of(), "Skip specific GL versions, may help with buggy graphics card drivers"),
|
||||
EARLY_WINDOW_SQUIR("earlyWindowSquir", Boolean.FALSE, "Squir?")
|
||||
EARLY_WINDOW_SQUIR("earlyWindowSquir", Boolean.FALSE, "Squir?"),
|
||||
EARLY_WINDOW_SHOW_CPU("earlyWindowShowCPU", Boolean.FALSE, "Whether to show CPU usage stats in early window"),
|
||||
;
|
||||
|
||||
private final String entry;
|
||||
|
||||
@@ -18,12 +18,15 @@ import java.util.function.BiPredicate;
|
||||
public class VersionSupportMatrix {
|
||||
private static final HashMap<String, List<ArtifactVersion>> overrideVersions = new HashMap<>();
|
||||
static {
|
||||
final ArtifactVersion version = new DefaultArtifactVersion(FMLLoader.versionInfo().mcVersion());
|
||||
if (MavenVersionAdapter.createFromVersionSpec("[1.19.2]").containsVersion(version)) {
|
||||
// 1.19.2 is Compatible with 1.19.1
|
||||
add("languageloader.javafml", "42");
|
||||
add("mod.minecraft", "1.19.1");
|
||||
add("mod.forge", "42.0.9");
|
||||
// final ArtifactVersion version = new DefaultArtifactVersion(FMLLoader.versionInfo().mcVersion());
|
||||
// if (MavenVersionAdapter.createFromVersionSpec("[1.19.2]").containsVersion(version)) {
|
||||
// // 1.19.2 is Compatible with 1.19.1
|
||||
// add("languageloader.javafml", "42");
|
||||
// add("mod.minecraft", "1.19.1");
|
||||
// add("mod.forge", "42.0.9");
|
||||
// }
|
||||
if (FMLLoader.versionInfo().mcVersion().equals("1.20.1")) {
|
||||
add("mod.forge", "47.1.79");
|
||||
}
|
||||
}
|
||||
private static void add(String key, String value) {
|
||||
|
||||
@@ -80,7 +80,8 @@ public class ModInfo implements IModInfo, IConfigurable
|
||||
this.displayName = config.<String>getConfigElement("displayName")
|
||||
.orElse(this.modId);
|
||||
this.description = config.<String>getConfigElement("description")
|
||||
.orElse("MISSING DESCRIPTION");
|
||||
.orElse("MISSING DESCRIPTION")
|
||||
.replace("\r\n", "\n").stripIndent();
|
||||
this.logoFile = Optional.ofNullable(config.<String>getConfigElement("logoFile")
|
||||
.orElseGet(() -> ownFile.flatMap(mf -> mf.<String>getConfigElement("logoFile"))
|
||||
.orElse(null)));
|
||||
@@ -205,7 +206,7 @@ public class ModInfo implements IModInfo, IConfigurable
|
||||
private final boolean mandatory;
|
||||
private final Ordering ordering;
|
||||
private final DependencySide side;
|
||||
private Optional<URL> referralUrl;
|
||||
private final Optional<URL> referralUrl;
|
||||
|
||||
public ModVersion(final IModInfo owner, final IConfigurable config) {
|
||||
this.owner = owner;
|
||||
|
||||
+26
-4
@@ -6,6 +6,7 @@
|
||||
package net.minecraftforge.fml.loading.moddiscovery;
|
||||
|
||||
import com.mojang.logging.LogUtils;
|
||||
import cpw.mods.jarhandling.SecureJar;
|
||||
import cpw.mods.modlauncher.api.IModuleLayerManager;
|
||||
import cpw.mods.modlauncher.api.ITransformationService;
|
||||
import net.minecraftforge.fml.loading.*;
|
||||
@@ -26,14 +27,17 @@ public class ModValidator {
|
||||
private final Map<IModFile.Type, List<ModFile>> modFiles;
|
||||
private final List<ModFile> candidatePlugins;
|
||||
private final List<ModFile> candidateMods;
|
||||
private final List<ModFile> gameLibraries;
|
||||
private LoadingModList loadingModList;
|
||||
private List<IModFile> brokenFiles;
|
||||
private final List<IModFile> brokenFiles;
|
||||
private final List<EarlyLoadingException.ExceptionData> discoveryErrorData;
|
||||
|
||||
public ModValidator(final Map<IModFile.Type, List<ModFile>> modFiles, final List<IModFileInfo> brokenFiles, final List<EarlyLoadingException.ExceptionData> discoveryErrorData) {
|
||||
this.modFiles = modFiles;
|
||||
this.candidateMods = lst(modFiles.get(IModFile.Type.MOD));
|
||||
this.candidateMods.addAll(lst(modFiles.get(IModFile.Type.GAMELIBRARY)));
|
||||
this.gameLibraries = lst(modFiles.get(IModFile.Type.GAMELIBRARY));
|
||||
this.candidateMods.addAll(this.gameLibraries);
|
||||
this.candidatePlugins = lst(modFiles.get(IModFile.Type.LANGPROVIDER));
|
||||
this.candidatePlugins.addAll(lst(modFiles.get(IModFile.Type.LIBRARY)));
|
||||
this.discoveryErrorData = discoveryErrorData;
|
||||
@@ -55,8 +59,7 @@ public class ModValidator {
|
||||
@NotNull
|
||||
private List<ModFile> validateFiles(final List<ModFile> mods) {
|
||||
final List<ModFile> brokenFiles = new ArrayList<>();
|
||||
for (Iterator<ModFile> iterator = mods.iterator(); iterator.hasNext(); )
|
||||
{
|
||||
for (Iterator<ModFile> iterator = mods.iterator(); iterator.hasNext();) {
|
||||
ModFile modFile = iterator.next();
|
||||
if (!modFile.getProvider().isValid(modFile) || !modFile.identifyMods()) {
|
||||
LOGGER.warn(LogMarkers.SCAN, "File {} has been ignored - it is invalid", modFile.getFilePath());
|
||||
@@ -72,7 +75,26 @@ public class ModValidator {
|
||||
}
|
||||
|
||||
public ITransformationService.Resource getModResources() {
|
||||
return new ITransformationService.Resource(IModuleLayerManager.Layer.GAME, this.candidateMods.stream().map(IModFile::getSecureJar).toList());
|
||||
var mods = new ArrayList<SecureJar>();
|
||||
// Add only the valid mods that we will be attempting to load.
|
||||
// If any detectable error happens during the sorting process {missing deps, duplicates,
|
||||
// This helps prevent coremods/mixins from screwing up us displaying the error screens that the sorting/validation is trying to display.
|
||||
// This won't fix them all as they are still loaded and will still apply but it might help
|
||||
for (var info : this.loadingModList.getModFiles())
|
||||
mods.add(info.getFile().getSecureJar());
|
||||
|
||||
// Add any game libraries, this *may* be duplicates, depending on the state of the sorting. But until I get around to re-writing
|
||||
// that clusterfuck of a system, have this simple de-duplication. Order of resource is important, but i'm unsure if duplication is
|
||||
// so might as well waste a few cycles on checking. Still faster then converting from a set to a list.
|
||||
// Ideally we would explicitly list out which mods to load {forge and MC being the only ones} but some coremods could require extra things.
|
||||
// So try game libraries as well
|
||||
for (var lib : this.gameLibraries) {
|
||||
var jar = lib.getSecureJar();
|
||||
if (!mods.contains(jar))
|
||||
mods.add(jar);
|
||||
}
|
||||
|
||||
return new ITransformationService.Resource(IModuleLayerManager.Layer.GAME, mods);
|
||||
}
|
||||
|
||||
private List<EarlyLoadingException.ExceptionData> validateLanguages() {
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
public final class ProgressMeter {
|
||||
private final String name;
|
||||
private final int steps;
|
||||
private AtomicInteger current;
|
||||
private final AtomicInteger current;
|
||||
private Message label;
|
||||
|
||||
public ProgressMeter(String name, int steps, int current, Message label) {
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -85,9 +85,6 @@ done
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
@@ -144,7 +141,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@@ -152,7 +149,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@@ -197,6 +194,10 @@ if "$cygwin" || "$msys" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
|
||||
@@ -21,6 +21,8 @@ import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.Marker;
|
||||
import org.apache.logging.log4j.MarkerManager;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class FMLModContainer extends ModContainer
|
||||
@@ -70,6 +72,11 @@ public class FMLModContainer extends ModContainer
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
// When a mod constructor throws an exception, it's wrapped in an InvocationTargetException which hides the
|
||||
// actual exception from the mod loading error screen.
|
||||
if (e instanceof InvocationTargetException wrapped)
|
||||
e = Objects.requireNonNullElse(wrapped.getCause(), e); // unwrap the exception
|
||||
|
||||
LOGGER.error(LOADING,"Failed to create mod instance. ModID: {}, class {}", getModId(), modClass.getName(), e);
|
||||
throw new ModLoadingException(modInfo, ModLoadingStage.CONSTRUCT, "fml.modloading.failedtoloadmod", e, modClass);
|
||||
}
|
||||
|
||||
+7
-7
@@ -16,19 +16,19 @@ Step 1: Open your command-line and browse to the folder where you extracted the
|
||||
|
||||
Step 2: You're left with a choice.
|
||||
If you prefer to use Eclipse:
|
||||
1. Run the following command: `gradlew genEclipseRuns` (`./gradlew genEclipseRuns` if you are on Mac/Linux)
|
||||
1. Run the following command: `./gradlew genEclipseRuns`
|
||||
2. Open Eclipse, Import > Existing Gradle Project > Select Folder
|
||||
or run `gradlew eclipse` to generate the project.
|
||||
|
||||
If you prefer to use IntelliJ:
|
||||
1. Open IDEA, and import project.
|
||||
2. Select your build.gradle file and have it import.
|
||||
3. Run the following command: `gradlew genIntellijRuns` (`./gradlew genIntellijRuns` if you are on Mac/Linux)
|
||||
3. Run the following command: `./gradlew genIntellijRuns`
|
||||
4. Refresh the Gradle Project in IDEA if required.
|
||||
|
||||
If at any point you are missing libraries in your IDE, or you've run into problems you can
|
||||
run `gradlew --refresh-dependencies` to refresh the local cache. `gradlew clean` to reset everything
|
||||
{this does not affect your code} and then start the process again.
|
||||
(this does not affect your code) and then start the process again.
|
||||
|
||||
Mapping Names:
|
||||
=============================
|
||||
@@ -40,7 +40,7 @@ https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md
|
||||
|
||||
Additional Resources:
|
||||
=========================
|
||||
Community Documentation: https://mcforge.readthedocs.io/en/latest/gettingstarted/
|
||||
LexManos' Install Video: https://www.youtube.com/watch?v=8VEdtQLuLO0
|
||||
Forge Forum: https://forums.minecraftforge.net/
|
||||
Forge Discord: https://discord.gg/UvedJ9m
|
||||
Community Documentation: https://docs.minecraftforge.net/en/1.20.1/gettingstarted/
|
||||
LexManos' Install Video: https://youtu.be/8VEdtQLuLO0
|
||||
Forge Forums: https://forums.minecraftforge.net/
|
||||
Forge Discord: https://discord.minecraftforge.net/
|
||||
+1
-1
@@ -9,5 +9,5 @@ pluginManagement {
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/com/mojang/blaze3d/vertex/SheetedDecalTextureGenerator.java
|
||||
+++ b/com/mojang/blaze3d/vertex/SheetedDecalTextureGenerator.java
|
||||
@@ -46,7 +_,7 @@
|
||||
|
||||
public void m_5752_() {
|
||||
Vector3f vector3f = this.f_85869_.transform(new Vector3f(this.f_85876_, this.f_85877_, this.f_85878_));
|
||||
- Direction direction = Direction.m_122372_(vector3f.x(), vector3f.y(), vector3f.z());
|
||||
+ Direction direction = net.minecraftforge.client.ForgeHooksClient.getNearestStable(vector3f.x(), vector3f.y(), vector3f.z());
|
||||
Vector4f vector4f = this.f_85868_.transform(new Vector4f(this.f_85870_, this.f_85871_, this.f_85872_, 1.0F));
|
||||
vector4f.rotateY((float)Math.PI);
|
||||
vector4f.rotateX((-(float)Math.PI / 2F));
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/CrashReport.java
|
||||
+++ b/net/minecraft/CrashReport.java
|
||||
@@ -57,14 +_,8 @@
|
||||
@@ -57,14 +_,9 @@
|
||||
if (this.f_127506_ != null && this.f_127506_.length > 0) {
|
||||
p_127520_.append("-- Head --\n");
|
||||
p_127520_.append("Thread: ").append(Thread.currentThread().getName()).append("\n");
|
||||
@@ -12,6 +12,7 @@
|
||||
- }
|
||||
-
|
||||
- p_127520_.append("\n");
|
||||
+ p_127520_.append(net.minecraftforge.logging.CrashReportAnalyser.appendSuspectedMods(this.f_127501_, this.f_127506_));
|
||||
+ p_127520_.append("Stacktrace:");
|
||||
+ p_127520_.append(net.minecraftforge.logging.CrashReportExtender.generateEnhancedStackTrace(this.f_127506_));
|
||||
}
|
||||
|
||||
@@ -12,6 +12,15 @@
|
||||
private static final Set<String> f_90811_ = Sets.newHashSet();
|
||||
public static final String f_167805_ = "key.categories.movement";
|
||||
public static final String f_167806_ = "key.categories.misc";
|
||||
@@ -41,7 +_,7 @@
|
||||
private int f_90818_;
|
||||
|
||||
public static void m_90835_(InputConstants.Key p_90836_) {
|
||||
- KeyMapping keymapping = f_90810_.get(p_90836_);
|
||||
+ for (KeyMapping keymapping : f_90810_.getAll(p_90836_))
|
||||
if (keymapping != null) {
|
||||
++keymapping.f_90818_;
|
||||
}
|
||||
@@ -49,7 +_,7 @@
|
||||
}
|
||||
|
||||
@@ -81,12 +90,12 @@
|
||||
}
|
||||
|
||||
public String m_90865_() {
|
||||
@@ -184,4 +_,84 @@
|
||||
@@ -183,5 +_,88 @@
|
||||
|
||||
public void m_7249_(boolean p_90846_) {
|
||||
this.f_90817_ = p_90846_;
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+ /****************** Forge Start *****************************/
|
||||
+ private net.minecraftforge.client.settings.KeyModifier keyModifierDefault = net.minecraftforge.client.settings.KeyModifier.NONE;
|
||||
+ private net.minecraftforge.client.settings.KeyModifier keyModifier = net.minecraftforge.client.settings.KeyModifier.NONE;
|
||||
+ private net.minecraftforge.client.settings.IKeyConflictContext keyConflictContext = net.minecraftforge.client.settings.KeyConflictContext.UNIVERSAL;
|
||||
@@ -156,13 +165,17 @@
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void setKeyModifierAndCode(net.minecraftforge.client.settings.KeyModifier keyModifier, InputConstants.Key keyCode) {
|
||||
+ this.f_90816_ = keyCode;
|
||||
+ if (keyModifier.matches(keyCode))
|
||||
+ keyModifier = net.minecraftforge.client.settings.KeyModifier.NONE;
|
||||
+ public void setKeyModifierAndCode(@org.jetbrains.annotations.Nullable net.minecraftforge.client.settings.KeyModifier keyModifier, InputConstants.Key keyCode) {
|
||||
+ f_90810_.remove(this);
|
||||
+
|
||||
+ if (keyModifier == null)
|
||||
+ keyModifier = net.minecraftforge.client.settings.KeyModifier.getModifier(this.f_90816_);
|
||||
+ if (keyModifier == null || keyCode == InputConstants.f_84822_ || net.minecraftforge.client.settings.KeyModifier.isKeyCodeModifier(keyCode))
|
||||
+ keyModifier = net.minecraftforge.client.settings.KeyModifier.NONE;
|
||||
+
|
||||
+ this.f_90816_ = keyCode;
|
||||
+ this.keyModifier = keyModifier;
|
||||
+
|
||||
+ f_90810_.put(keyCode, this);
|
||||
+ }
|
||||
+ /****************** Forge End *****************************/
|
||||
}
|
||||
}
|
||||
@@ -1,25 +1,5 @@
|
||||
--- a/net/minecraft/client/KeyboardHandler.java
|
||||
+++ b/net/minecraft/client/KeyboardHandler.java
|
||||
@@ -329,7 +_,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (p_90897_ == 1 && (!(this.f_90867_.f_91080_ instanceof KeyBindsScreen) || ((KeyBindsScreen)screen).f_193976_ <= Util.m_137550_() - 20L)) {
|
||||
+
|
||||
+ if ((!(this.f_90867_.f_91080_ instanceof KeyBindsScreen) || ((KeyBindsScreen)screen).f_193976_ <= Util.m_137550_() - 20L)) {
|
||||
+ if (p_90897_ == 1) {
|
||||
if (this.f_90867_.f_91066_.f_92105_.m_90832_(p_90895_, p_90896_)) {
|
||||
this.f_90867_.m_91268_().m_85438_();
|
||||
this.f_90867_.f_91066_.m_231829_().m_231514_(this.f_90867_.m_91268_().m_85440_());
|
||||
@@ -347,6 +_,8 @@
|
||||
});
|
||||
return;
|
||||
}
|
||||
+ } else if (p_90897_ == 0 /*GLFW_RELEASE*/ && this.f_90867_.f_91080_ instanceof KeyBindsScreen)
|
||||
+ ((KeyBindsScreen)this.f_90867_.f_91080_).f_193975_ = null; //Forge: Unset pure modifiers.
|
||||
}
|
||||
|
||||
if (this.f_90867_.m_240477_().m_93316_()) {
|
||||
@@ -369,11 +_,15 @@
|
||||
Screen.m_96579_(() -> {
|
||||
if (p_90897_ != 1 && p_90897_ != 2) {
|
||||
|
||||
@@ -17,8 +17,14 @@
|
||||
TextureAtlasSprite textureatlassprite = mobeffecttexturemanager.m_118732_(mobeffect);
|
||||
int i1 = j;
|
||||
float f1 = f;
|
||||
@@ -574,12 +_,13 @@
|
||||
@@ -572,16 +_,21 @@
|
||||
}
|
||||
|
||||
public void m_280295_(GuiGraphics p_283501_) {
|
||||
+ renderSelectedItemName(p_283501_, 0);
|
||||
+ }
|
||||
+
|
||||
+ public void renderSelectedItemName(GuiGraphics p_283501_, int yShift) {
|
||||
this.f_92986_.m_91307_().m_6180_("selectedItemName");
|
||||
if (this.f_92993_ > 0 && !this.f_92994_.m_41619_()) {
|
||||
- MutableComponent mutablecomponent = Component.m_237119_().m_7220_(this.f_92994_.m_41786_()).m_130940_(this.f_92994_.m_41791_().f_43022_);
|
||||
@@ -31,8 +37,11 @@
|
||||
+ Component highlightTip = this.f_92994_.getHighlightTip(mutablecomponent);
|
||||
+ int i = this.m_93082_().m_92852_(highlightTip);
|
||||
int j = (this.f_92977_ - i) / 2;
|
||||
int k = this.f_92978_ - 59;
|
||||
- int k = this.f_92978_ - 59;
|
||||
+ int k = this.f_92978_ - Math.max(yShift, 59);
|
||||
if (!this.f_92986_.f_91072_.m_105205_()) {
|
||||
k += 14;
|
||||
}
|
||||
@@ -593,7 +_,13 @@
|
||||
|
||||
if (l > 0) {
|
||||
|
||||
@@ -33,6 +33,26 @@
|
||||
int i = p_282636_.m_272191_(p_281596_, (float)p_281586_, (float)p_282816_, p_281743_, p_282394_, this.f_279612_.m_85850_().m_252922_(), this.f_279627_, Font.DisplayMode.NORMAL, 0, 15728880);
|
||||
this.m_286081_();
|
||||
return i;
|
||||
@@ -405,6 +_,10 @@
|
||||
}
|
||||
|
||||
public void m_280543_(ResourceLocation p_283059_, int p_283575_, int p_283192_, int p_281790_, int p_283642_, int p_282691_, int p_281912_, int p_281728_, int p_282324_) {
|
||||
+ blitRepeating(p_283059_, p_283575_, p_283192_, p_281790_, p_283642_, p_282691_, p_281912_, p_281728_, p_282324_, 256, 256);
|
||||
+ }
|
||||
+
|
||||
+ public void blitRepeating(ResourceLocation p_283059_, int p_283575_, int p_283192_, int p_281790_, int p_283642_, int p_282691_, int p_281912_, int p_281728_, int p_282324_, int textureWidth, int textureHeight) {
|
||||
int i = p_283575_;
|
||||
|
||||
int j;
|
||||
@@ -417,7 +_,7 @@
|
||||
for(IntIterator intiterator1 = m_280358_(p_283642_, p_282324_); intiterator1.hasNext(); l += i1) {
|
||||
i1 = intiterator1.nextInt();
|
||||
int j1 = (p_282324_ - i1) / 2;
|
||||
- this.m_280218_(p_283059_, i, l, p_282691_ + k, p_281912_ + j1, j, i1);
|
||||
+ this.m_280163_(p_283059_, i, l, p_282691_ + k, p_281912_ + j1, j, i1, textureWidth, textureHeight);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -477,6 +_,7 @@
|
||||
crashreportcategory.m_128165_("Item Type", () -> {
|
||||
return String.valueOf((Object)p_281675_.m_41720_());
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
--- a/net/minecraft/client/gui/screens/PauseScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/PauseScreen.java
|
||||
@@ -82,6 +_,7 @@
|
||||
} else {
|
||||
gridlayout$rowhelper.m_264139_(this.m_262456_(f_262254_, SocialInteractionsScreen::new));
|
||||
}
|
||||
+ gridlayout$rowhelper.m_264108_(Button.m_253074_(Component.m_237115_("fml.menu.mods"), button -> this.f_96541_.m_91152_(new net.minecraftforge.client.gui.ModListScreen(this))).m_252780_(f_262268_).m_253136_(), 2);
|
||||
|
||||
Component component = this.f_96541_.m_91090_() ? f_262217_ : f_262246_;
|
||||
this.f_252482_ = gridlayout$rowhelper.m_264108_(Button.m_253074_(component, (p_280815_) -> {
|
||||
+5
-1
@@ -34,7 +34,7 @@
|
||||
this.f_97334_.m_104401_(advancementtab.m_97182_(), true);
|
||||
break;
|
||||
}
|
||||
@@ -98,6 +_,11 @@
|
||||
@@ -98,9 +_,15 @@
|
||||
int i = (this.f_96543_ - 252) / 2;
|
||||
int j = (this.f_96544_ - 140) / 2;
|
||||
this.m_280273_(p_282589_);
|
||||
@@ -46,6 +46,10 @@
|
||||
this.m_97373_(p_282589_, p_282255_, p_283354_, i, j);
|
||||
this.m_280088_(p_282589_, i, j);
|
||||
this.m_280355_(p_282589_, p_282255_, p_283354_, i, j);
|
||||
+ super.m_88315_(p_282589_, p_282255_, p_283354_, p_283123_);
|
||||
}
|
||||
|
||||
public boolean m_7979_(double p_97347_, double p_97348_, int p_97349_, double p_97350_, double p_97351_) {
|
||||
@@ -135,10 +_,12 @@
|
||||
p_283395_.m_280218_(f_97329_, p_281890_, p_282532_, 0, 0, 252, 140);
|
||||
if (this.f_97335_.size() > 1) {
|
||||
|
||||
@@ -9,9 +9,11 @@
|
||||
}
|
||||
|
||||
public int m_5759_() {
|
||||
@@ -129,10 +_,11 @@
|
||||
@@ -128,11 +_,13 @@
|
||||
this.f_193911_ = p_193917_;
|
||||
this.f_193912_ = Button.m_253074_(p_193917_, (p_269618_) -> {
|
||||
KeyBindsList.this.f_193858_.f_193975_ = p_193916_;
|
||||
+ p_193916_.setKeyModifierAndCode(null, com.mojang.blaze3d.platform.InputConstants.f_84822_);
|
||||
KeyBindsList.this.m_269130_();
|
||||
- }).m_252987_(0, 0, 75, 20).m_252778_((p_253311_) -> {
|
||||
+ }).m_252987_(0, 0, 75 + 20 /* Forge: Add space */, 20).m_252778_((p_253311_) -> {
|
||||
|
||||
+23
-3
@@ -13,14 +13,34 @@
|
||||
public boolean m_7933_(int p_193987_, int p_193988_, int p_193989_) {
|
||||
if (this.f_193975_ != null) {
|
||||
if (p_193987_ == 256) {
|
||||
+ this.f_193975_.setKeyModifierAndCode(net.minecraftforge.client.settings.KeyModifier.getActiveModifier(), InputConstants.f_84822_);
|
||||
+ this.f_193975_.setKeyModifierAndCode(null, InputConstants.f_84822_);
|
||||
this.f_96282_.m_92159_(this.f_193975_, InputConstants.f_84822_);
|
||||
} else {
|
||||
+ this.f_193975_.setKeyModifierAndCode(net.minecraftforge.client.settings.KeyModifier.getActiveModifier(), InputConstants.m_84827_(p_193987_, p_193988_));
|
||||
+ this.f_193975_.setKeyModifierAndCode(null, InputConstants.m_84827_(p_193987_, p_193988_));
|
||||
this.f_96282_.m_92159_(this.f_193975_, InputConstants.m_84827_(p_193987_, p_193988_));
|
||||
}
|
||||
|
||||
+ if(!net.minecraftforge.client.settings.KeyModifier.isKeyCodeModifier(this.f_193975_.getKey()))
|
||||
+ if (p_193987_ == 256 || !net.minecraftforge.client.settings.KeyModifier.isKeyCodeModifier(this.f_193975_.getKey()))
|
||||
this.f_193975_ = null;
|
||||
this.f_193976_ = Util.m_137550_();
|
||||
this.f_193977_.m_269130_();
|
||||
@@ -67,6 +_,19 @@
|
||||
} else {
|
||||
return super.m_7933_(p_193987_, p_193988_, p_193989_);
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean m_7920_(int keyCode, int scanCode, int modifiers) {
|
||||
+ // Forge: We wait for a second key above if the first press is a modifier
|
||||
+ // but if they release the modifier then set it explicitly.
|
||||
+ var key = InputConstants.m_84827_(keyCode, scanCode);
|
||||
+ if (this.f_193975_ != null && this.f_193975_.getKey() == key) {
|
||||
+ this.f_193975_ = null;
|
||||
+ this.f_193976_ = Util.m_137550_();
|
||||
+ this.f_193977_.m_269130_();
|
||||
+ }
|
||||
+ return super.m_7920_(keyCode, scanCode, modifiers);
|
||||
}
|
||||
|
||||
public void m_88315_(GuiGraphics p_282556_, int p_193992_, int p_193993_, float p_193994_) {
|
||||
+9
-5
@@ -187,7 +187,7 @@
|
||||
list1.add(i++, creativemodetab.m_40786_().m_6881_().m_130940_(ChatFormatting.BLUE));
|
||||
}
|
||||
}
|
||||
@@ -639,13 +_,13 @@
|
||||
@@ -639,21 +_,22 @@
|
||||
}
|
||||
|
||||
protected void m_7286_(GuiGraphics p_282663_, float p_282504_, int p_282089_, int p_282249_) {
|
||||
@@ -203,8 +203,10 @@
|
||||
this.f_98510_.m_88315_(p_282663_, p_282089_, p_282249_, p_282504_);
|
||||
int j = this.f_97735_ + 175;
|
||||
int k = this.f_97736_ + 18;
|
||||
@@ -654,6 +_,7 @@
|
||||
p_282663_.m_280218_(f_98504_, j, k + (int)((float)(i - k - 17) * this.f_98508_), 232 + (this.m_98631_() ? 0 : 12), 0, 12, 15);
|
||||
int i = k + 112;
|
||||
if (f_98507_.m_40791_()) {
|
||||
- p_282663_.m_280218_(f_98504_, j, k + (int)((float)(i - k - 17) * this.f_98508_), 232 + (this.m_98631_() ? 0 : 12), 0, 12, 15);
|
||||
+ p_282663_.m_280218_(f_98507_.getTabsImage(), j, k + (int)((float)(i - k - 17) * this.f_98508_), 232 + (this.m_98631_() ? 0 : 12), 0, 12, 15);
|
||||
}
|
||||
|
||||
+ if (currentPage.getVisibleTabs().contains(f_98507_)) //Forge: only display tab selection when the selected tab is on the current page
|
||||
@@ -240,14 +242,16 @@
|
||||
int j = i * 26;
|
||||
int k = 0;
|
||||
int l = this.f_97735_ + this.m_258094_(p_283489_);
|
||||
@@ -720,6 +_,7 @@
|
||||
@@ -720,7 +_,8 @@
|
||||
i1 += this.f_97727_ - 4;
|
||||
}
|
||||
|
||||
- p_283590_.m_280218_(f_98504_, l, i1, j, k, 26, 32);
|
||||
+ com.mojang.blaze3d.systems.RenderSystem.enableBlend(); //Forge: Make sure blend is enabled else tabs show a white border.
|
||||
p_283590_.m_280218_(f_98504_, l, i1, j, k, 26, 32);
|
||||
+ p_283590_.m_280218_(p_283489_.getTabsImage(), l, i1, j, k, 26, 32);
|
||||
p_283590_.m_280168_().m_85836_();
|
||||
p_283590_.m_280168_().m_252880_(0.0F, 0.0F, 100.0F);
|
||||
l += 5;
|
||||
@@ -763,6 +_,14 @@
|
||||
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
BlockState blockstate = this.f_105189_.f_91073_.m_8055_(p_105270_);
|
||||
this.f_105189_.m_91301_().m_120581_(this.f_105189_.f_91073_, p_105270_, blockstate, 1.0F);
|
||||
this.m_233729_(this.f_105189_.f_91073_, (p_233757_) -> {
|
||||
+ if (!net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105270_, p_105271_).isCanceled())
|
||||
+ if (!net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105270_, p_105271_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK).isCanceled())
|
||||
this.m_105267_(p_105270_);
|
||||
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233757_);
|
||||
});
|
||||
@@ -31,7 +31,7 @@
|
||||
if (this.f_105196_) {
|
||||
this.f_105190_.m_104955_(new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, this.f_105191_, p_105271_));
|
||||
}
|
||||
+ net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock event = net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105270_, p_105271_);
|
||||
+ net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock event = net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105270_, p_105271_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK);
|
||||
|
||||
BlockState blockstate1 = this.f_105189_.f_91073_.m_8055_(p_105270_);
|
||||
this.f_105189_.m_91301_().m_120581_(this.f_105189_.f_91073_, p_105270_, blockstate1, 0.0F);
|
||||
@@ -60,7 +60,7 @@
|
||||
BlockState blockstate1 = this.f_105189_.f_91073_.m_8055_(p_105284_);
|
||||
this.f_105189_.m_91301_().m_120581_(this.f_105189_.f_91073_, p_105284_, blockstate1, 1.0F);
|
||||
this.m_233729_(this.f_105189_.f_91073_, (p_233753_) -> {
|
||||
+ if (!net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105284_, p_105285_).isCanceled())
|
||||
+ if (!net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105284_, p_105285_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK).isCanceled())
|
||||
this.m_105267_(p_105284_);
|
||||
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105284_, p_105285_, p_233753_);
|
||||
});
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
++this.f_105194_;
|
||||
this.f_105189_.m_91301_().m_120581_(this.f_105189_.f_91073_, p_105284_, blockstate, Mth.m_14036_(this.f_105193_, 0.0F, 1.0F));
|
||||
+ if (net.minecraftforge.common.ForgeHooks.onLeftClickBlock(this.f_105189_.f_91074_, p_105284_, p_105285_).getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return true;
|
||||
+ if (net.minecraftforge.common.ForgeHooks.onClientMineHold(this.f_105189_.f_91074_, p_105284_, p_105285_).getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return true;
|
||||
if (this.f_105193_ >= 1.0F) {
|
||||
this.f_105196_ = false;
|
||||
this.m_233729_(this.f_105189_.f_91073_, (p_233739_) -> {
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
--- a/net/minecraft/client/particle/FireworkParticles.java
|
||||
+++ b/net/minecraft/client/particle/FireworkParticles.java
|
||||
@@ -172,7 +_,7 @@
|
||||
} else {
|
||||
for(int i = 0; i < this.f_106752_.size(); ++i) {
|
||||
CompoundTag compoundtag = this.f_106752_.m_128728_(i);
|
||||
- if (FireworkRocketItem.Shape.m_41237_(compoundtag.m_128445_("Type")) == FireworkRocketItem.Shape.LARGE_BALL) {
|
||||
+ if (FireworkRocketItem.Shape.getShape(compoundtag) == FireworkRocketItem.Shape.LARGE_BALL) {
|
||||
flag1 = true;
|
||||
break;
|
||||
}
|
||||
@@ -192,7 +_,7 @@
|
||||
if (this.f_106754_ % 2 == 0 && this.f_106752_ != null && this.f_106754_ / 2 < this.f_106752_.size()) {
|
||||
int k = this.f_106754_ / 2;
|
||||
CompoundTag compoundtag1 = this.f_106752_.m_128728_(k);
|
||||
- FireworkRocketItem.Shape fireworkrocketitem$shape = FireworkRocketItem.Shape.m_41237_(compoundtag1.m_128445_("Type"));
|
||||
+ FireworkRocketItem.Shape fireworkrocketitem$shape = FireworkRocketItem.Shape.getShape(compoundtag1);
|
||||
boolean flag4 = compoundtag1.m_128471_("Trail");
|
||||
boolean flag2 = compoundtag1.m_128471_("Flicker");
|
||||
int[] aint = compoundtag1.m_128465_("Colors");
|
||||
@@ -201,6 +_,10 @@
|
||||
aint = new int[]{DyeColor.BLACK.m_41070_()};
|
||||
}
|
||||
|
||||
+ var factory = net.minecraftforge.client.FireworkShapeFactoryRegistry.get(fireworkrocketitem$shape);
|
||||
+ if (factory != null)
|
||||
+ factory.build(this, flag4, flag2, aint, aint1);
|
||||
+ else
|
||||
switch (fireworkrocketitem$shape) {
|
||||
case SMALL_BALL:
|
||||
default:
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/particle/Particle.java
|
||||
+++ b/net/minecraft/client/particle/Particle.java
|
||||
@@ -226,4 +_,12 @@
|
||||
@@ -226,4 +_,16 @@
|
||||
public Optional<ParticleGroup> m_142654_() {
|
||||
return Optional.empty();
|
||||
}
|
||||
@@ -11,5 +11,9 @@
|
||||
+ */
|
||||
+ public boolean shouldCull() {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ public net.minecraft.world.phys.Vec3 getPos() {
|
||||
+ return new net.minecraft.world.phys.Vec3(this.f_107212_, this.f_107213_, this.f_107214_);
|
||||
+ }
|
||||
}
|
||||
@@ -1,5 +1,14 @@
|
||||
--- a/net/minecraft/client/particle/TerrainParticle.java
|
||||
+++ b/net/minecraft/client/particle/TerrainParticle.java
|
||||
@@ -28,7 +_,7 @@
|
||||
this.f_107227_ = 0.6F;
|
||||
this.f_107228_ = 0.6F;
|
||||
this.f_107229_ = 0.6F;
|
||||
- if (!p_172458_.m_60713_(Blocks.f_50440_)) {
|
||||
+ if (net.minecraftforge.client.extensions.common.IClientBlockExtensions.of(p_172458_).areBreakingParticlesTinted(p_172458_, p_172451_, p_172459_)) {
|
||||
int i = Minecraft.m_91087_().m_91298_().m_92577_(p_172458_, p_172451_, p_172459_, 0);
|
||||
this.f_107227_ *= (float)(i >> 16 & 255) / 255.0F;
|
||||
this.f_107228_ *= (float)(i >> 8 & 255) / 255.0F;
|
||||
@@ -69,7 +_,13 @@
|
||||
public static class Provider implements ParticleProvider<BlockParticleOption> {
|
||||
public Particle m_6966_(BlockParticleOption p_108304_, ClientLevel p_108305_, double p_108306_, double p_108307_, double p_108308_, double p_108309_, double p_108310_, double p_108311_) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
}
|
||||
|
||||
- return new BakedQuad(aint, p_111603_.f_111355_, direction, p_111604_, p_111608_);
|
||||
+ net.minecraftforge.client.ForgeHooksClient.fillNormal(aint, direction);
|
||||
+ net.minecraftforge.client.ForgeHooksClient.fillNormal(aint, direction, p_111603_.getFaceData().calculateNormals());
|
||||
+ var data = p_111603_.getFaceData();
|
||||
+ var quad = new BakedQuad(aint, p_111603_.f_111355_, direction, p_111604_, p_111608_, data.ambientOcclusion());
|
||||
+ if (!net.minecraftforge.client.model.ForgeFaceData.DEFAULT.equals(data)) {
|
||||
|
||||
@@ -9,21 +9,13 @@
|
||||
this.f_120088_.setSoTimeout(5000);
|
||||
this.f_120088_.joinGroup(this.f_120087_);
|
||||
}
|
||||
@@ -87,7 +_,19 @@
|
||||
@@ -87,7 +_,11 @@
|
||||
String s = LanServerPinger.m_120111_(p_120097_);
|
||||
String s1 = LanServerPinger.m_120116_(p_120097_);
|
||||
if (s1 != null) {
|
||||
- s1 = p_120098_.getHostAddress() + ":" + s1;
|
||||
+ if (net.minecraftforge.network.DualStackUtils.checkIPv6(p_120098_)) {
|
||||
+ final String ip;
|
||||
+
|
||||
+ // compress to short form if enabled in config
|
||||
+ if (net.minecraftforge.common.ForgeConfig.CLIENT.compressLanIPv6Addresses.get())
|
||||
+ ip = com.google.common.net.InetAddresses.toAddrString(p_120098_);
|
||||
+ else
|
||||
+ ip = p_120098_.getHostAddress();
|
||||
+
|
||||
+ s1 = "[" + ip + "]:" + s1;
|
||||
+ s1 = "[" + com.google.common.net.InetAddresses.toAddrString(p_120098_) + "]:" + s1;
|
||||
+ } else {
|
||||
+ s1 = p_120098_.getHostAddress() + ":" + s1;
|
||||
+ }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/server/LanServerPinger.java
|
||||
+++ b/net/minecraft/client/server/LanServerPinger.java
|
||||
@@ -16,7 +_,7 @@
|
||||
@@ -13,7 +_,7 @@
|
||||
public class LanServerPinger extends Thread {
|
||||
private static final AtomicInteger f_120101_ = new AtomicInteger(0);
|
||||
private static final Logger f_120102_ = LogUtils.getLogger();
|
||||
@@ -9,7 +9,7 @@
|
||||
public static final int f_174975_ = 4445;
|
||||
private static final long f_174976_ = 1500L;
|
||||
private final String f_120103_;
|
||||
@@ -39,7 +_,7 @@
|
||||
@@ -36,7 +_,7 @@
|
||||
|
||||
while(!this.isInterrupted() && this.f_120105_) {
|
||||
try {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
public boolean m_207277_(HolderOwner<T> p_256542_) {
|
||||
return this.f_254711_.m_254921_(p_256542_);
|
||||
+ }
|
||||
+ // FORGE: Keep a list of invalidation callbacks so they can be run when tags rebind
|
||||
+ // FORGE: Keep a list of invalidation callbacks so they can be run when tags rebind
|
||||
+ private List<Runnable> invalidationCallbacks = new java.util.ArrayList<>();
|
||||
+ public void addInvalidationListener(Runnable runnable) {
|
||||
+ invalidationCallbacks.add(runnable);
|
||||
|
||||
@@ -66,9 +66,12 @@
|
||||
Predicate<ResourceLocation> predicate = (p_255496_) -> {
|
||||
return registrylookup.m_254902_(ResourceKey.m_135785_(this.f_254716_, p_255496_)).isPresent();
|
||||
};
|
||||
@@ -77,12 +_,13 @@
|
||||
@@ -75,14 +_,16 @@
|
||||
ResourceLocation resourcelocation = p_255499_.getKey();
|
||||
TagBuilder tagbuilder = p_255499_.getValue();
|
||||
List<TagEntry> list = tagbuilder.m_215904_();
|
||||
List<TagEntry> list1 = list.stream().filter((p_274771_) -> {
|
||||
- List<TagEntry> list1 = list.stream().filter((p_274771_) -> {
|
||||
+ List<TagEntry> list1 = java.util.stream.Stream.concat(list.stream(), tagbuilder.getRemoveEntries()).filter((p_274771_) -> {
|
||||
return !p_274771_.m_215940_(predicate, predicate1);
|
||||
- }).toList();
|
||||
+ }).filter(this::missing).toList(); // Forge: Add validation via existing resources
|
||||
@@ -77,13 +80,14 @@
|
||||
} else {
|
||||
- JsonElement jsonelement = TagFile.f_215958_.encodeStart(JsonOps.INSTANCE, new TagFile(list, false)).getOrThrow(false, f_126541_::error);
|
||||
- Path path = this.f_236439_.m_245731_(resourcelocation);
|
||||
+ JsonElement jsonelement = TagFile.f_215958_.encodeStart(JsonOps.INSTANCE, new TagFile(list, tagbuilder.isReplace())).getOrThrow(false, f_126541_::error);
|
||||
+ var removed = tagbuilder.getRemoveEntries().toList();
|
||||
+ JsonElement jsonelement = TagFile.f_215958_.encodeStart(JsonOps.INSTANCE, new TagFile(list, tagbuilder.isReplace(), removed)).getOrThrow(false, f_126541_::error);
|
||||
+ Path path = this.getPath(resourcelocation);
|
||||
+ if (path == null) return CompletableFuture.completedFuture(null); // Forge: Allow running this data provider without writing it. Recipe provider needs valid tags.
|
||||
return DataProvider.m_253162_(p_253684_, jsonelement, path);
|
||||
}
|
||||
}).toArray((p_253442_) -> {
|
||||
@@ -91,13 +_,23 @@
|
||||
@@ -91,13 +_,25 @@
|
||||
});
|
||||
}
|
||||
|
||||
@@ -104,7 +108,9 @@
|
||||
|
||||
protected TagBuilder m_236451_(TagKey<T> p_236452_) {
|
||||
return this.f_126543_.computeIfAbsent(p_236452_.f_203868_(), (p_236442_) -> {
|
||||
+ existingFileHelper.trackGenerated(p_236442_, resourceType);
|
||||
+ if (existingFileHelper != null) {
|
||||
+ existingFileHelper.trackGenerated(p_236442_, resourceType);
|
||||
+ }
|
||||
return TagBuilder.m_215899_();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
}
|
||||
|
||||
static <E> void m_255048_(RegistryOps.RegistryInfoLookup p_256369_, ResourceManager p_256349_, ResourceKey<? extends Registry<E>> p_255792_, WritableRegistry<E> p_256211_, Decoder<E> p_256232_, Map<ResourceKey<?>, Exception> p_255884_) {
|
||||
@@ -139,6 +_,7 @@
|
||||
@@ -138,6 +_,7 @@
|
||||
|
||||
try (Reader reader = resource.m_215508_()) {
|
||||
JsonElement jsonelement = JsonParser.parseReader(reader);
|
||||
+ if (!net.minecraftforge.common.crafting.conditions.ICondition.shouldRegisterEntry(jsonelement)) continue;
|
||||
DataResult<E> dataresult = p_256232_.parse(registryops, jsonelement);
|
||||
+ if (!net.minecraftforge.common.crafting.conditions.ICondition.shouldRegisterEntry(jsonelement)) continue;
|
||||
E e = dataresult.getOrThrow(false, (p_248715_) -> {
|
||||
});
|
||||
p_256211_.m_255290_(resourcekey, e, resource.m_247137_() ? Lifecycle.stable() : dataresult.lifecycle());
|
||||
@@ -1,5 +1,14 @@
|
||||
--- a/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
+++ b/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -68,6 +_,8 @@
|
||||
private MinecraftServerGui f_139605_;
|
||||
@Nullable
|
||||
private final TextFilterClient f_139606_;
|
||||
+ @Nullable
|
||||
+ private net.minecraft.client.server.LanServerPinger dediLanPinger;
|
||||
|
||||
public DedicatedServer(Thread p_214789_, LevelStorageSource.LevelStorageAccess p_214790_, PackRepository p_214791_, WorldStem p_214792_, DedicatedServerSettings p_214793_, DataFixer p_214794_, Services p_214795_, ChunkProgressListenerFactory p_214796_) {
|
||||
super(p_214789_, p_214790_, p_214791_, p_214792_, Proxy.NO_PROXY, p_214794_, p_214795_, p_214796_);
|
||||
@@ -79,6 +_,7 @@
|
||||
public boolean m_7038_() throws IOException {
|
||||
Thread thread = new Thread("Server console handler") {
|
||||
@@ -22,26 +31,41 @@
|
||||
if (dedicatedserverproperties.f_139744_ != null) {
|
||||
this.m_129900_().m_46170_(GameRules.f_46153_).m_46246_(dedicatedserverproperties.f_139744_, this);
|
||||
}
|
||||
@@ -183,12 +_,13 @@
|
||||
thread1.start();
|
||||
}
|
||||
|
||||
+ // <3 you Grum for this, saves us ~30 patch files! --^
|
||||
if (dedicatedserverproperties.f_139721_) {
|
||||
MinecraftServerStatistics.m_18328_(this);
|
||||
@@ -188,7 +_,12 @@
|
||||
f_139598_.info("JMX monitoring enabled");
|
||||
}
|
||||
|
||||
- return true;
|
||||
+ if (net.minecraftforge.common.ForgeConfig.SERVER.advertiseDedicatedServerToLan.get()) {
|
||||
+ this.dediLanPinger = new net.minecraft.client.server.LanServerPinger(this.m_129916_(), String.valueOf(this.m_7448_()));
|
||||
+ this.dediLanPinger.start();
|
||||
+ }
|
||||
+
|
||||
+ return net.minecraftforge.server.ServerLifecycleHooks.handleServerStarting(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -492,6 +_,7 @@
|
||||
@@ -263,6 +_,10 @@
|
||||
this.f_139601_.m_7530_();
|
||||
}
|
||||
|
||||
+ if (this.dediLanPinger != null) {
|
||||
+ this.dediLanPinger.interrupt();
|
||||
+ this.dediLanPinger = null;
|
||||
+ }
|
||||
}
|
||||
|
||||
public void m_5703_(BooleanSupplier p_139661_) {
|
||||
@@ -492,7 +_,12 @@
|
||||
}
|
||||
|
||||
public void m_7041_() {
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.GameShuttingDownEvent());
|
||||
super.m_7041_();
|
||||
+ if (this.dediLanPinger != null) {
|
||||
+ this.dediLanPinger.interrupt();
|
||||
+ this.dediLanPinger = null;
|
||||
+ }
|
||||
Util.m_137580_();
|
||||
SkullBlockEntity.m_196704_();
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
public void m_214168_(BlockPos p_215120_, ServerboundPlayerActionPacket.Action p_215121_, Direction p_215122_, int p_215123_, int p_215124_) {
|
||||
- if (this.f_9245_.m_146892_().m_82557_(Vec3.m_82512_(p_215120_)) > ServerGamePacketListenerImpl.f_215198_) {
|
||||
+ net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock event = net.minecraftforge.common.ForgeHooks.onLeftClickBlock(f_9245_, p_215120_, p_215122_);
|
||||
+ net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock event = net.minecraftforge.common.ForgeHooks.onLeftClickBlock(f_9245_, p_215120_, p_215122_, p_215121_);
|
||||
+ if (event.isCanceled() || (!this.m_9295_() && event.getResult() == net.minecraftforge.eventbus.api.Event.Result.DENY)) {
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
+13
@@ -25,6 +25,19 @@
|
||||
this.f_9742_.m_129512_(new ClientboundMoveVehiclePacket(entity));
|
||||
return;
|
||||
}
|
||||
@@ -983,8 +_,10 @@
|
||||
case SWAP_ITEM_WITH_OFFHAND:
|
||||
if (!this.f_9743_.m_5833_()) {
|
||||
ItemStack itemstack = this.f_9743_.m_21120_(InteractionHand.OFF_HAND);
|
||||
- this.f_9743_.m_21008_(InteractionHand.OFF_HAND, this.f_9743_.m_21120_(InteractionHand.MAIN_HAND));
|
||||
- this.f_9743_.m_21008_(InteractionHand.MAIN_HAND, itemstack);
|
||||
+ var event = net.minecraftforge.common.ForgeHooks.onLivingSwapHandItems(this.f_9743_);
|
||||
+ if (event.isCanceled()) return;
|
||||
+ this.f_9743_.m_21008_(InteractionHand.OFF_HAND, event.getItemSwappedToOffHand());
|
||||
+ this.f_9743_.m_21008_(InteractionHand.MAIN_HAND, event.getItemSwappedToMainHand());
|
||||
this.f_9743_.m_5810_();
|
||||
}
|
||||
|
||||
@@ -1035,7 +_,7 @@
|
||||
Vec3 vec3 = blockhitresult.m_82450_();
|
||||
BlockPos blockpos = blockhitresult.m_82425_();
|
||||
|
||||
+10
@@ -15,6 +15,16 @@
|
||||
this.m_10055_();
|
||||
} else if (this.f_10019_ == ServerLoginPacketListenerImpl.State.DELAY_ACCEPT) {
|
||||
ServerPlayer serverplayer = this.f_10018_.m_6846_().m_11259_(this.f_10021_.getId());
|
||||
@@ -138,7 +_,8 @@
|
||||
}
|
||||
|
||||
public String m_10056_() {
|
||||
- return this.f_10021_ != null ? this.f_10021_ + " (" + this.f_10013_.m_129523_() + ")" : String.valueOf((Object)this.f_10013_.m_129523_());
|
||||
+ final String addressString = net.minecraftforge.network.DualStackUtils.getAddressString(this.f_10013_.m_129523_());
|
||||
+ return this.f_10021_ != null ? this.f_10021_ + " (" + addressString + ")" : addressString;
|
||||
}
|
||||
|
||||
public void m_5990_(ServerboundHelloPacket p_10047_) {
|
||||
@@ -147,14 +_,14 @@
|
||||
GameProfile gameprofile = this.f_10018_.m_236731_();
|
||||
if (gameprofile != null && p_10047_.f_238040_().equalsIgnoreCase(gameprofile.getName())) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
public PackRepository(RepositorySource... p_251886_) {
|
||||
- this.f_10497_ = ImmutableSet.copyOf(p_251886_);
|
||||
+ this.f_10497_ = new java.util.HashSet<>(List.of(p_251886_)); //Forge: This needs to be a mutable set, so that we can add to it later on.
|
||||
+ this.f_10497_ = new java.util.LinkedHashSet<>(List.of(p_251886_)); //Forge: This needs to be a mutable set, so that we can add to it later on.
|
||||
}
|
||||
|
||||
public void m_10506_() {
|
||||
|
||||
@@ -8,7 +8,15 @@
|
||||
|
||||
public PlayerList(MinecraftServer p_203842_, LayeredRegistryAccess<RegistryLayer> p_251844_, PlayerDataStorage p_203844_, int p_203845_) {
|
||||
this.f_11195_ = p_203842_;
|
||||
@@ -174,6 +_,7 @@
|
||||
@@ -167,13 +_,14 @@
|
||||
p_11263_.m_284127_(serverlevel1);
|
||||
String s1 = "local";
|
||||
if (p_11262_.m_129523_() != null) {
|
||||
- s1 = p_11262_.m_129523_().toString();
|
||||
+ s1 = net.minecraftforge.network.DualStackUtils.getAddressString(p_11262_.m_129523_());
|
||||
}
|
||||
|
||||
f_11188_.info("{}[{}] logged in with entity id {} at ({}, {}, {})", p_11263_.m_7755_().getString(), s1, p_11263_.m_19879_(), p_11263_.m_20185_(), p_11263_.m_20186_(), p_11263_.m_20189_());
|
||||
LevelData leveldata = serverlevel1.m_6106_();
|
||||
p_11263_.m_143427_(compoundtag);
|
||||
ServerGamePacketListenerImpl servergamepacketlistenerimpl = new ServerGamePacketListenerImpl(this.f_11195_, p_11262_, p_11263_);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
--- a/net/minecraft/tags/TagFile.java
|
||||
+++ b/net/minecraft/tags/TagFile.java
|
||||
@@ -4,8 +_,12 @@
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||
import java.util.List;
|
||||
|
||||
-public record TagFile(List<TagEntry> f_215959_, boolean f_215960_) {
|
||||
+public record TagFile(List<TagEntry> f_215959_, boolean f_215960_, List<TagEntry> remove) {
|
||||
public static final Codec<TagFile> f_215958_ = RecordCodecBuilder.create((p_215967_) -> {
|
||||
- return p_215967_.group(TagEntry.f_215911_.listOf().fieldOf("values").forGetter(TagFile::f_215959_), Codec.BOOL.optionalFieldOf("replace", Boolean.valueOf(false)).forGetter(TagFile::f_215960_)).apply(p_215967_, TagFile::new);
|
||||
+ return p_215967_.group(TagEntry.f_215911_.listOf().fieldOf("values").forGetter(TagFile::f_215959_), Codec.BOOL.optionalFieldOf("replace", Boolean.valueOf(false)).forGetter(TagFile::f_215960_), TagEntry.f_215911_.listOf().optionalFieldOf("remove", List.of()).forGetter(TagFile::remove)).apply(p_215967_, TagFile::new);
|
||||
});
|
||||
+
|
||||
+ public TagFile(List<TagEntry> f_215959_, boolean f_215960_) {
|
||||
+ this(f_215959_, f_215960_, List.of());
|
||||
+ }
|
||||
}
|
||||
@@ -1,11 +1,50 @@
|
||||
--- a/net/minecraft/tags/TagLoader.java
|
||||
+++ b/net/minecraft/tags/TagLoader.java
|
||||
@@ -59,6 +_,7 @@
|
||||
tagfile.f_215959_().forEach((p_215997_) -> {
|
||||
list.add(new TagLoader.EntryWithSource(p_215997_, s));
|
||||
});
|
||||
+ tagfile.remove().forEach(e -> list.add(new TagLoader.EntryWithSource(e, s, true)));
|
||||
} catch (Exception exception) {
|
||||
f_13445_.error("Couldn't read tag list {} from {} in data pack {}", resourcelocation1, resourcelocation, resource.m_215506_(), exception);
|
||||
}
|
||||
@@ -69,16 +_,17 @@
|
||||
}
|
||||
|
||||
private Either<Collection<TagLoader.EntryWithSource>, Collection<T>> m_215978_(TagEntry.Lookup<T> p_215979_, List<TagLoader.EntryWithSource> p_215980_) {
|
||||
- ImmutableSet.Builder<T> builder = ImmutableSet.builder();
|
||||
+ var builder = new java.util.LinkedHashSet<T>(); // Order is important, as ImmutableSet is ordered and some people rely on that. https://github.com/MinecraftForge/MinecraftForge/issues/9774
|
||||
List<TagLoader.EntryWithSource> list = new ArrayList<>();
|
||||
|
||||
for(TagLoader.EntryWithSource tagloader$entrywithsource : p_215980_) {
|
||||
- if (!tagloader$entrywithsource.f_216042_().m_215927_(p_215979_, builder::add)) {
|
||||
+ if (!tagloader$entrywithsource.f_216042_().m_215927_(p_215979_, tagloader$entrywithsource.remove() ? builder::remove : builder::add)) {
|
||||
+ if (!tagloader$entrywithsource.remove()) // Treat all removals as optional at runtime. If it was missing, then it could of never been added.
|
||||
list.add(tagloader$entrywithsource);
|
||||
}
|
||||
}
|
||||
|
||||
- return list.isEmpty() ? Either.right(builder.build()) : Either.left(list);
|
||||
+ return list.isEmpty() ? Either.right(List.copyOf(builder)) : Either.left(list);
|
||||
}
|
||||
|
||||
public Map<ResourceLocation, Collection<T>> m_203898_(Map<ResourceLocation, List<TagLoader.EntryWithSource>> p_203899_) {
|
||||
@@ -100,7 +_,7 @@
|
||||
});
|
||||
dependencysorter.m_284430_((p_284682_, p_284683_) -> {
|
||||
this.m_215978_(lookup, p_284683_.f_283922_).ifLeft((p_215977_) -> {
|
||||
- f_13445_.error("Couldn't load tag {} as it is missing following references: {}", p_284682_, p_215977_.stream().map(Objects::toString).collect(Collectors.joining(", ")));
|
||||
+ f_13445_.error("Couldn't load tag {} as it is missing following references: {}", p_215977_, p_215977_.stream().map(Objects::toString).collect(Collectors.joining(", \n\t")));
|
||||
+ f_13445_.error("Couldn't load tag {} as it is missing following references: {}", p_284682_, p_215977_.stream().map(Objects::toString).collect(Collectors.joining(", \n\t")));
|
||||
}).ifRight((p_216001_) -> {
|
||||
map.put(p_284682_, p_216001_);
|
||||
});
|
||||
@@ -112,7 +_,8 @@
|
||||
return this.m_203898_(this.m_144495_(p_203901_));
|
||||
}
|
||||
|
||||
- public static record EntryWithSource(TagEntry f_216042_, String f_216043_) {
|
||||
+ public static record EntryWithSource(TagEntry f_216042_, String f_216043_, boolean remove) {
|
||||
+ public EntryWithSource(TagEntry f_216042_, String f_216043_) { this(f_216042_, f_216043_, false); }
|
||||
public String toString() {
|
||||
return this.f_216042_ + " (from " + this.f_216043_ + ")";
|
||||
}
|
||||
@@ -41,7 +41,7 @@
|
||||
this.m_8097_();
|
||||
this.m_6034_(0.0D, 0.0D, 0.0D);
|
||||
- this.f_19816_ = this.m_6380_(Pose.STANDING, this.f_19815_);
|
||||
+ net.minecraftforge.event.entity.EntityEvent.Size sizeEvent = net.minecraftforge.event.ForgeEventFactory.getEntitySizeForge(this, Pose.STANDING, this.f_19815_, this.m_6380_(Pose.STANDING, this.f_19815_));
|
||||
+ var sizeEvent = net.minecraftforge.event.ForgeEventFactory.getEntitySizeForge(this, Pose.STANDING, this.f_19815_, this.m_6380_(Pose.STANDING, this.f_19815_));
|
||||
+ this.f_19815_ = sizeEvent.getNewSize();
|
||||
+ this.f_19816_ = sizeEvent.getNewEyeHeight();
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.EntityEvent.EntityConstructing(this));
|
||||
@@ -147,7 +147,7 @@
|
||||
this.m_5496_(soundtype.m_56776_(), soundtype.m_56773_() * 0.15F, soundtype.m_56774_());
|
||||
}
|
||||
|
||||
@@ -1176,19 +_,22 @@
|
||||
@@ -1176,31 +_,38 @@
|
||||
|
||||
public void m_5844_() {
|
||||
if (this.m_6069_()) {
|
||||
@@ -175,6 +175,24 @@
|
||||
}
|
||||
|
||||
void m_20074_() {
|
||||
Entity entity = this.m_20202_();
|
||||
+ java.util.function.BooleanSupplier updateFluidHeight = () -> this.m_204031_(FluidTags.f_13131_, 0.014D);
|
||||
if (entity instanceof Boat boat) {
|
||||
if (!boat.m_5842_()) {
|
||||
this.f_19798_ = false;
|
||||
- return;
|
||||
+ updateFluidHeight = () -> {
|
||||
+ this.updateFluidHeightAndDoFluidPushing(state -> this.shouldUpdateFluidWhileBoating(state, boat));
|
||||
+ return false;
|
||||
+ };
|
||||
}
|
||||
}
|
||||
|
||||
- if (this.m_204031_(FluidTags.f_13131_, 0.014D)) {
|
||||
+ if (updateFluidHeight.getAsBoolean()) {
|
||||
if (!this.f_19798_ && !this.f_19803_) {
|
||||
this.m_5841_();
|
||||
}
|
||||
@@ -1217,6 +_,7 @@
|
||||
private void m_20323_() {
|
||||
this.f_19800_ = this.m_204029_(FluidTags.f_13131_);
|
||||
@@ -385,7 +403,7 @@
|
||||
EntityDimensions entitydimensions = this.f_19815_;
|
||||
Pose pose = this.m_20089_();
|
||||
EntityDimensions entitydimensions1 = this.m_6972_(pose);
|
||||
+ net.minecraftforge.event.entity.EntityEvent.Size sizeEvent = net.minecraftforge.event.ForgeEventFactory.getEntitySizeForge(this, pose, entitydimensions, entitydimensions1, this.m_6380_(pose, entitydimensions1));
|
||||
+ var sizeEvent = net.minecraftforge.event.ForgeEventFactory.getEntitySizeForge(this, pose, entitydimensions, entitydimensions1, this.m_6380_(pose, entitydimensions1));
|
||||
+ entitydimensions1 = sizeEvent.getNewSize();
|
||||
this.f_19815_ = entitydimensions1;
|
||||
- this.f_19816_ = this.m_6380_(pose, entitydimensions1);
|
||||
@@ -404,11 +422,11 @@
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2980,9 +_,17 @@
|
||||
@@ -2980,9 +_,22 @@
|
||||
this.f_19859_ = this.m_146908_();
|
||||
}
|
||||
|
||||
+ @Deprecated // Forge: Use no parameter version instead, only for vanilla Tags
|
||||
+ @Deprecated // Forge: Use predicate version instead, only for vanilla Tags
|
||||
public boolean m_204031_(TagKey<Fluid> p_204032_, double p_204033_) {
|
||||
+ this.updateFluidHeightAndDoFluidPushing();
|
||||
+ if(p_204032_ == FluidTags.f_13131_) return this.isInFluidType(net.minecraftforge.common.ForgeMod.WATER_TYPE.get());
|
||||
@@ -416,7 +434,12 @@
|
||||
+ else return false;
|
||||
+ }
|
||||
+
|
||||
+ @Deprecated(forRemoval = true, since = "1.20.1")
|
||||
+ public void updateFluidHeightAndDoFluidPushing() {
|
||||
+ this.updateFluidHeightAndDoFluidPushing(com.google.common.base.Predicates.alwaysTrue());
|
||||
+ }
|
||||
+
|
||||
+ public void updateFluidHeightAndDoFluidPushing(Predicate<FluidState> shouldUpdate) {
|
||||
if (this.m_146899_()) {
|
||||
- return false;
|
||||
+ return;
|
||||
@@ -436,7 +459,7 @@
|
||||
FluidState fluidstate = this.m_9236_().m_6425_(blockpos$mutableblockpos);
|
||||
- if (fluidstate.m_205070_(p_204032_)) {
|
||||
+ net.minecraftforge.fluids.FluidType fluidType = fluidstate.getFluidType();
|
||||
+ if (!fluidType.isAir()) {
|
||||
+ if (!fluidType.isAir() && shouldUpdate.test(fluidstate)) {
|
||||
double d1 = (double)((float)i2 + fluidstate.m_76155_(this.m_9236_(), blockpos$mutableblockpos));
|
||||
if (d1 >= aabb.f_82289_) {
|
||||
flag1 = true;
|
||||
@@ -525,7 +548,7 @@
|
||||
public float m_274421_() {
|
||||
return this.f_19793_;
|
||||
}
|
||||
@@ -3319,6 +_,103 @@
|
||||
@@ -3319,6 +_,109 @@
|
||||
public boolean m_142265_(Level p_146843_, BlockPos p_146844_) {
|
||||
return true;
|
||||
}
|
||||
@@ -593,6 +616,7 @@
|
||||
+ /**
|
||||
+ * Accessor method for {@link #getEyeHeight(Pose, EntityDimensions)}
|
||||
+ */
|
||||
+ @Deprecated(forRemoval = true, since = "1.20.1") // Remove Entity Eye/Size hooks, as they need to be redesigned
|
||||
+ public float getEyeHeightAccess(Pose pose, EntityDimensions size) {
|
||||
+ return this.m_6380_(pose, size);
|
||||
+ }
|
||||
@@ -624,6 +648,11 @@
|
||||
+ return this.forgeFluidTypeHeight.object2DoubleEntrySet().stream().max(java.util.Comparator.comparingDouble(Object2DoubleMap.Entry::getDoubleValue)).map(Object2DoubleMap.Entry::getKey).orElseGet(net.minecraftforge.common.ForgeMod.EMPTY_TYPE);
|
||||
+ }
|
||||
+
|
||||
+ @Deprecated(forRemoval = true, since = "1.20.1") // Remove Entity Eye/Size hooks, as they need to be redesigned
|
||||
+ public EntityDimensions getDimensionsForge(Pose pose) {
|
||||
+ return m_6972_(pose);
|
||||
+ }
|
||||
+
|
||||
+ /* ================================== Forge End =====================================*/
|
||||
+
|
||||
|
||||
|
||||
@@ -16,6 +16,16 @@
|
||||
public static final int f_147166_ = 2;
|
||||
public static final int f_147167_ = 4;
|
||||
public static final int f_147168_ = 98;
|
||||
@@ -239,7 +_,8 @@
|
||||
this.f_20885_ = this.m_146908_();
|
||||
this.m_274367_(0.6F);
|
||||
NbtOps nbtops = NbtOps.f_128958_;
|
||||
- this.f_20939_ = this.m_8075_(new Dynamic<>(nbtops, nbtops.createMap(ImmutableMap.of(nbtops.createString("memories"), nbtops.emptyMap()))));
|
||||
+ var dyn = new Dynamic<>(nbtops, nbtops.createMap(ImmutableMap.of(nbtops.createString("memories"), nbtops.emptyMap())));
|
||||
+ this.f_20939_ = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.m_8075_(dyn), dyn);
|
||||
}
|
||||
|
||||
public Brain<?> m_6274_() {
|
||||
@@ -273,7 +_,7 @@
|
||||
}
|
||||
|
||||
@@ -43,31 +53,16 @@
|
||||
public boolean m_6040_() {
|
||||
return this.m_6336_() == MobType.f_21641_;
|
||||
}
|
||||
@@ -352,8 +_,8 @@
|
||||
@@ -352,6 +_,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (this.m_204029_(FluidTags.f_13131_) && !this.m_9236_().m_8055_(BlockPos.m_274561_(this.m_20185_(), this.m_20188_(), this.m_20189_())).m_60713_(Blocks.f_50628_)) {
|
||||
- boolean flag1 = !this.m_6040_() && !MobEffectUtil.m_19588_(this) && (!flag || !((Player)this).m_150110_().f_35934_);
|
||||
+ if (!this.getEyeInFluidType().isAir() && !this.m_9236_().m_8055_(BlockPos.m_274561_(this.m_20185_(), this.m_20188_(), this.m_20189_())).m_60713_(Blocks.f_50628_)) {
|
||||
+ boolean flag1 = this.canDrownInFluidType(this.getEyeInFluidType()) && !MobEffectUtil.m_19588_(this) && (!flag || !((Player)this).m_150110_().f_35934_);
|
||||
+ int airSupply = this.m_20146_();
|
||||
+ net.minecraftforge.common.ForgeHooks.onLivingBreathe(this, airSupply - m_7302_(airSupply), m_7305_(airSupply) - airSupply);
|
||||
+ if (false) // Forge: Handled in ForgeHooks#onLivingBreathe(LivingEntity, int, int)
|
||||
if (this.m_204029_(FluidTags.f_13131_) && !this.m_9236_().m_8055_(BlockPos.m_274561_(this.m_20185_(), this.m_20188_(), this.m_20189_())).m_60713_(Blocks.f_50628_)) {
|
||||
boolean flag1 = !this.m_6040_() && !MobEffectUtil.m_19588_(this) && (!flag || !((Player)this).m_150110_().f_35934_);
|
||||
if (flag1) {
|
||||
this.m_20301_(this.m_7302_(this.m_20146_()));
|
||||
if (this.m_20146_() == -20) {
|
||||
@@ -371,10 +_,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (!this.m_9236_().f_46443_ && this.m_20159_() && this.m_20202_() != null && this.m_20202_().m_275843_()) {
|
||||
+ if (!this.m_9236_().f_46443_ && this.m_20159_() && this.m_20202_() != null && !this.m_20202_().canBeRiddenUnderFluidType(this.getEyeInFluidType(), this)) {
|
||||
this.m_8127_();
|
||||
}
|
||||
- } else if (this.m_20146_() < this.m_6062_()) {
|
||||
+ } // Forge: Move to if statement since we need to increase the air supply if in bubble column or can't drown
|
||||
+ if (this.m_20146_() < this.m_6062_() && (!this.canDrownInFluidType(this.getEyeInFluidType()) || this.m_9236_().m_8055_(BlockPos.m_274561_(this.m_20185_(), this.m_20188_(), this.m_20189_())).m_60713_(Blocks.f_50628_))) {
|
||||
this.m_20301_(this.m_7305_(this.m_20146_()));
|
||||
}
|
||||
|
||||
@@ -387,7 +_,7 @@
|
||||
}
|
||||
}
|
||||
@@ -77,6 +72,16 @@
|
||||
this.m_252836_();
|
||||
}
|
||||
|
||||
@@ -734,7 +_,8 @@
|
||||
}
|
||||
|
||||
if (p_21096_.m_128425_("Brain", 10)) {
|
||||
- this.f_20939_ = this.m_8075_(new Dynamic<>(NbtOps.f_128958_, p_21096_.m_128423_("Brain")));
|
||||
+ var dyn = new Dynamic<>(NbtOps.f_128958_, p_21096_.m_128423_("Brain"));
|
||||
+ this.f_20939_ = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.m_8075_(dyn), dyn);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -749,7 +_,7 @@
|
||||
if (!mobeffectinstance.m_19552_(this, () -> {
|
||||
this.m_141973_(mobeffectinstance, true, (Entity)null);
|
||||
@@ -177,21 +182,16 @@
|
||||
if (!p_21016_.m_269533_(DamageTypeTags.f_268524_)) {
|
||||
Entity entity = p_21016_.m_7640_();
|
||||
if (entity instanceof LivingEntity) {
|
||||
@@ -1065,12 +_,13 @@
|
||||
@@ -1065,7 +_,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
- flag = true;
|
||||
+ flag = p_21017_ <= 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (p_21016_.m_269533_(DamageTypeTags.f_268419_) && this.m_6095_().m_204039_(EntityTypeTags.f_144295_)) {
|
||||
p_21017_ *= 5.0F;
|
||||
}
|
||||
+ }
|
||||
|
||||
this.f_267362_.m_267771_(1.5F);
|
||||
boolean flag1 = true;
|
||||
@@ -1108,11 +_,10 @@
|
||||
Player player1 = (Player)entity1;
|
||||
this.f_20889_ = 100;
|
||||
@@ -386,6 +386,19 @@
|
||||
if (!this.f_20911_ || this.f_20913_ >= this.m_21304_() / 2 || this.f_20913_ < 0) {
|
||||
this.f_20913_ = -1;
|
||||
this.f_20911_ = true;
|
||||
@@ -1761,8 +_,10 @@
|
||||
|
||||
private void m_21312_() {
|
||||
ItemStack itemstack = this.m_6844_(EquipmentSlot.OFFHAND);
|
||||
- this.m_8061_(EquipmentSlot.OFFHAND, this.m_6844_(EquipmentSlot.MAINHAND));
|
||||
- this.m_8061_(EquipmentSlot.MAINHAND, itemstack);
|
||||
+ var event = net.minecraftforge.common.ForgeHooks.onLivingSwapHandItems(this);
|
||||
+ if (event.isCanceled()) return;
|
||||
+ this.m_8061_(EquipmentSlot.OFFHAND, event.getItemSwappedToOffHand());
|
||||
+ this.m_8061_(EquipmentSlot.MAINHAND, event.getItemSwappedToMainHand());
|
||||
}
|
||||
|
||||
protected void m_6088_() {
|
||||
@@ -1955,14 +_,17 @@
|
||||
}
|
||||
|
||||
@@ -718,7 +731,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing) {
|
||||
+ if (this.m_6084_() && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER) {
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && this.m_6084_()) {
|
||||
+ if (facing == null) return handlers[2].cast();
|
||||
+ else if (facing.m_122434_().m_122478_()) return handlers[0].cast();
|
||||
+ else if (facing.m_122434_().m_122479_()) return handlers[1].cast();
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
--- a/net/minecraft/world/entity/ai/Brain.java
|
||||
+++ b/net/minecraft/world/entity/ai/Brain.java
|
||||
@@ -478,6 +_,30 @@
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
+ public net.minecraftforge.common.util.BrainBuilder<E> createBuilder(){
|
||||
+ var builder = new net.minecraftforge.common.util.BrainBuilder<>(this);
|
||||
+ builder.getMemoryTypes().addAll(this.f_21843_.keySet());
|
||||
+ builder.getSensorTypes().addAll(this.f_21844_.keySet());
|
||||
+ builder.addAvailableBehaviorsByPriorityFrom(this.f_21845_);
|
||||
+ builder.setSchedule(this.m_21932_());
|
||||
+ builder.addActivityRequirementsFrom(this.f_21847_);
|
||||
+ builder.addActivityMemoriesToEraseWhenStoppedFrom(this.f_21848_);
|
||||
+ builder.getCoreActivities().addAll(this.f_21849_);
|
||||
+ builder.setDefaultActivity(this.f_21851_);
|
||||
+ builder.setActiveActivites(this.f_21850_);
|
||||
+ return builder;
|
||||
+ }
|
||||
+
|
||||
+ public void copyFromBuilder(net.minecraftforge.common.util.BrainBuilder<E> builder){
|
||||
+ builder.addAvailableBehaviorsByPriorityTo(this.f_21845_);
|
||||
+ this.m_21912_(builder.getSchedule());
|
||||
+ builder.addActivityRequirementsTo(this.f_21847_);
|
||||
+ builder.addActivityMemoriesToEraseWhenStoppedTo(this.f_21848_);
|
||||
+ this.m_21930_(builder.getCoreActivities());
|
||||
+ this.m_21944_(builder.getDefaultActivity());
|
||||
+ this.f_21850_.addAll(builder.getActiveActivites());
|
||||
+ }
|
||||
+
|
||||
static final class MemoryValue<U> {
|
||||
private final MemoryModuleType<U> f_22030_;
|
||||
private final Optional<? extends ExpirableValue<U>> f_22031_;
|
||||
@@ -38,7 +38,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable net.minecraft.core.Direction facing) {
|
||||
+ if (this.m_6084_() && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && itemHandler != null)
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && itemHandler != null && this.m_6084_())
|
||||
+ return itemHandler.cast();
|
||||
+ return super.getCapability(capability, facing);
|
||||
+ }
|
||||
|
||||
@@ -19,15 +19,21 @@
|
||||
if (p_36049_.m_41782_()) {
|
||||
itemstack.m_41751_(p_36049_.m_41783_().m_6426_());
|
||||
}
|
||||
@@ -229,7 +_,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
-
|
||||
+ f_35975_.forEach(e -> e.onArmorTick(f_35978_.m_9236_(), f_35978_));
|
||||
@@ -222,11 +_,13 @@
|
||||
}
|
||||
|
||||
public boolean m_36054_(ItemStack p_36055_) {
|
||||
public void m_36068_() {
|
||||
+ int idx = 0;
|
||||
for(NonNullList<ItemStack> nonnulllist : this.f_35979_) {
|
||||
for(int i = 0; i < nonnulllist.size(); ++i) {
|
||||
if (!nonnulllist.get(i).m_41619_()) {
|
||||
- nonnulllist.get(i).m_41666_(this.f_35978_.m_9236_(), this.f_35978_, i, this.f_35977_ == i);
|
||||
+ nonnulllist.get(i).onInventoryTick(this.f_35978_.m_9236_(), this.f_35978_, idx, this.f_35977_);
|
||||
}
|
||||
+ idx++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,6 +_,8 @@
|
||||
} catch (Throwable throwable) {
|
||||
CrashReport crashreport = CrashReport.m_127521_(throwable, "Adding item to inventory");
|
||||
|
||||
@@ -452,7 +452,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing) {
|
||||
+ if (this.m_6084_() && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER) {
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && this.m_6084_()) {
|
||||
+ if (facing == null) return playerJoinedHandler.cast();
|
||||
+ else if (facing.m_122434_().m_122478_()) return playerMainHandler.cast();
|
||||
+ else if (facing.m_122434_().m_122479_()) return playerEquipmentHandler.cast();
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
--- a/net/minecraft/world/entity/projectile/AbstractArrow.java
|
||||
+++ b/net/minecraft/world/entity/projectile/AbstractArrow.java
|
||||
@@ -66,6 +_,8 @@
|
||||
@Nullable
|
||||
private List<Entity> f_36702_;
|
||||
|
||||
+ private final IntOpenHashSet ignoredEntities = new IntOpenHashSet();
|
||||
+
|
||||
protected AbstractArrow(EntityType<? extends AbstractArrow> p_36721_, Level p_36722_) {
|
||||
super(p_36721_, p_36722_);
|
||||
}
|
||||
@@ -150,7 +_,7 @@
|
||||
--this.f_36706_;
|
||||
}
|
||||
@@ -9,14 +18,54 @@
|
||||
this.m_20095_();
|
||||
}
|
||||
|
||||
@@ -186,7 +_,9 @@
|
||||
@@ -186,9 +_,28 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (hitresult != null && !flag) {
|
||||
- this.m_6532_(hitresult);
|
||||
- this.f_19812_ = true;
|
||||
+ if (hitresult != null && hitresult.m_6662_() != HitResult.Type.MISS && !flag) {
|
||||
+ if (net.minecraftforge.event.ForgeEventFactory.onProjectileImpact(this, hitresult))
|
||||
+ break;
|
||||
this.m_6532_(hitresult);
|
||||
this.f_19812_ = true;
|
||||
+ switch (net.minecraftforge.event.ForgeEventFactory.onProjectileImpactResult(this, hitresult)) {
|
||||
+ case SKIP_ENTITY:
|
||||
+ if (hitresult.m_6662_() != HitResult.Type.ENTITY) { // If there is no entity, we just return default behaviour
|
||||
+ this.m_6532_(hitresult);
|
||||
+ this.f_19812_ = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ ignoredEntities.add(entityhitresult.m_82443_().m_19879_());
|
||||
+ entityhitresult = null; // Don't process any further
|
||||
+ break;
|
||||
+ case STOP_AT_CURRENT_NO_DAMAGE:
|
||||
+ this.m_146870_();
|
||||
+ entityhitresult = null; // Don't process any further
|
||||
+ break;
|
||||
+ case STOP_AT_CURRENT:
|
||||
+ this.m_36767_((byte) 0);
|
||||
+ case DEFAULT:
|
||||
+ this.m_6532_(hitresult);
|
||||
+ this.f_19812_ = true;
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (entityhitresult == null || this.m_36796_() <= 0) {
|
||||
@@ -198,6 +_,9 @@
|
||||
hitresult = null;
|
||||
}
|
||||
|
||||
+ if (this.m_213877_())
|
||||
+ return;
|
||||
+
|
||||
vec3 = this.m_20184_();
|
||||
double d5 = vec3.f_82479_;
|
||||
double d6 = vec3.f_82480_;
|
||||
@@ -422,7 +_,7 @@
|
||||
}
|
||||
|
||||
protected boolean m_5603_(Entity p_36743_) {
|
||||
- return super.m_5603_(p_36743_) && (this.f_36701_ == null || !this.f_36701_.contains(p_36743_.m_19879_()));
|
||||
+ return super.m_5603_(p_36743_) && (this.f_36701_ == null || !this.f_36701_.contains(p_36743_.m_19879_())) && !this.ignoredEntities.contains(p_36743_.m_19879_());
|
||||
}
|
||||
|
||||
public void m_7380_(CompoundTag p_36772_) {
|
||||
+1
-1
@@ -19,7 +19,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable net.minecraft.core.Direction facing) {
|
||||
+ if (this.m_6084_() && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER)
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && this.m_6084_())
|
||||
+ return itemHandler.cast();
|
||||
+ return super.getCapability(capability, facing);
|
||||
+ }
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable net.minecraft.core.Direction facing) {
|
||||
+ if (this.m_6084_() && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER)
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && this.m_6084_())
|
||||
+ return itemHandler.cast();
|
||||
+ return super.getCapability(capability, facing);
|
||||
+ }
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
return new IllegalStateException("Unregistered creative tab: " + this);
|
||||
});
|
||||
- this.f_256824_.m_257865_(p_270156_, creativemodetab$itemdisplaybuilder);
|
||||
+ net.minecraftforge.client.ForgeHooksClient.onCreativeModeTabBuildContents(this, resourcekey, this.f_256824_, p_270156_, creativemodetab$itemdisplaybuilder);
|
||||
+ net.minecraftforge.common.ForgeHooks.onCreativeModeTabBuildContents(this, resourcekey, this.f_256824_, p_270156_, creativemodetab$itemdisplaybuilder);
|
||||
this.f_243839_ = creativemodetab$itemdisplaybuilder.f_244363_;
|
||||
this.f_243841_ = creativemodetab$itemdisplaybuilder.f_244585_;
|
||||
this.m_257466_();
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
--- a/net/minecraft/world/item/FireworkRocketItem.java
|
||||
+++ b/net/minecraft/world/item/FireworkRocketItem.java
|
||||
@@ -107,7 +_,7 @@
|
||||
return itemstack;
|
||||
}
|
||||
|
||||
- public static enum Shape {
|
||||
+ public static enum Shape implements net.minecraftforge.common.IExtensibleEnum {
|
||||
SMALL_BALL(0, "small_ball"),
|
||||
LARGE_BALL(1, "large_ball"),
|
||||
STAR(2, "star"),
|
||||
@@ -131,8 +_,28 @@
|
||||
return this.f_41228_;
|
||||
}
|
||||
|
||||
+ public void save(net.minecraft.nbt.CompoundTag tag) {
|
||||
+ tag.m_128344_("Type", (byte)m_41236_());
|
||||
+ tag.m_128359_("forge:shape_type", name());
|
||||
+ }
|
||||
+
|
||||
+ /** Use {getShape(ComoundTag)} */
|
||||
+ @Deprecated
|
||||
public static FireworkRocketItem.Shape m_41237_(int p_41238_) {
|
||||
return f_41226_.apply(p_41238_);
|
||||
+ }
|
||||
+
|
||||
+ public static FireworkRocketItem.Shape getShape(net.minecraft.nbt.CompoundTag tag) {
|
||||
+ var name = tag.m_128425_("forge:shape_type", 8) ? tag.m_128461_("forge:shape_type") : null;
|
||||
+ if (name == null) return m_41237_(tag.m_128445_("Type"));
|
||||
+ for (var ret : values())
|
||||
+ if (ret.name().equals(name))
|
||||
+ return ret;
|
||||
+ return SMALL_BALL;
|
||||
+ }
|
||||
+
|
||||
+ public static Shape create(String registryName, int id, String shapeName) {
|
||||
+ throw new IllegalStateException("Enum not extended");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/net/minecraft/world/item/FireworkStarItem.java
|
||||
+++ b/net/minecraft/world/item/FireworkStarItem.java
|
||||
@@ -23,7 +_,7 @@
|
||||
}
|
||||
|
||||
public static void m_41256_(CompoundTag p_41257_, List<Component> p_41258_) {
|
||||
- FireworkRocketItem.Shape fireworkrocketitem$shape = FireworkRocketItem.Shape.m_41237_(p_41257_.m_128445_("Type"));
|
||||
+ FireworkRocketItem.Shape fireworkrocketitem$shape = FireworkRocketItem.Shape.getShape(p_41257_);
|
||||
p_41258_.add(Component.m_237115_("item.minecraft.firework_star.shape." + fireworkrocketitem$shape.m_41241_()).m_130940_(ChatFormatting.GRAY));
|
||||
int[] aint = p_41257_.m_128465_("Colors");
|
||||
if (aint.length > 0) {
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/net/minecraft/world/item/crafting/FireworkStarRecipe.java
|
||||
+++ b/net/minecraft/world/item/crafting/FireworkStarRecipe.java
|
||||
@@ -107,7 +_,7 @@
|
||||
}
|
||||
|
||||
compoundtag.m_128408_("Colors", list);
|
||||
- compoundtag.m_128344_("Type", (byte)fireworkrocketitem$shape.m_41236_());
|
||||
+ fireworkrocketitem$shape.save(compoundtag);
|
||||
return itemstack;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
public LevelSettings m_247275_(WorldDataConfiguration p_250867_) {
|
||||
- return new LevelSettings(this.f_46902_, this.f_46903_, this.f_46904_, this.f_46905_, this.f_46906_, this.f_46907_, p_250867_);
|
||||
+ return new LevelSettings(this.f_46902_, this.f_46903_, this.f_46904_, this.f_46905_, this.f_46906_, this.f_46907_, f_243681_, this.lifecycle);
|
||||
+ return new LevelSettings(this.f_46902_, this.f_46903_, this.f_46904_, this.f_46905_, this.f_46906_, this.f_46907_, p_250867_, this.lifecycle);
|
||||
}
|
||||
|
||||
public LevelSettings m_46935_() {
|
||||
|
||||
@@ -16,11 +16,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,14 +_,14 @@
|
||||
p_221161_.m_186460_(p_221162_, this, m_221148_(p_221161_.f_46441_));
|
||||
if (p_221161_.m_46469_().m_46207_(GameRules.f_46131_)) {
|
||||
if (!p_221160_.m_60710_(p_221161_, p_221162_)) {
|
||||
- p_221161_.m_7471_(p_221162_, false);
|
||||
@@ -133,7 +_,7 @@
|
||||
}
|
||||
|
||||
BlockState blockstate = p_221161_.m_8055_(p_221162_.m_7495_());
|
||||
@@ -29,10 +25,6 @@
|
||||
int i = p_221160_.m_61143_(f_53408_);
|
||||
if (!flag && p_221161_.m_46471_() && this.m_53428_(p_221161_, p_221162_) && p_221163_.m_188501_() < 0.2F + (float)i * 0.03F) {
|
||||
p_221161_.m_7471_(p_221162_, false);
|
||||
+ p_221161_.m_7471_(p_221162_, false);
|
||||
} else {
|
||||
int j = Math.min(15, i + p_221163_.m_188503_(3) / 2);
|
||||
if (i != j) {
|
||||
@@ -154,7 +_,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+7
-8
@@ -153,7 +153,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,5 +_,34 @@
|
||||
@@ -494,5 +_,33 @@
|
||||
p_58342_.m_36491_(itemstack);
|
||||
}
|
||||
|
||||
@@ -164,13 +164,12 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing) {
|
||||
+ if (!this.f_58859_ && facing != null && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER) {
|
||||
+ if (facing == Direction.UP)
|
||||
+ return handlers[0].cast();
|
||||
+ else if (facing == Direction.DOWN)
|
||||
+ return handlers[1].cast();
|
||||
+ else
|
||||
+ return handlers[2].cast();
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && facing != null && !this.f_58859_) {
|
||||
+ return switch (facing) {
|
||||
+ case UP -> handlers[0].cast();
|
||||
+ case DOWN -> handlers[1].cast();
|
||||
+ default -> handlers[2].cast();
|
||||
+ };
|
||||
+ }
|
||||
+ return super.getCapability(capability, facing);
|
||||
+ }
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
+ }
|
||||
+
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> cap, @org.jetbrains.annotations.Nullable net.minecraft.core.Direction side) {
|
||||
+ if (!this.f_58859_ && cap == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER)
|
||||
+ if (cap == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && !this.f_58859_)
|
||||
+ return itemHandler.cast();
|
||||
+ return super.getCapability(cap, side);
|
||||
+ }
|
||||
|
||||
+7
-8
@@ -51,7 +51,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -255,5 +_,34 @@
|
||||
@@ -255,5 +_,33 @@
|
||||
|
||||
protected AbstractContainerMenu m_6555_(int p_58990_, Inventory p_58991_) {
|
||||
return new BrewingStandMenu(p_58990_, p_58991_, this, this.f_58971_);
|
||||
@@ -62,13 +62,12 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing) {
|
||||
+ if (!this.f_58859_ && facing != null && capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER) {
|
||||
+ if (facing == Direction.UP)
|
||||
+ return handlers[0].cast();
|
||||
+ else if (facing == Direction.DOWN)
|
||||
+ return handlers[1].cast();
|
||||
+ else
|
||||
+ return handlers[2].cast();
|
||||
+ if (capability == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && facing != null && !this.f_58859_) {
|
||||
+ return switch (facing) {
|
||||
+ case UP -> handlers[0].cast();
|
||||
+ case DOWN -> handlers[1].cast();
|
||||
+ default -> handlers[2].cast();
|
||||
+ };
|
||||
+ }
|
||||
+ return super.getCapability(capability, facing);
|
||||
+ }
|
||||
|
||||
+3
-3
@@ -17,7 +17,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> cap, Direction side) {
|
||||
+ if (!this.f_58859_ && cap == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER) {
|
||||
+ if (cap == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && !this.f_58859_) {
|
||||
+ if (this.chestHandler == null)
|
||||
+ this.chestHandler = net.minecraftforge.common.util.LazyOptional.of(this::createHandler);
|
||||
+ return this.chestHandler.cast();
|
||||
@@ -27,10 +27,10 @@
|
||||
+
|
||||
+ private net.minecraftforge.items.IItemHandlerModifiable createHandler() {
|
||||
+ BlockState state = this.m_58900_();
|
||||
+ if (!(state.m_60734_() instanceof ChestBlock)) {
|
||||
+ if (!(state.m_60734_() instanceof ChestBlock chestBlock)) {
|
||||
+ return new net.minecraftforge.items.wrapper.InvWrapper(this);
|
||||
+ }
|
||||
+ Container inv = ChestBlock.m_51511_((ChestBlock) state.m_60734_(), state, m_58904_(), m_58899_(), true);
|
||||
+ Container inv = ChestBlock.m_51511_(chestBlock, state, m_58904_(), m_58899_(), true);
|
||||
+ return new net.minecraftforge.items.wrapper.InvWrapper(inv == null ? this : inv);
|
||||
+ }
|
||||
+
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
+
|
||||
+ @Override
|
||||
+ public <T> net.minecraftforge.common.util.LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> cap, @org.jetbrains.annotations.Nullable net.minecraft.core.Direction side) {
|
||||
+ if (!this.f_58859_ && cap == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER)
|
||||
+ if (cap == net.minecraftforge.common.capabilities.ForgeCapabilities.ITEM_HANDLER && !this.f_58859_)
|
||||
+ return itemHandler.cast();
|
||||
+ return super.getCapability(cap, side);
|
||||
+ }
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
--- a/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
||||
+++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
||||
@@ -42,19 +_,22 @@
|
||||
for(ServerPlayer serverplayer : p_64576_.m_6907_()) {
|
||||
if (!serverplayer.m_5833_()) {
|
||||
BlockPos blockpos = serverplayer.m_20183_();
|
||||
- if (!p_64576_.m_6042_().f_223549_() || blockpos.m_123342_() >= p_64576_.m_5736_() && p_64576_.m_45527_(blockpos)) {
|
||||
- DifficultyInstance difficultyinstance = p_64576_.m_6436_(blockpos);
|
||||
+ DifficultyInstance difficultyinstance = p_64576_.m_6436_(blockpos);
|
||||
+ var event = new net.minecraftforge.event.entity.player.PlayerSpawnPhantomsEvent(serverplayer, 1 + randomsource.m_188503_(difficultyinstance.m_19048_().m_19028_() + 1));
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event);
|
||||
+ if (event.getResult() == net.minecraftforge.eventbus.api.Event.Result.DENY) continue;
|
||||
+ if (event.getResult() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || !p_64576_.m_6042_().f_223549_() || blockpos.m_123342_() >= p_64576_.m_5736_() && p_64576_.m_45527_(blockpos)) {
|
||||
if (difficultyinstance.m_19049_(randomsource.m_188501_() * 3.0F)) {
|
||||
ServerStatsCounter serverstatscounter = serverplayer.m_8951_();
|
||||
int j = Mth.m_14045_(serverstatscounter.m_13015_(Stats.f_12988_.m_12902_(Stats.f_12992_)), 1, Integer.MAX_VALUE);
|
||||
int k = 24000;
|
||||
- if (randomsource.m_188503_(j) >= 72000) {
|
||||
+ if (event.getResult() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || randomsource.m_188503_(j) >= 72000) {
|
||||
BlockPos blockpos1 = blockpos.m_6630_(20 + randomsource.m_188503_(15)).m_122030_(-10 + randomsource.m_188503_(21)).m_122020_(-10 + randomsource.m_188503_(21));
|
||||
BlockState blockstate = p_64576_.m_8055_(blockpos1);
|
||||
FluidState fluidstate = p_64576_.m_6425_(blockpos1);
|
||||
if (NaturalSpawner.m_47056_(p_64576_, blockpos1, blockstate, fluidstate, EntityType.f_20509_)) {
|
||||
SpawnGroupData spawngroupdata = null;
|
||||
- int l = 1 + randomsource.m_188503_(difficultyinstance.m_19048_().m_19028_() + 1);
|
||||
+ int l = event.getPhantomsToSpawn();
|
||||
|
||||
for(int i1 = 0; i1 < l; ++i1) {
|
||||
Phantom phantom = EntityType.f_20509_.m_20615_(p_64576_);
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
--- a/net/minecraft/world/level/levelgen/feature/treedecorators/AlterGroundDecorator.java
|
||||
+++ b/net/minecraft/world/level/levelgen/feature/treedecorators/AlterGroundDecorator.java
|
||||
@@ -72,7 +_,7 @@
|
||||
for(int i = 2; i >= -3; --i) {
|
||||
BlockPos blockpos = p_225975_.m_6630_(i);
|
||||
if (Feature.m_65788_(p_225974_.m_226058_(), blockpos)) {
|
||||
- p_225974_.m_226061_(blockpos, this.f_69303_.m_213972_(p_225974_.m_226067_(), p_225975_));
|
||||
+ p_225974_.m_226061_(blockpos, net.minecraftforge.event.ForgeEventFactory.alterGround(p_225974_.m_226058_(), p_225974_.m_226067_(), blockpos, this.f_69303_.m_213972_(p_225974_.m_226067_(), p_225975_)));
|
||||
break;
|
||||
}
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ buildscript {
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
|
||||
}
|
||||
|
||||
rootProject.name = 'ForgeRoot'
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"tag": "forge:rods/wooden"
|
||||
},
|
||||
"X": {
|
||||
"item": "minecraft:string"
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"category": "misc",
|
||||
"key": {
|
||||
"H": {
|
||||
"item": "minecraft:honeycomb"
|
||||
},
|
||||
"S": {
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
"S",
|
||||
"H"
|
||||
],
|
||||
"result": {
|
||||
"item": "minecraft:candle"
|
||||
},
|
||||
"show_notification": true
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
"tag": "forge:ingots/iron"
|
||||
},
|
||||
"~": {
|
||||
"item": "minecraft:string"
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"tag": "forge:rods/wooden"
|
||||
},
|
||||
"X": {
|
||||
"item": "minecraft:string"
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"category": "equipment",
|
||||
"key": {
|
||||
"O": {
|
||||
"item": "minecraft:slime_ball"
|
||||
},
|
||||
"~": {
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
"~~ ",
|
||||
"~O ",
|
||||
" ~"
|
||||
],
|
||||
"result": {
|
||||
"count": 2,
|
||||
"item": "minecraft:lead"
|
||||
},
|
||||
"show_notification": true
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"category": "misc",
|
||||
"key": {
|
||||
"#": {
|
||||
"tag": "minecraft:planks"
|
||||
},
|
||||
"@": {
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
"@@",
|
||||
"##"
|
||||
],
|
||||
"result": {
|
||||
"item": "minecraft:loom"
|
||||
},
|
||||
"show_notification": true
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"category": "misc",
|
||||
"key": {
|
||||
"I": {
|
||||
"item": "minecraft:bamboo"
|
||||
},
|
||||
"~": {
|
||||
"tag": "forge:string"
|
||||
}
|
||||
},
|
||||
"pattern": [
|
||||
"I~I",
|
||||
"I I",
|
||||
"I I"
|
||||
],
|
||||
"result": {
|
||||
"count": 6,
|
||||
"item": "minecraft:scaffolding"
|
||||
},
|
||||
"show_notification": true
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"textures": [
|
||||
"minecraft:generic_7",
|
||||
"minecraft:generic_6",
|
||||
"minecraft:generic_5",
|
||||
"minecraft:generic_4",
|
||||
"minecraft:generic_3",
|
||||
"minecraft:generic_2",
|
||||
"minecraft:generic_1",
|
||||
"minecraft:generic_0"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"textures": [
|
||||
"minecraft:drip_hang"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"textures": [
|
||||
"minecraft:sga_a",
|
||||
"minecraft:sga_b",
|
||||
"minecraft:sga_c",
|
||||
"minecraft:sga_d",
|
||||
"minecraft:sga_e",
|
||||
"minecraft:sga_f",
|
||||
"minecraft:sga_g",
|
||||
"minecraft:sga_h",
|
||||
"minecraft:sga_i",
|
||||
"minecraft:sga_j",
|
||||
"minecraft:sga_k",
|
||||
"minecraft:sga_l",
|
||||
"minecraft:sga_m",
|
||||
"minecraft:sga_n",
|
||||
"minecraft:sga_o",
|
||||
"minecraft:sga_p",
|
||||
"minecraft:sga_q",
|
||||
"minecraft:sga_r",
|
||||
"minecraft:sga_s",
|
||||
"minecraft:sga_t",
|
||||
"minecraft:sga_u",
|
||||
"minecraft:sga_v",
|
||||
"minecraft:sga_w",
|
||||
"minecraft:sga_x",
|
||||
"minecraft:sga_y",
|
||||
"minecraft:sga_z"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"textures": [
|
||||
"minecraft:splash_0",
|
||||
"minecraft:splash_1",
|
||||
"minecraft:splash_2",
|
||||
"minecraft:splash_3"
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1,14 @@
|
||||
{
|
||||
"remove": [
|
||||
"minecraft:dirt",
|
||||
"minecraft:oak_door",
|
||||
"minecraft:dark_oak_door",
|
||||
"minecraft:anvil",
|
||||
"minecraft:basalt",
|
||||
"minecraft:polished_andesite",
|
||||
"#minecraft:beehives",
|
||||
"#minecraft:banners",
|
||||
"#minecraft:beds"
|
||||
],
|
||||
"values": []
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"remove": [
|
||||
"minecraft:music_disc_cat"
|
||||
],
|
||||
"values": []
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"remove": [
|
||||
"minecraft:spruce_planks"
|
||||
],
|
||||
"values": []
|
||||
}
|
||||
@@ -13,10 +13,30 @@ import net.minecraftforge.forgespi.language.IModInfo;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class ConfigScreenHandler
|
||||
{
|
||||
public record ConfigScreenFactory(BiFunction<Minecraft, Screen, Screen> screenFunction) implements IExtensionPoint<ConfigScreenFactory> {}
|
||||
/**
|
||||
* @param screenFunction A function that takes the {@link Minecraft} client instance and the mods screen as
|
||||
* arguments and returns your config screen to show when the player clicks the config button
|
||||
* for your mod on the mods screen.
|
||||
* <p>You should call {@link Minecraft#setScreen(Screen)} with the provided client instance
|
||||
* and mods screen for the action of your close button.</p>
|
||||
*/
|
||||
public record ConfigScreenFactory(BiFunction<Minecraft, Screen, Screen> screenFunction) implements IExtensionPoint<ConfigScreenFactory> {
|
||||
/**
|
||||
* @param screenFunction A function that takes the mods screen as an argument and returns your config screen to
|
||||
* show when the player clicks the config button for your mod on the mods screen.
|
||||
* <p>You should call {@link Minecraft#setScreen(Screen)} with the provided mods screen
|
||||
* for the action of your close button, using {@link Screen#minecraft} to get the client
|
||||
* instance.</p>
|
||||
*/
|
||||
public ConfigScreenFactory(Function<Screen, Screen> screenFunction) {
|
||||
this((mcClient, modsScreen) -> screenFunction.apply(modsScreen));
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<BiFunction<Minecraft, Screen, Screen>> getScreenFactoryFor(IModInfo selectedMod)
|
||||
{
|
||||
return ModList.get().getModContainerById(selectedMod.getModId()).
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) Forge Development LLC and contributors
|
||||
* SPDX-License-Identifier: LGPL-2.1-only
|
||||
*/
|
||||
|
||||
package net.minecraftforge.client;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import net.minecraft.client.particle.FireworkParticles;
|
||||
import net.minecraft.world.item.FireworkRocketItem;
|
||||
|
||||
/**
|
||||
* Keeps track of custom firework shape types, because Particle is client side only this can't be on the Shape itself.
|
||||
* So sometime during your client initalization call register.
|
||||
*/
|
||||
public class FireworkShapeFactoryRegistry {
|
||||
private static final Map<FireworkRocketItem.Shape, Factory> factories = new HashMap<>();
|
||||
|
||||
public static interface Factory {
|
||||
void build(FireworkParticles.Starter starter, boolean trail, boolean flicker, int[] colors, int[] fadecolors);
|
||||
}
|
||||
|
||||
public static void register(FireworkRocketItem.Shape shape, Factory factory) {
|
||||
factories.put(shape, factory);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Factory get(FireworkRocketItem.Shape shape) {
|
||||
return factories.get(shape);
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,10 @@ import com.mojang.blaze3d.shaders.FogShape;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import com.mojang.datafixers.util.Either;
|
||||
import com.mojang.math.Constants;
|
||||
import net.minecraft.FileUtil;
|
||||
import net.minecraft.client.Camera;
|
||||
import net.minecraft.client.KeyMapping;
|
||||
@@ -146,6 +148,8 @@ import net.minecraftforge.client.gui.overlay.GuiOverlayManager;
|
||||
import net.minecraftforge.client.model.data.ModelData;
|
||||
import net.minecraftforge.client.textures.ForgeTextureMetadata;
|
||||
import net.minecraftforge.client.textures.TextureAtlasSpriteLoaderManager;
|
||||
import net.minecraftforge.common.ForgeConfig;
|
||||
import net.minecraftforge.common.ForgeHooks;
|
||||
import net.minecraftforge.common.ForgeI18n;
|
||||
import net.minecraftforge.common.ForgeMod;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
@@ -496,21 +500,30 @@ public class ForgeHooksClient
|
||||
return new Material(TextureAtlas.LOCATION_BLOCKS, loc);
|
||||
}
|
||||
|
||||
public static void fillNormal(int[] faceData, Direction facing)
|
||||
{
|
||||
fillNormal(faceData, facing, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* internal, relies on fixed format of FaceBakery
|
||||
*/
|
||||
// TODO Do we need this?
|
||||
public static void fillNormal(int[] faceData, Direction facing)
|
||||
public static void fillNormal(int[] faceData, Direction facing, boolean calculateNormals)
|
||||
{
|
||||
Vector3f v1 = getVertexPos(faceData, 3);
|
||||
Vector3f t1 = getVertexPos(faceData, 1);
|
||||
Vector3f v2 = getVertexPos(faceData, 2);
|
||||
Vector3f t2 = getVertexPos(faceData, 0);
|
||||
v1.sub(t1);
|
||||
v2.sub(t2);
|
||||
v2.cross(v1);
|
||||
v2.normalize();
|
||||
|
||||
Vector3f v2;
|
||||
if (calculateNormals || ForgeConfig.CLIENT.calculateAllNormals()) {
|
||||
Vector3f v1 = getVertexPos(faceData, 3);
|
||||
Vector3f t1 = getVertexPos(faceData, 1);
|
||||
v2 = getVertexPos(faceData, 2);
|
||||
Vector3f t2 = getVertexPos(faceData, 0);
|
||||
v1.sub(t1);
|
||||
v2.sub(t2);
|
||||
v2.cross(v1);
|
||||
v2.normalize();
|
||||
} else {
|
||||
v2 = new Vector3f(facing.getNormal().getX(), facing.getNormal().getY(), facing.getNormal().getZ());
|
||||
}
|
||||
int x = ((byte) Math.round(v2.x() * 127)) & 0xFF;
|
||||
int y = ((byte) Math.round(v2.y() * 127)) & 0xFF;
|
||||
int z = ((byte) Math.round(v2.z() * 127)) & 0xFF;
|
||||
@@ -1192,27 +1205,46 @@ public class ForgeHooksClient
|
||||
return new ResourceLocation(loc.getNamespace(), normalised);
|
||||
}
|
||||
|
||||
// Use ForgeHooks.onCreativeModeTabBuildContents()
|
||||
// since calling this will crash if called on server
|
||||
@Deprecated(forRemoval = true, since = "1.20.1")
|
||||
public static void onCreativeModeTabBuildContents(CreativeModeTab tab, ResourceKey<CreativeModeTab> tabKey, CreativeModeTab.DisplayItemsGenerator originalGenerator, CreativeModeTab.ItemDisplayParameters params, CreativeModeTab.Output output)
|
||||
{
|
||||
final var entries = new MutableHashedLinkedMap<ItemStack, CreativeModeTab.TabVisibility>(ItemStackLinkedSet.TYPE_AND_TAG,
|
||||
(key, left, right) -> {
|
||||
//throw new IllegalStateException("Accidentally adding the same item stack twice " + key.getDisplayName().getString() + " to a Creative Mode Tab: " + tab.getDisplayName().getString());
|
||||
// Vanilla adds enchanting books twice in both visibilities.
|
||||
// This is just code cleanliness for them. For us lets just increase the visibility and merge the entries.
|
||||
return CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS;
|
||||
}
|
||||
);
|
||||
// Bounce to ForgeHooks.onCreativeModeBuildContents(...)
|
||||
ForgeHooks.onCreativeModeTabBuildContents(tab, tabKey, originalGenerator, params, output);
|
||||
}
|
||||
|
||||
originalGenerator.accept(params, (stack, vis) -> {
|
||||
if (stack.getCount() != 1)
|
||||
throw new IllegalArgumentException("The stack count must be 1");
|
||||
entries.put(stack, vis);
|
||||
});
|
||||
|
||||
ModLoader.get().postEvent(new BuildCreativeModeTabContentsEvent(tab, tabKey, params, entries));
|
||||
|
||||
for (var entry : entries)
|
||||
output.accept(entry.getKey(), entry.getValue());
|
||||
/**
|
||||
* This function is a clone of {@link Direction#getNearest(float, float, float)} designed to return a consistent
|
||||
* direction when the normal is at an inflection point (ie 45 degrees) rounding errors
|
||||
* from associated matrix multiplication (such as during {@link SheetedDecalTextureGenerator#endVertex()}
|
||||
* can cause the direction chosen to be unstable.
|
||||
*
|
||||
* The function will only take effect if the Forge Client config option "stabilizeDirectionGetNearest" is enabled.
|
||||
*
|
||||
* This is a port of the downstream changes from https://github.com/neoforged/NeoForge PR #26
|
||||
*
|
||||
* @param nX X component of the normal
|
||||
* @param nY Y component of the normal
|
||||
* @param nZ Z component of the normal
|
||||
* @return the nearest Direction to the passed in normal, biased slightly in favor of the order of declaration
|
||||
*/
|
||||
public static Direction getNearestStable(float nX, float nY, float nZ)
|
||||
{
|
||||
if (ForgeConfig.CLIENT.stabilizeDirectionGetNearest.get()) {
|
||||
Direction ret = Direction.NORTH;
|
||||
float sum = Float.MIN_VALUE;
|
||||
for(Direction dir : Direction.values()) {
|
||||
float newSum = nX * (float)dir.getNormal().getX() + nY * (float)dir.getNormal().getY() + nZ * (float)dir.getNormal().getZ();
|
||||
if (newSum > sum + Constants.EPSILON) {
|
||||
sum = newSum;
|
||||
ret = dir;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
return Direction.getNearest(nX, nY, nZ);
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure the below method is only ever called once (by forge).
|
||||
|
||||
@@ -22,8 +22,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static net.minecraft.client.RecipeBookCategories.*;
|
||||
|
||||
/**
|
||||
* Manager for {@link RecipeBookType recipe book types} and {@link RecipeBookCategories categories}.
|
||||
* <p>
|
||||
@@ -63,7 +61,13 @@ public final class RecipeBookManager
|
||||
public static void init()
|
||||
{
|
||||
// The ImmutableMap is the patched out value of AGGREGATE_CATEGORIES
|
||||
var aggregateCategories = new HashMap<>(ImmutableMap.of(CRAFTING_SEARCH, ImmutableList.of(CRAFTING_EQUIPMENT, CRAFTING_BUILDING_BLOCKS, CRAFTING_MISC, CRAFTING_REDSTONE), FURNACE_SEARCH, ImmutableList.of(FURNACE_FOOD, FURNACE_BLOCKS, FURNACE_MISC), BLAST_FURNACE_SEARCH, ImmutableList.of(BLAST_FURNACE_BLOCKS, BLAST_FURNACE_MISC), SMOKER_SEARCH, ImmutableList.of(SMOKER_FOOD)));
|
||||
var aggregateCategories = new HashMap<>(ImmutableMap.of(
|
||||
RecipeBookCategories.CRAFTING_SEARCH, ImmutableList.of(RecipeBookCategories.CRAFTING_EQUIPMENT, RecipeBookCategories.CRAFTING_BUILDING_BLOCKS, RecipeBookCategories.CRAFTING_MISC, RecipeBookCategories.CRAFTING_REDSTONE),
|
||||
RecipeBookCategories.FURNACE_SEARCH, ImmutableList.of(RecipeBookCategories.FURNACE_FOOD, RecipeBookCategories.FURNACE_BLOCKS, RecipeBookCategories.FURNACE_MISC),
|
||||
RecipeBookCategories.BLAST_FURNACE_SEARCH, ImmutableList.of(RecipeBookCategories.BLAST_FURNACE_BLOCKS, RecipeBookCategories.BLAST_FURNACE_MISC),
|
||||
RecipeBookCategories.SMOKER_SEARCH, ImmutableList.of(RecipeBookCategories.SMOKER_FOOD)
|
||||
));
|
||||
|
||||
var typeCategories = new HashMap<RecipeBookType, ImmutableList<RecipeBookCategories>>();
|
||||
var recipeCategoryLookups = new HashMap<RecipeType<?>, Function<Recipe<?>, RecipeBookCategories>>();
|
||||
var event = new RegisterRecipeBookCategoriesEvent(aggregateCategories, typeCategories, recipeCategoryLookups);
|
||||
|
||||
+9
-9
@@ -67,15 +67,15 @@ public interface IForgeDimensionSpecialEffects
|
||||
* Allows for manipulating the coloring of the lightmap texture.
|
||||
* Will be called for each 16*16 combination of sky/block light values.
|
||||
*
|
||||
* @param level The current level (client-side).
|
||||
* @param partialTicks Progress between ticks.
|
||||
* @param skyDarken Current darkness of the sky.
|
||||
* @param skyLight Sky light brightness factor.
|
||||
* @param blockLight Block light brightness factor.
|
||||
* @param pixelX X-coordinate of the lightmap texture.
|
||||
* @param pixelY Y-coordinate of the lightmap texture.
|
||||
* @param colors The color values that will be used: [r, g, b].
|
||||
* @param level The current level (client-side).
|
||||
* @param partialTicks Progress between ticks.
|
||||
* @param skyDarken Current darkness of the sky (can be used to calculate sky light).
|
||||
* @param blockLightRedFlicker Block light flicker factor (red color) (can be used to calculate block light).
|
||||
* @param skyLight Sky light brightness (accounting for sky darkness).
|
||||
* @param pixelX X-coordinate of the lightmap texture (block).
|
||||
* @param pixelY Y-coordinate of the lightmap texture (sky).
|
||||
* @param colors The color values that will be used: [r, g, b].
|
||||
* @see LightTexture#updateLightTexture(float)
|
||||
*/
|
||||
default void adjustLightmapColors(ClientLevel level, float partialTicks, float skyDarken, float skyLight, float blockLight, int pixelX, int pixelY, Vector3f colors) {}
|
||||
default void adjustLightmapColors(ClientLevel level, float partialTicks, float skyDarken, float blockLightRedFlicker, float skyLight, int pixelX, int pixelY, Vector3f colors) {}
|
||||
}
|
||||
@@ -136,4 +136,63 @@ public interface IForgeGuiGraphics
|
||||
|
||||
self().blit(texture, x, y, boundsWidth, boundsHeight, 0.0f,0.0f, rectWidth, rectHeight, rectWidth, rectHeight);
|
||||
}
|
||||
|
||||
/**
|
||||
* Version of {@link GuiGraphics#blitNineSliced(ResourceLocation, int, int, int, int, int, int, int, int, int)} that supports specifying the texture's size.
|
||||
*/
|
||||
default void blitNineSlicedSized(ResourceLocation texture, int x, int y, int width, int height, int sliceSize, int uWidth, int vHeight, int uOffset, int vOffset,
|
||||
int textureWidth, int textureHeight)
|
||||
{
|
||||
blitNineSlicedSized(texture, x, y, width, height, sliceSize, sliceSize, uWidth, vHeight, uOffset, vOffset, textureWidth, textureHeight);
|
||||
}
|
||||
|
||||
/**
|
||||
* Version of {@link GuiGraphics#blitNineSliced(ResourceLocation, int, int, int, int, int, int, int, int, int, int)} that supports specifying the texture's size.
|
||||
*/
|
||||
default void blitNineSlicedSized(ResourceLocation texture, int x, int y, int width, int height, int sliceWidth, int sliceHeight, int uWidth, int vHeight,
|
||||
int uOffset, int vOffset, int textureWidth, int textureHeight)
|
||||
{
|
||||
blitNineSlicedSized(texture, x, y, width, height, sliceWidth, sliceHeight, sliceWidth, sliceHeight, uWidth, vHeight, uOffset, vOffset, textureWidth, textureHeight);
|
||||
}
|
||||
|
||||
/**
|
||||
* Version of {@link GuiGraphics#blitNineSliced(ResourceLocation, int, int, int, int, int, int, int, int, int, int, int, int)} that supports specifying the texture's size.
|
||||
*/
|
||||
default void blitNineSlicedSized(ResourceLocation texture, int x, int y, int width, int height, int cornerWidth, int cornerHeight, int edgeWidth, int edgeHeight,
|
||||
int uWidth, int vHeight, int uOffset, int vOffset, int textureWidth, int textureHeight)
|
||||
{
|
||||
cornerWidth = Math.min(cornerWidth, width / 2);
|
||||
edgeWidth = Math.min(edgeWidth, width / 2);
|
||||
cornerHeight = Math.min(cornerHeight, height / 2);
|
||||
edgeHeight = Math.min(edgeHeight, height / 2);
|
||||
GuiGraphics self = self();
|
||||
if (width == uWidth && height == vHeight)
|
||||
{
|
||||
self.blit(texture, x, y, uOffset, vOffset, width, height, textureWidth, textureHeight);
|
||||
}
|
||||
else if (height == vHeight)
|
||||
{
|
||||
self.blit(texture, x, y, uOffset, vOffset, cornerWidth, height, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x + cornerWidth, y, width - edgeWidth - cornerWidth, height, uOffset + cornerWidth, vOffset, uWidth - edgeWidth - cornerWidth, vHeight, textureWidth, textureHeight);
|
||||
self.blit(texture, x + width - edgeWidth, y, uOffset + uWidth - edgeWidth, vOffset, edgeWidth, height, textureWidth, textureHeight);
|
||||
}
|
||||
else if (width == uWidth)
|
||||
{
|
||||
self.blit(texture, x, y, uOffset, vOffset, width, cornerHeight, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x, y + cornerHeight, width, height - edgeHeight - cornerHeight, uOffset, vOffset + cornerHeight, uWidth, vHeight - edgeHeight - cornerHeight, textureWidth, textureHeight);
|
||||
self.blit(texture, x, y + height - edgeHeight, uOffset, vOffset + vHeight - edgeHeight, width, edgeHeight, textureWidth, textureHeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
self.blit(texture, x, y, uOffset, vOffset, cornerWidth, cornerHeight, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x + cornerWidth, y, width - edgeWidth - cornerWidth, cornerHeight, uOffset + cornerWidth, vOffset, uWidth - edgeWidth - cornerWidth, cornerHeight, textureWidth, textureHeight);
|
||||
self.blit(texture, x + width - edgeWidth, y, uOffset + uWidth - edgeWidth, vOffset, edgeWidth, cornerHeight, textureWidth, textureHeight);
|
||||
self.blit(texture, x, y + height - edgeHeight, uOffset, vOffset + vHeight - edgeHeight, cornerWidth, edgeHeight, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x + cornerWidth, y + height - edgeHeight, width - edgeWidth - cornerWidth, edgeHeight, uOffset + cornerWidth, vOffset + vHeight - edgeHeight, uWidth - edgeWidth - cornerWidth, edgeHeight, textureWidth, textureHeight);
|
||||
self.blit(texture, x + width - edgeWidth, y + height - edgeHeight, uOffset + uWidth - edgeWidth, vOffset + vHeight - edgeHeight, edgeWidth, edgeHeight, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x, y + cornerHeight, cornerWidth, height - edgeHeight - cornerHeight, uOffset, vOffset + cornerHeight, cornerWidth, vHeight - edgeHeight - cornerHeight, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x + cornerWidth, y + cornerHeight, width - edgeWidth - cornerWidth, height - edgeHeight - cornerHeight, uOffset + cornerWidth, vOffset + cornerHeight, uWidth - edgeWidth - cornerWidth, vHeight - edgeHeight - cornerHeight, textureWidth, textureHeight);
|
||||
self.blitRepeating(texture, x + width - edgeWidth, y + cornerHeight, cornerWidth, height - edgeHeight - cornerHeight, uOffset + uWidth - edgeWidth, vOffset + cornerHeight, edgeWidth, vHeight - edgeHeight - cornerHeight, textureWidth, textureHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,11 +14,9 @@ import org.jetbrains.annotations.NotNull;
|
||||
/**
|
||||
* Extension interface for {@link KeyMapping}.
|
||||
*/
|
||||
public interface IForgeKeyMapping
|
||||
{
|
||||
private KeyMapping self()
|
||||
{
|
||||
return (KeyMapping) this;
|
||||
public interface IForgeKeyMapping {
|
||||
private KeyMapping self() {
|
||||
return (KeyMapping)this;
|
||||
}
|
||||
|
||||
@NotNull InputConstants.Key getKey();
|
||||
@@ -26,13 +24,11 @@ public interface IForgeKeyMapping
|
||||
/**
|
||||
* {@return true if the key conflict context and modifier are active and the keyCode matches this binding, false otherwise}
|
||||
*/
|
||||
default boolean isActiveAndMatches(InputConstants.Key keyCode)
|
||||
{
|
||||
default boolean isActiveAndMatches(InputConstants.Key keyCode) {
|
||||
return keyCode != InputConstants.UNKNOWN && keyCode.equals(getKey()) && getKeyConflictContext().isActive() && getKeyModifier().isActive(getKeyConflictContext());
|
||||
}
|
||||
|
||||
default void setToDefault()
|
||||
{
|
||||
default void setToDefault() {
|
||||
setKeyModifierAndCode(getDefaultKeyModifier(), self().getDefaultKey());
|
||||
}
|
||||
|
||||
@@ -46,22 +42,17 @@ public interface IForgeKeyMapping
|
||||
|
||||
void setKeyModifierAndCode(KeyModifier keyModifier, InputConstants.Key keyCode);
|
||||
|
||||
default boolean isConflictContextAndModifierActive()
|
||||
{
|
||||
default boolean isConflictContextAndModifierActive() {
|
||||
return getKeyConflictContext().isActive() && getKeyModifier().isActive(getKeyConflictContext());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true when one of the bindings' key codes conflicts with the other's modifier.
|
||||
*/
|
||||
default boolean hasKeyModifierConflict(KeyMapping other)
|
||||
{
|
||||
if (getKeyConflictContext().conflicts(other.getKeyConflictContext()) || other.getKeyConflictContext().conflicts(getKeyConflictContext()))
|
||||
{
|
||||
default boolean hasKeyModifierConflict(KeyMapping other) {
|
||||
if (getKeyConflictContext().conflicts(other.getKeyConflictContext()) || other.getKeyConflictContext().conflicts(getKeyConflictContext())) {
|
||||
if (getKeyModifier().matches(other.getKey()) || other.getKeyModifier().matches(getKey()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
package net.minecraftforge.client.extensions.common;
|
||||
|
||||
import net.minecraft.client.multiplayer.ClientLevel;
|
||||
import net.minecraft.client.particle.ParticleEngine;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.tags.FluidTags;
|
||||
@@ -15,6 +16,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.material.FluidState;
|
||||
import net.minecraft.world.phys.HitResult;
|
||||
@@ -113,4 +115,17 @@ public interface IClientBlockExtensions
|
||||
}
|
||||
return originalColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the breaking particles created from the {@link BlockState} passed should be tinted with biome colors.
|
||||
*
|
||||
* @param state The state of this block
|
||||
* @param level The level the particles are spawning in
|
||||
* @param pos The position of the block
|
||||
* @return {@code true} if the particles should be tinted.
|
||||
*/
|
||||
default boolean areBreakingParticlesTinted(BlockState state, ClientLevel level, BlockPos pos)
|
||||
{
|
||||
return !state.is(Blocks.GRASS_BLOCK);
|
||||
}
|
||||
}
|
||||
@@ -149,7 +149,7 @@ public class LoadingErrorScreen extends ErrorScreen {
|
||||
for (FormattedCharSequence string : strings)
|
||||
{
|
||||
if (center)
|
||||
guiGraphics.drawString(font, string, left + (width) - font.width(string) / 2F, (float) y, 0xFFFFFF, false);
|
||||
guiGraphics.drawString(font, string, left + (width / 2F) - font.width(string) / 2F, (float) y, 0xFFFFFF, false);
|
||||
else
|
||||
guiGraphics.drawString(font, string, left + 5, y, 0xFFFFFF, false);
|
||||
y += font.lineHeight;
|
||||
|
||||
@@ -85,8 +85,10 @@ public class ModListScreen extends Screen
|
||||
}
|
||||
|
||||
private static final int PADDING = 6;
|
||||
private static final int BUTTON_MARGIN = 1;
|
||||
private static final int NUM_BUTTONS = SortType.values().length;
|
||||
|
||||
private Screen parentScreen;
|
||||
private final Screen parentScreen;
|
||||
|
||||
private ModListWidget modList;
|
||||
private InfoPanel modInfo;
|
||||
@@ -96,8 +98,6 @@ public class ModListScreen extends Screen
|
||||
private final List<IModInfo> unsortedMods;
|
||||
private Button configButton, openModsFolderButton, doneButton;
|
||||
|
||||
private int buttonMargin = 1;
|
||||
private int numButtons = SortType.values().length;
|
||||
private String lastFilterText = "";
|
||||
|
||||
private EditBox search;
|
||||
@@ -109,8 +109,8 @@ public class ModListScreen extends Screen
|
||||
{
|
||||
super(Component.translatable("fml.menu.mods.title"));
|
||||
this.parentScreen = parentScreen;
|
||||
this.mods = Collections.unmodifiableList(ModList.get().getMods());
|
||||
this.unsortedMods = Collections.unmodifiableList(this.mods);
|
||||
this.mods = ModList.get().getMods();
|
||||
this.unsortedMods = List.copyOf(this.mods);
|
||||
}
|
||||
|
||||
class InfoPanel extends ScrollPanel {
|
||||
@@ -207,7 +207,7 @@ public class ModListScreen extends Screen
|
||||
if (!isMouseOver(mouseX, mouseY))
|
||||
return null;
|
||||
|
||||
double offset = (mouseY - top) + border + scrollDistance + 1;
|
||||
double offset = (mouseY - top - PADDING - border) + scrollDistance;
|
||||
if (logoPath != null) {
|
||||
offset -= 50;
|
||||
}
|
||||
@@ -215,10 +215,10 @@ public class ModListScreen extends Screen
|
||||
return null;
|
||||
|
||||
int lineIdx = (int) (offset / font.lineHeight);
|
||||
if (lineIdx >= lines.size() || lineIdx < 1)
|
||||
if (lineIdx >= lines.size() || lineIdx < 0)
|
||||
return null;
|
||||
|
||||
FormattedCharSequence line = lines.get(lineIdx-1);
|
||||
FormattedCharSequence line = lines.get(lineIdx);
|
||||
if (line != null)
|
||||
{
|
||||
return font.getSplitter().componentStyleAtWidth(line, mouseX - left - border);
|
||||
@@ -255,7 +255,7 @@ public class ModListScreen extends Screen
|
||||
listWidth = Math.max(listWidth,getFontRenderer().width(MavenVersionStringHelper.artifactVersionToString(mod.getVersion())) + 5);
|
||||
}
|
||||
listWidth = Math.max(Math.min(listWidth, width/3), 100);
|
||||
listWidth += listWidth % numButtons != 0 ? (numButtons - listWidth % numButtons) : 0;
|
||||
listWidth += listWidth % NUM_BUTTONS != 0 ? (NUM_BUTTONS - listWidth % NUM_BUTTONS) : 0;
|
||||
|
||||
int modInfoWidth = this.width - this.listWidth - (PADDING * 3);
|
||||
int doneButtonWidth = Math.min(modInfoWidth, 200);
|
||||
@@ -284,13 +284,13 @@ public class ModListScreen extends Screen
|
||||
search.setCanLoseFocus(true);
|
||||
configButton.active = false;
|
||||
|
||||
final int width = listWidth / numButtons;
|
||||
final int width = listWidth / NUM_BUTTONS;
|
||||
int x = PADDING;
|
||||
addRenderableWidget(SortType.NORMAL.button = Button.builder(SortType.NORMAL.getButtonText(), b -> resortMods(SortType.NORMAL)).bounds(x, PADDING, width - buttonMargin, 20).build());
|
||||
x += width + buttonMargin;
|
||||
addRenderableWidget(SortType.A_TO_Z.button = Button.builder(SortType.A_TO_Z.getButtonText(), b -> resortMods(SortType.A_TO_Z)).bounds(x, PADDING, width - buttonMargin, 20).build());
|
||||
x += width + buttonMargin;
|
||||
addRenderableWidget(SortType.Z_TO_A.button = Button.builder(SortType.Z_TO_A.getButtonText(), b -> resortMods(SortType.Z_TO_A)).bounds(x, PADDING, width - buttonMargin, 20).build());
|
||||
addRenderableWidget(SortType.NORMAL.button = Button.builder(SortType.NORMAL.getButtonText(), b -> resortMods(SortType.NORMAL)).bounds(x, PADDING, width - BUTTON_MARGIN, 20).build());
|
||||
x += width + BUTTON_MARGIN;
|
||||
addRenderableWidget(SortType.A_TO_Z.button = Button.builder(SortType.A_TO_Z.getButtonText(), b -> resortMods(SortType.A_TO_Z)).bounds(x, PADDING, width - BUTTON_MARGIN, 20).build());
|
||||
x += width + BUTTON_MARGIN;
|
||||
addRenderableWidget(SortType.Z_TO_A.button = Button.builder(SortType.Z_TO_A.getButtonText(), b -> resortMods(SortType.Z_TO_A)).bounds(x, PADDING, width - BUTTON_MARGIN, 20).build());
|
||||
resortMods(SortType.NORMAL);
|
||||
updateCache();
|
||||
}
|
||||
@@ -341,8 +341,12 @@ public class ModListScreen extends Screen
|
||||
|
||||
private void reloadMods()
|
||||
{
|
||||
this.mods = this.unsortedMods.stream().
|
||||
filter(mi->StringUtils.toLowerCase(stripControlCodes(mi.getDisplayName())).contains(StringUtils.toLowerCase(search.getValue()))).collect(Collectors.toList());
|
||||
this.mods = this.unsortedMods
|
||||
.stream()
|
||||
.filter(mi ->
|
||||
StringUtils.toLowerCase(stripControlCodes(mi.getDisplayName()))
|
||||
.contains(StringUtils.toLowerCase(search.getValue()))
|
||||
).collect(Collectors.toList());
|
||||
lastFilterText = search.getValue();
|
||||
}
|
||||
|
||||
@@ -464,7 +468,7 @@ public class ModListScreen extends Screen
|
||||
}
|
||||
*/
|
||||
|
||||
if ((vercheck.status() == VersionChecker.Status.OUTDATED || vercheck.status() == VersionChecker.Status.BETA_OUTDATED) && vercheck.changes().size() > 0)
|
||||
if ((vercheck.status() == VersionChecker.Status.OUTDATED || vercheck.status() == VersionChecker.Status.BETA_OUTDATED) && !vercheck.changes().isEmpty())
|
||||
{
|
||||
lines.add(null);
|
||||
lines.add(ForgeI18n.parseMessage("fml.menu.mods.info.changelogheader"));
|
||||
|
||||
Loaded 100 of 191 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user