mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-14 01:04:24 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e8942e0a7 |
No files matched your search
+3
-1
@@ -124,7 +124,7 @@ dependencies {
|
||||
installer(libs.bootstrap.api) // Needed by securemodules
|
||||
installer(libs.accesstransformers)
|
||||
installer(libs.eventbus)
|
||||
installer(libs.typetools) // Dep of EventBus
|
||||
installer(libs.jspecify) // Dep of EventBus
|
||||
installer(libs.forgespi)
|
||||
installer(libs.coremods)
|
||||
installer(libs.nashorn) // Dep of Coremods
|
||||
@@ -147,6 +147,8 @@ dependencies {
|
||||
|
||||
runtimeOnly(libs.bootstrap)
|
||||
runtimeOnly(libs.bootstrap.dev)
|
||||
|
||||
//annotationProcessor(libs.eventbus.validator)
|
||||
}
|
||||
|
||||
tasks.named('extractRangeMap').configure {
|
||||
|
||||
@@ -10,9 +10,10 @@ plugins {
|
||||
apply from: rootProject.file('build_shared.gradle')
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.nulls)
|
||||
compileOnly(libs.jetbrains.annotations)
|
||||
|
||||
api(libs.eventbus)
|
||||
annotationProcessor(libs.eventbus.validator)
|
||||
|
||||
implementation(project(':fmlloader'))
|
||||
implementation(libs.commons.io)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.fml.config.IConfigEvent;
|
||||
import net.minecraftforge.fml.loading.FMLLoader;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class Bindings {
|
||||
/**
|
||||
* @return A supplier of net.minecraftforge.common.MinecraftForge#EVENT_BUS
|
||||
*/
|
||||
public static Supplier<IEventBus> getForgeBus() {
|
||||
public static Supplier<BusGroup> getForgeBus() {
|
||||
return PROVIDER.getForgeBusSupplier();
|
||||
}
|
||||
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.fml.config.IConfigEvent;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public interface IBindingsProvider {
|
||||
Supplier<IEventBus> getForgeBusSupplier();
|
||||
Supplier<BusGroup> getForgeBusSupplier();
|
||||
Supplier<I18NParser> getMessageParser();
|
||||
Supplier<IConfigEvent.ConfigConfig> getConfigConfiguration();
|
||||
}
|
||||
@@ -5,8 +5,6 @@
|
||||
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.fml.loading.progress.ProgressMeter;
|
||||
|
||||
import java.util.Optional;
|
||||
@@ -61,14 +59,13 @@ public interface IModLoadingState {
|
||||
/**
|
||||
* Builds the transition task for this state with a blank pre-sync and post-sync task.
|
||||
*
|
||||
* @param <T> a type of event fired on the mod-specific event bus
|
||||
* @param syncExecutor a synchronous executor
|
||||
* @param parallelExecutor a parallel executor
|
||||
* @param progressBar a progress meter for tracking progress
|
||||
* @return a transition task for this state
|
||||
* @see #buildTransition(Executor, Executor, ProgressMeter, Function, Function)
|
||||
*/
|
||||
default <T extends Event & IModBusEvent> Optional<CompletableFuture<Void>> buildTransition(
|
||||
default Optional<CompletableFuture<Void>> buildTransition(
|
||||
final Executor syncExecutor,
|
||||
final Executor parallelExecutor,
|
||||
final ProgressMeter progressBar
|
||||
@@ -83,7 +80,6 @@ public interface IModLoadingState {
|
||||
* Builds the transition task for this state. The pre-sync and post-sync task functions allow the transition builder
|
||||
* to run these tasks on the same executor as the actual event dispatch and pre/post hooks.
|
||||
*
|
||||
* @param <T> a type of event fired on the mod-specific event bus
|
||||
* @param syncExecutor a synchronous executor
|
||||
* @param parallelExecutor a parallel executor
|
||||
* @param progressBar a progress meter for tracking progress
|
||||
@@ -91,7 +87,6 @@ public interface IModLoadingState {
|
||||
* @param postSyncTask a function which returns a task to run after event post-dispatch hook
|
||||
* @return a transition task for this state
|
||||
*/
|
||||
<T extends Event & IModBusEvent>
|
||||
Optional<CompletableFuture<Void>> buildTransition(final Executor syncExecutor,
|
||||
final Executor parallelExecutor,
|
||||
final ProgressMeter progressBar,
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.fml.loading.progress.ProgressMeter;
|
||||
|
||||
@@ -20,7 +19,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public interface IModStateTransition {
|
||||
/** Magic value to allow me to optimize the futures list by ignoring the default value without making old methods nullable. */
|
||||
public static final BiFunction<Executor, ? extends EventGenerator<?>, CompletableFuture<Void>> NULL_HOOK = (e, g) -> CompletableFuture.completedFuture(null);
|
||||
BiFunction<Executor, ? extends EventGenerator<?>, CompletableFuture<Void>> NULL_HOOK = (e, g) -> CompletableFuture.completedFuture(null);
|
||||
|
||||
static IModStateTransition buildNoopTransition() {
|
||||
return ModStateTransitionHelper.NOOP;
|
||||
@@ -51,7 +50,7 @@ public interface IModStateTransition {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
default <T extends Event & IModBusEvent> EventGenerator<T> eventFunction() {
|
||||
default <T extends IModBusEvent> EventGenerator<T> eventFunction() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -74,8 +73,8 @@ public interface IModStateTransition {
|
||||
@Deprecated(since = "1.21.3", forRemoval = true)
|
||||
default BiFunction<Executor, ? extends EventGenerator<?>, CompletableFuture<Void>> postDispatchHook() { return NULL_HOOK; }
|
||||
|
||||
interface EventGenerator<T extends Event & IModBusEvent> extends Function<ModContainer, T> {
|
||||
static <FN extends Event & IModBusEvent> EventGenerator<FN> fromFunction(Function<ModContainer, FN> fn) {
|
||||
interface EventGenerator<T extends IModBusEvent> extends Function<ModContainer, T> {
|
||||
static <FN extends IModBusEvent> EventGenerator<FN> fromFunction(Function<ModContainer, FN> fn) {
|
||||
return fn::apply;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.config.IConfigEvent;
|
||||
import net.minecraftforge.fml.config.ModConfig;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
@@ -162,5 +161,5 @@ public abstract class ModContainer {
|
||||
* Accept an arbitrary event for processing by the mod. Probably posted to an event bus in the lower level container.
|
||||
* @param e Event to accept
|
||||
*/
|
||||
protected <T extends Event & IModBusEvent> void acceptEvent(T e) {}
|
||||
protected <T extends IModBusEvent> void acceptEvent(T e) {}
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.fml.loading.FMLEnvironment;
|
||||
import net.minecraftforge.fml.loading.FMLLoader;
|
||||
@@ -88,7 +87,7 @@ public class ModLoader {
|
||||
this.loadingModList = FMLLoader.getLoadingModList();
|
||||
this.loadingExceptions = this.loadingModList.getErrors().stream()
|
||||
.flatMap(ModLoadingException::fromEarlyException)
|
||||
.toList();
|
||||
.collect(Collectors.toList());
|
||||
this.loadingWarnings = this.loadingModList.getBrokenFiles().stream()
|
||||
.map(file -> new ModLoadingWarning(null, ModLoadingStage.VALIDATE, InvalidModIdentifier.identifyJarProblem(file.getFilePath()).orElse("fml.modloading.brokenfile"), file.getFileName()))
|
||||
.collect(Collectors.toList());
|
||||
@@ -155,11 +154,13 @@ public class ModLoader {
|
||||
loadingStateValid = false;
|
||||
throw new LoadingFailedException(loadingExceptions);
|
||||
}
|
||||
List<? extends ForgeFeature.Bound> failedBounds = loadingModList.getMods().stream()
|
||||
.map(ModInfo::getForgeFeatures)
|
||||
.flatMap(List::stream)
|
||||
.filter(bound -> !ForgeFeature.testFeature(FMLEnvironment.dist, bound))
|
||||
.toList();
|
||||
var failedBounds = new ArrayList<ForgeFeature.Bound>();
|
||||
for (var mod : loadingModList.getMods()) {
|
||||
for (var feature : mod.getForgeFeatures()) {
|
||||
if (!ForgeFeature.testFeature(FMLEnvironment.dist, feature))
|
||||
failedBounds.add(feature);
|
||||
}
|
||||
}
|
||||
|
||||
if (!failedBounds.isEmpty()) {
|
||||
LOGGER.fatal(CORE, "Failed to validate feature bounds for mods: {}", failedBounds);
|
||||
@@ -357,49 +358,53 @@ public class ModLoader {
|
||||
return completedStates.contains(state);
|
||||
}
|
||||
|
||||
public <T extends Event & IModBusEvent> void runEventGenerator(Function<ModContainer, T> generator) {
|
||||
public <T extends IModBusEvent> void runEventGenerator(Function<ModContainer, T> generator) {
|
||||
if (!loadingStateValid) {
|
||||
LOGGER.error("Cowardly refusing to send event generator to a broken mod state");
|
||||
return;
|
||||
}
|
||||
ModList.get().forEachModInOrder(mc -> mc.acceptEvent(generator.apply(mc)));
|
||||
for (var mod : ModList.get().getLoadedMods())
|
||||
mod.acceptEvent(generator.apply(mod));
|
||||
}
|
||||
|
||||
public <T extends Event & IModBusEvent> void postEvent(T e) {
|
||||
public <T extends IModBusEvent> void postEvent(T e) {
|
||||
var cls = e.getClass();
|
||||
if (!loadingStateValid) {
|
||||
LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName());
|
||||
return;
|
||||
}
|
||||
ModList.get().forEachModInOrder(mc -> mc.acceptEvent(e));
|
||||
for (var mod : ModList.get().getLoadedMods())
|
||||
mod.acceptEvent(e);
|
||||
}
|
||||
|
||||
public <T extends Event & IModBusEvent> T postEventWithReturn(T e) {
|
||||
public <T extends IModBusEvent> T postEventWithReturn(T e) {
|
||||
if (!loadingStateValid) {
|
||||
LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName());
|
||||
return e;
|
||||
}
|
||||
ModList.get().forEachModInOrder(mc -> mc.acceptEvent(e));
|
||||
for (var mod : ModList.get().getLoadedMods())
|
||||
mod.acceptEvent(e);
|
||||
return e;
|
||||
}
|
||||
|
||||
@SuppressWarnings("removal")
|
||||
public <T extends Event & IModBusEvent> void postEventWrapContainerInModOrder(T event) {
|
||||
public <T extends IModBusEvent> void postEventWrapContainerInModOrder(T event) {
|
||||
postEventWithWrapInModOrder(event,
|
||||
(mc, e) -> ModLoadingContext.get().setActiveContainer(mc),
|
||||
(mc, e) -> ModLoadingContext.get().setActiveContainer(null)
|
||||
);
|
||||
}
|
||||
|
||||
public <T extends Event & IModBusEvent> void postEventWithWrapInModOrder(T e, BiConsumer<ModContainer, T> pre, BiConsumer<ModContainer, T> post) {
|
||||
public <T extends IModBusEvent> void postEventWithWrapInModOrder(T e, BiConsumer<ModContainer, T> pre, BiConsumer<ModContainer, T> post) {
|
||||
if (!loadingStateValid) {
|
||||
LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName());
|
||||
return;
|
||||
}
|
||||
ModList.get().forEachModInOrder(mc -> {
|
||||
pre.accept(mc, e);
|
||||
mc.acceptEvent(e);
|
||||
post.accept(mc, e);
|
||||
});
|
||||
for (var mod : ModList.get().getLoadedMods()) {
|
||||
pre.accept(mod, e);
|
||||
mod.acceptEvent(e);
|
||||
post.accept(mod, e);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ModLoadingWarning> getWarnings() {
|
||||
@@ -416,7 +421,7 @@ public class ModLoader {
|
||||
return runningDataGen;
|
||||
}
|
||||
|
||||
private static class ErroredModContainer extends ModContainer {
|
||||
private static final class ErroredModContainer extends ModContainer {
|
||||
public ErroredModContainer() {
|
||||
super();
|
||||
}
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
|
||||
package net.minecraftforge.fml;
|
||||
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.fml.loading.progress.ProgressMeter;
|
||||
|
||||
import java.util.Optional;
|
||||
@@ -36,7 +34,7 @@ public record ModLoadingState(
|
||||
Optional<IModStateTransition> transition
|
||||
) implements IModLoadingState {
|
||||
@Override
|
||||
public <T extends Event & IModBusEvent> Optional<CompletableFuture<Void>> buildTransition(
|
||||
public Optional<CompletableFuture<Void>> buildTransition(
|
||||
final Executor syncExecutor,
|
||||
final Executor parallelExecutor,
|
||||
final ProgressMeter progressBar,
|
||||
|
||||
@@ -9,15 +9,16 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.CompletionException;
|
||||
import java.util.concurrent.CompletionStage;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.IModStateTransition.EventGenerator;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.fml.loading.progress.ProgressMeter;
|
||||
@@ -41,7 +42,7 @@ class ModStateTransitionHelper {
|
||||
if (t.stream().noneMatch(e -> e.exception() != null)) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
} else {
|
||||
final var throwables = t.stream().map(FutureResult::exception).filter(e -> e != null).toList();
|
||||
final var throwables = t.stream().map(FutureResult::exception).filter(Objects::nonNull).toList();
|
||||
CompletableFuture<Void> cf = new CompletableFuture<>();
|
||||
final RuntimeException accumulator = new RuntimeException();
|
||||
cf.completeExceptionally(accumulator);
|
||||
@@ -70,13 +71,15 @@ class ModStateTransitionHelper {
|
||||
for (var future : futures) {
|
||||
int i = list.size();
|
||||
list.add(null);
|
||||
results[i] = future.whenComplete((result, exception) -> list.set(i, new FutureResult<>(result, exception)));
|
||||
@SuppressWarnings("unchecked") // Bypass a weird javac error with generic by forcing it to be the exact type we want.
|
||||
var raw = ((CompletableFuture<V>)future);
|
||||
results[i] = raw.whenComplete((result, exception) -> list.set(i, new FutureResult<>(result, exception)));
|
||||
}
|
||||
|
||||
return CompletableFuture.allOf(results).handle((r, th)->null).thenApply(res -> list);
|
||||
}
|
||||
|
||||
private static <T extends Event & IModBusEvent> void addCompletableFutureTaskForModDispatch(
|
||||
private static <T extends IModBusEvent> void addCompletableFutureTaskForModDispatch(
|
||||
final IModStateTransition transition,
|
||||
final Executor executor,
|
||||
final List<CompletableFuture<Void>> completableFutures,
|
||||
@@ -135,14 +138,14 @@ class ModStateTransitionHelper {
|
||||
completableFutures.add(postDispatchHook);
|
||||
}
|
||||
|
||||
private static <T extends Event & IModBusEvent> CompletableFuture<Void> getHook(BiFunction<Executor, ? extends EventGenerator<?>, CompletableFuture<Void>> hook, Executor executor, EventGenerator<T> eventGenerator) {
|
||||
private static <T extends IModBusEvent> CompletableFuture<Void> getHook(BiFunction<Executor, ? extends EventGenerator<?>, CompletableFuture<Void>> hook, Executor executor, EventGenerator<T> eventGenerator) {
|
||||
if (hook == null || hook == IModStateTransition.NULL_HOOK) return null;
|
||||
@SuppressWarnings("unchecked")
|
||||
var hookTyped = (BiFunction<Executor, EventGenerator<T>, CompletableFuture<Void>>)hook;
|
||||
return hookTyped.apply(executor, eventGenerator);
|
||||
}
|
||||
|
||||
static <T extends Event & IModBusEvent> CompletableFuture<Void> build(
|
||||
static <T extends IModBusEvent> CompletableFuture<Void> build(
|
||||
final IModStateTransition transition,
|
||||
final String name,
|
||||
final Executor syncExecutor,
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
package net.minecraftforge.fml.config;
|
||||
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.eventbus.api.event.InheritableEvent;
|
||||
import net.minecraftforge.fml.Bindings;
|
||||
|
||||
import java.util.function.Function;
|
||||
@@ -29,7 +29,7 @@ public interface IConfigEvent {
|
||||
ModConfig getConfig();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default <T extends Event & IConfigEvent> T self() {
|
||||
default <T extends InheritableEvent & IConfigEvent> T self() {
|
||||
return (T) this;
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,27 @@
|
||||
|
||||
package net.minecraftforge.fml.event;
|
||||
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.eventbus.api.bus.EventBus;
|
||||
import net.minecraftforge.eventbus.api.event.InheritableEvent;
|
||||
|
||||
/**
|
||||
* Marker interface for events dispatched on the ModLifecycle event bus instead of the primary event bus
|
||||
*/
|
||||
public interface IModBusEvent {
|
||||
public interface IModBusEvent extends InheritableEvent {
|
||||
/**
|
||||
* @param modEventBusGroup Obtained from {@link net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext#getModBusGroup()} or your language provider's equivalent.
|
||||
* @param eventClass The event type you want to get the associated bus for.
|
||||
*/
|
||||
static <T extends IModBusEvent> EventBus<T> getBus(BusGroup modEventBusGroup, Class<T> eventClass) {
|
||||
// Do not copy! Temporary solution until the FML rewrite is complete. May throw in future
|
||||
// without prior notice.
|
||||
//
|
||||
// Mods creating their own events should directly assign the result of the create method to a
|
||||
// static final field in their event class, without wrapping or calling multiple times.
|
||||
//
|
||||
// Mods using existing events should instead use the existing static final BUS field in the
|
||||
// event class (for most events) or getBus(BusGroup) method (for mod bus events).
|
||||
return EventBus.create(modEventBusGroup, eventClass);
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ java {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.nulls)
|
||||
compileOnly(libs.jetbrains.annotations)
|
||||
implementation(project(':fmlloader'))
|
||||
implementation(project(':fmlcore'))
|
||||
implementation(libs.bundles.lwjgl)
|
||||
|
||||
@@ -13,7 +13,7 @@ apply from: rootProject.file('build_shared.gradle')
|
||||
configurations.forEach{ it.transitive = false }
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.nulls)
|
||||
compileOnly(libs.jetbrains.annotations)
|
||||
|
||||
api(libs.bundles.asm) // Needed by all the black magic
|
||||
api(libs.forgespi)
|
||||
@@ -41,7 +41,7 @@ dependencies {
|
||||
implementation(libs.log4j.core)
|
||||
annotationProcessor(libs.bundles.log4j)
|
||||
|
||||
testCompileOnly(libs.nulls)
|
||||
testCompileOnly(libs.jetbrains.annotations)
|
||||
testRuntimeOnly(libs.bootstrap)
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,6 @@ public class FMLLoader {
|
||||
|
||||
checkPackage(ITransformationService.class, "4.0", "ModLauncher");
|
||||
accessTransformer = getPlugin(env, "accesstransformer", "1.0", "AccessTransformer");
|
||||
/*eventBus =*/ getPlugin(env, "eventbus", "1.0", "EventBus");
|
||||
runtimeDistCleaner = getPlugin(env, "runtimedistcleaner", "1.0", "RuntimeDistCleaner");
|
||||
coreModProvider = getSingleService(ICoreModProvider.class, "CoreMod");
|
||||
LOGGER.debug(CORE, "FML found CoreMod version : {}", JarVersionLookupHandler.getInfo(coreModProvider.getClass()).impl().version().orElse("MISSING"));
|
||||
|
||||
+4
-4
@@ -43,10 +43,10 @@ public final class MinecraftLocator extends AbstractModProvider implements IModL
|
||||
mods.set("modId", "minecraft");
|
||||
mods.set("version", FMLLoader.versionInfo().mcVersion());
|
||||
mods.set("displayName", "Minecraft");
|
||||
mods.set("logoFile", "mcplogo.png");
|
||||
mods.set("credits", "Mojang, deobfuscated by MCP");
|
||||
mods.set("authors", "MCP: Searge,ProfMobius,IngisKahn,Fesh0r,ZeuX,R4wk,LexManos,Bspkrs");
|
||||
mods.set("description", "Minecraft, decompiled and deobfuscated with MCP technology");
|
||||
//mods.set("logoFile", "mcplogo.png");
|
||||
//mods.set("credits", "Mojang, deobfuscated by MCP");
|
||||
//mods.set("authors", "MCP: Searge,ProfMobius,IngisKahn,Fesh0r,ZeuX,R4wk,LexManos,Bspkrs");
|
||||
mods.set("description", "The base Minecraft game, published by Mojang decompiled and deobfuscated by Forge");
|
||||
conf.set("mods", List.of(mods));
|
||||
|
||||
var configWrapper = new NightConfigWrapper(conf);
|
||||
|
||||
+3
-3
@@ -5,11 +5,11 @@ org.gradle.daemon=false
|
||||
org.gradle.parallel=true
|
||||
|
||||
JAVA_VERSION=21
|
||||
MC_VERSION=1.21.5
|
||||
MC_VERSION=1.21.6
|
||||
MC_NEXT_VERSION=1.22
|
||||
MCP_VERSION=20250325.155543
|
||||
MCP_VERSION=20250618.020446
|
||||
MAPPING_CHANNEL=official
|
||||
MAPPING_VERSION=1.21.5
|
||||
MAPPING_VERSION=1.21.6
|
||||
|
||||
# Set to true before the first build of a new MC version, so we don't do compatibility checks
|
||||
CHECK_COMPATIBILITY=false
|
||||
|
||||
@@ -10,7 +10,7 @@ plugins {
|
||||
apply from: rootProject.file('build_shared.gradle')
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.nulls)
|
||||
compileOnly(libs.jetbrains.annotations)
|
||||
implementation(project(':fmlloader'))
|
||||
implementation(project(':fmlcore'))
|
||||
implementation(libs.unsafe)
|
||||
|
||||
@@ -12,9 +12,10 @@ import java.lang.annotation.Target;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.fml.Bindings;
|
||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* This defines a Mod to FML.
|
||||
@@ -24,12 +25,11 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface Mod
|
||||
{
|
||||
public @interface Mod {
|
||||
/**
|
||||
* The unique mod identifier for this mod.
|
||||
* <b>Required to be lowercased in the english locale for compatibility. Will be truncated to 64 characters long.</b>
|
||||
*
|
||||
* <b>Required to be lowercased in the English locale for compatibility. Will be truncated to 64 characters long.</b>
|
||||
* <br>
|
||||
* This will be used to identify your mod for third parties (other mods), it will be used to identify your mod for registries such as block and item registries.
|
||||
* By default, you will have a resource domain that matches the modid. All these uses require that constraints are imposed on the format of the modid.
|
||||
*/
|
||||
@@ -61,32 +61,40 @@ public @interface Mod
|
||||
String modid() default "";
|
||||
|
||||
/**
|
||||
* Specify an alternative bus to listen to
|
||||
* Specify an alternative bus to listen to.
|
||||
* <br>
|
||||
* If you know all listeners in this class are for a specific bus, you can set it here to speed up registration.
|
||||
*
|
||||
* @return the bus you wish to listen to
|
||||
*/
|
||||
Bus bus() default Bus.FORGE;
|
||||
Bus bus() default Bus.BOTH;
|
||||
|
||||
enum Bus {
|
||||
/**
|
||||
* The main Forge Event Bus.
|
||||
*
|
||||
* <p>See {@code MinecraftForge#EVENT_BUS}</p>
|
||||
* The main BusGroup that most game events are fired on.
|
||||
*/
|
||||
FORGE(Bindings.getForgeBus()),
|
||||
|
||||
/**
|
||||
* The mod specific Event bus.
|
||||
* @see FMLJavaModLoadingContext#getModEventBus()
|
||||
* The mod-specific event BusGroup, usually for mod lifecycle events.
|
||||
* @see FMLJavaModLoadingContext#getModBusGroup()
|
||||
*/
|
||||
MOD(()-> FMLJavaModLoadingContext.get().getModEventBus());
|
||||
MOD(()-> FMLJavaModLoadingContext.get().getModBusGroup()),
|
||||
|
||||
private final Supplier<IEventBus> busSupplier;
|
||||
/**
|
||||
* Both the {@link #FORGE} and {@link #MOD} buses. This is slower to register events in your class but
|
||||
* allows you to listen to events from different BusGroup types without needing separate classes annotated
|
||||
* with {@link EventBusSubscriber}.
|
||||
*/
|
||||
BOTH(() -> null);
|
||||
|
||||
Bus(final Supplier<IEventBus> eventBusSupplier) {
|
||||
private final Supplier<@Nullable BusGroup> busSupplier;
|
||||
|
||||
Bus(Supplier<@Nullable BusGroup> eventBusSupplier) {
|
||||
this.busSupplier = eventBusSupplier;
|
||||
}
|
||||
|
||||
public Supplier<IEventBus> bus() {
|
||||
public Supplier<@Nullable BusGroup> bus() {
|
||||
return busSupplier;
|
||||
}
|
||||
}
|
||||
|
||||
+333
-4
@@ -7,22 +7,40 @@ package net.minecraftforge.fml.javafmlmod;
|
||||
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.eventbus.api.bus.CancellableEventBus;
|
||||
import net.minecraftforge.eventbus.api.bus.EventBus;
|
||||
import net.minecraftforge.eventbus.api.event.characteristic.Cancellable;
|
||||
import net.minecraftforge.eventbus.api.listener.EventListener;
|
||||
import net.minecraftforge.eventbus.api.listener.ObjBooleanBiConsumer;
|
||||
import net.minecraftforge.eventbus.api.listener.Priority;
|
||||
import net.minecraftforge.eventbus.api.listener.SubscribeEvent;
|
||||
import net.minecraftforge.eventbus.internal.Event;
|
||||
import net.minecraftforge.fml.Logging;
|
||||
import net.minecraftforge.fml.ModContainer;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.forgespi.language.ModFileScanData;
|
||||
import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData;
|
||||
import net.minecraftforge.forgespi.language.ModFileScanData.EnumData;
|
||||
import net.minecraftforge.fml.loading.FMLEnvironment;
|
||||
import net.minecraftforge.unsafe.UnsafeHacks;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
import org.objectweb.asm.Type;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.lang.invoke.LambdaMetafactory;
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -75,7 +93,7 @@ public class AutomaticEventSubscriber {
|
||||
if (Objects.equals(mod.getModId(), modId) && sides.contains(FMLEnvironment.dist)) {
|
||||
try {
|
||||
LOGGER.debug(Logging.LOADING, "Auto-subscribing {} to {}", data.clazz().getClassName(), busTarget);
|
||||
busTarget.bus().get().register(Class.forName(data.clazz().getClassName(), true, loader));
|
||||
EventBusSubscriberLogic.register(busTarget.bus().get(), Class.forName(data.clazz().getClassName(), true, loader));
|
||||
} catch (ClassNotFoundException e) {
|
||||
LOGGER.fatal(Logging.LOADING, "Failed to load mod class {} for @EventBusSubscriber annotation", data.clazz(), e);
|
||||
throw new RuntimeException(e);
|
||||
@@ -88,4 +106,315 @@ public class AutomaticEventSubscriber {
|
||||
private static <R> R value(AnnotationData data, String key, R value) {
|
||||
return (R)data.annotationData().getOrDefault(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is mostly a carbon copy of EventBus 7's internal EventListenerFactory, with some changes to support adding
|
||||
* to different BusGroups based on the event type, among other things.
|
||||
*/
|
||||
private static final class EventBusSubscriberLogic {
|
||||
private EventBusSubscriberLogic() {}
|
||||
|
||||
private static final boolean STRICT_RUNTIME_CHECKS = Boolean.getBoolean("eventbus.api.strictRuntimeChecks");
|
||||
|
||||
/**
|
||||
* If true, performs exhaustive validation on bulk registration to aid debugging.
|
||||
*/
|
||||
private static final boolean STRICT_REGISTRATION_CHECKS = STRICT_RUNTIME_CHECKS || Boolean.getBoolean("eventbus.api.strictRegistrationChecks");
|
||||
|
||||
private static final MethodType RETURNS_CONSUMER = MethodType.methodType(Consumer.class);
|
||||
private static final MethodType RETURNS_PREDICATE = MethodType.methodType(Predicate.class);
|
||||
private static final MethodType RETURNS_MONITOR = MethodType.methodType(ObjBooleanBiConsumer.class);
|
||||
|
||||
/** The method type of the {@link Consumer} functional interface ({@code void accept(Object)}) */
|
||||
private static final MethodType CONSUMER_FI_TYPE = MethodType.methodType(void.class, Object.class);
|
||||
|
||||
/** The method type of the {@link Predicate} functional interface ({@code boolean test(Object)}) */
|
||||
private static final MethodType PREDICATE_FI_TYPE = CONSUMER_FI_TYPE.changeReturnType(boolean.class);
|
||||
|
||||
/** The method type of the {@link ObjBooleanBiConsumer} functional interface ({@code void accept(Object, boolean)}) */
|
||||
private static final MethodType MONITOR_FI_TYPE = MethodType.methodType(void.class, Object.class, boolean.class);
|
||||
|
||||
public static void register(@Nullable BusGroup busGroup, Class<?> listenerClass) {
|
||||
if (STRICT_REGISTRATION_CHECKS) registerStrict(busGroup, listenerClass);
|
||||
else registerLenient(busGroup, listenerClass);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public static void registerLenient(@Nullable BusGroup busGroup, Class<?> listenerClass) {
|
||||
Method[] declaredMethods = listenerClass.getDeclaredMethods();
|
||||
if (declaredMethods.length == 0)
|
||||
throw new IllegalArgumentException("No declared methods found in " + listenerClass);
|
||||
|
||||
Class<?> firstValidListenerEventType = null;
|
||||
|
||||
int listenersCount = 0;
|
||||
for (var method : declaredMethods) {
|
||||
if (!Modifier.isStatic(method.getModifiers()))
|
||||
continue;
|
||||
|
||||
int paramCount = method.getParameterCount();
|
||||
if (paramCount == 0 || paramCount > 2)
|
||||
continue;
|
||||
|
||||
Class<?> returnType = method.getReturnType();
|
||||
if (returnType != void.class && returnType != boolean.class)
|
||||
continue;
|
||||
|
||||
if (!method.isAnnotationPresent(SubscribeEvent.class))
|
||||
continue;
|
||||
|
||||
Class<?>[] parameterTypes = method.getParameterTypes();
|
||||
if (!Event.class.isAssignableFrom(parameterTypes[0]))
|
||||
throw new IllegalArgumentException("First parameter of a @SubscribeEvent method must be an event");
|
||||
|
||||
Class<? extends Event> eventType = (Class<? extends Event>) parameterTypes[0];
|
||||
var subscribeEventAnnotation = method.getAnnotation(SubscribeEvent.class);
|
||||
|
||||
registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method);
|
||||
listenersCount++;
|
||||
|
||||
if (firstValidListenerEventType == null)
|
||||
firstValidListenerEventType = eventType;
|
||||
}
|
||||
|
||||
if (listenersCount == 0)
|
||||
throw new IllegalArgumentException("No listeners found in " + listenerClass);
|
||||
else if (firstValidListenerEventType == null)
|
||||
throw new IllegalArgumentException("No valid listeners found in " + listenerClass);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked"})
|
||||
public static void registerStrict(BusGroup busGroup, Class<?> listenerClass) {
|
||||
Class<? extends Event> firstValidListenerEventType = null;
|
||||
|
||||
Method[] declaredMethods = listenerClass.getDeclaredMethods();
|
||||
if (declaredMethods.length == 0) {
|
||||
var errMsg = "No declared methods found in " + listenerClass.getName();
|
||||
var superClass = listenerClass.getSuperclass();
|
||||
if (superClass != null && superClass != Record.class && superClass != Enum.class) {
|
||||
errMsg += ". Note that listener inheritance is not supported. " +
|
||||
"If you are trying to inherit listeners, please use @Override and @SubscribeEvent on the method in the subclass.";
|
||||
}
|
||||
throw fail(listenerClass, errMsg);
|
||||
}
|
||||
|
||||
int listenersCount = 0;
|
||||
for (var method : declaredMethods) {
|
||||
var hasSubscribeEvent = method.isAnnotationPresent(SubscribeEvent.class);
|
||||
int paramCount = method.getParameterCount();
|
||||
|
||||
if (hasSubscribeEvent && (paramCount == 0 || paramCount > 2))
|
||||
throw fail(method, "Invalid number of parameters: " + paramCount + " (expected 1 or 2)");
|
||||
|
||||
if (paramCount == 0)
|
||||
continue;
|
||||
|
||||
Class<?> returnType = method.getReturnType();
|
||||
Class<?>[] parameterTypes = method.getParameterTypes();
|
||||
var firstParamExtendsEvent = Event.class.isAssignableFrom(parameterTypes[0]);
|
||||
|
||||
if (!hasSubscribeEvent && firstParamExtendsEvent)
|
||||
throw fail(method, "Missing @SubscribeEvent annotation");
|
||||
|
||||
if (hasSubscribeEvent) {
|
||||
var firstParamExtendsCancellable = Cancellable.class.isAssignableFrom(parameterTypes[0]);
|
||||
var subscribeEventAnnotation = method.getAnnotation(SubscribeEvent.class);
|
||||
var isMonitoringPriority = subscribeEventAnnotation.priority() == Priority.MONITOR;
|
||||
|
||||
if (!firstParamExtendsEvent)
|
||||
throw fail(method, "First parameter of a @SubscribeEvent method must be an event");
|
||||
|
||||
var eventType = (Class<? extends Event>) parameterTypes[0];
|
||||
|
||||
if (returnType != void.class && returnType != boolean.class)
|
||||
throw fail(method, "Invalid return type: " + returnType.getName() + " (expected void or boolean)");
|
||||
|
||||
if (!Modifier.isStatic(method.getModifiers()))
|
||||
throw fail(method, "Listener method needs to be static");
|
||||
|
||||
if (isMonitoringPriority && (returnType == boolean.class || subscribeEventAnnotation.alwaysCancelling()))
|
||||
throw fail(method, "Monitoring listeners cannot cancel events");
|
||||
|
||||
if (paramCount == 2) {
|
||||
if (!firstParamExtendsCancellable)
|
||||
throw fail(method, "Cancellation-aware monitoring listeners are only valid for cancellable events");
|
||||
|
||||
if (!boolean.class.isAssignableFrom(parameterTypes[1]))
|
||||
throw fail(method, "Second parameter of a cancellation-aware monitoring listener must be a boolean");
|
||||
|
||||
if (!isMonitoringPriority)
|
||||
throw fail(method, "Cancellation-aware monitoring listeners must have a priority of MONITOR");
|
||||
}
|
||||
|
||||
if (!firstParamExtendsCancellable) {
|
||||
if (subscribeEventAnnotation.alwaysCancelling())
|
||||
throw fail(method, "Always cancelling listeners are only valid for cancellable events");
|
||||
|
||||
if (returnType == boolean.class)
|
||||
throw fail(method, "Return type boolean is only valid for cancellable events");
|
||||
}
|
||||
|
||||
registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method);
|
||||
listenersCount++;
|
||||
|
||||
if (firstValidListenerEventType == null)
|
||||
firstValidListenerEventType = eventType;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenersCount == 0)
|
||||
throw fail(listenerClass, "No listeners found");
|
||||
else if (firstValidListenerEventType == null)
|
||||
throw fail(listenerClass, "No valid listeners found");
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
private static EventListener registerListener(@Nullable BusGroup busGroup,
|
||||
int paramCount, Class<?> returnType, Class<? extends Event> eventType,
|
||||
SubscribeEvent subscribeEventAnnotation, Method method) {
|
||||
if (busGroup == null) {
|
||||
busGroup = IModBusEvent.class.isAssignableFrom(eventType)
|
||||
? FMLJavaModLoadingContext.get().getModBusGroup()
|
||||
: BusGroup.DEFAULT;
|
||||
}
|
||||
|
||||
// determine the listener type from its parameters and return type
|
||||
if (paramCount == 1) {
|
||||
var priority = subscribeEventAnnotation.priority();
|
||||
if (returnType == void.class) {
|
||||
if (Cancellable.class.isAssignableFrom(eventType)) {
|
||||
// Consumer<Event & Cancellable>
|
||||
var eventBus = CancellableEventBus.create(busGroup, (Class) eventType);
|
||||
if (subscribeEventAnnotation.alwaysCancelling()) {
|
||||
return eventBus.addListener(priority, true, createConsumer(method));
|
||||
} else {
|
||||
return eventBus.addListener(priority, createConsumer(method));
|
||||
}
|
||||
} else {
|
||||
// Consumer<Event>
|
||||
return EventBus.create(busGroup, eventType)
|
||||
.addListener(priority, createConsumer(method));
|
||||
}
|
||||
} else {
|
||||
// Predicate<Event & EventCharacteristic.Cancellable>
|
||||
if (!Cancellable.class.isAssignableFrom(eventType))
|
||||
throw fail(method, "Return type boolean is only valid for cancellable events");
|
||||
|
||||
if (subscribeEventAnnotation.alwaysCancelling())
|
||||
throw new IllegalArgumentException("Always cancelling listeners must have a void return type");
|
||||
|
||||
return CancellableEventBus.create(busGroup, (Class) eventType)
|
||||
.addListener(priority, createPredicate(method));
|
||||
}
|
||||
} else {
|
||||
// ObjBooleanBiConsumer<Event & Cancellable>
|
||||
if (returnType != void.class)
|
||||
throw new IllegalArgumentException("Cancellation-aware monitoring listeners must have a void return type");
|
||||
|
||||
if (subscribeEventAnnotation.alwaysCancelling())
|
||||
throw new IllegalArgumentException("Monitoring listeners cannot cancel events");
|
||||
|
||||
return CancellableEventBus.create(busGroup, (Class) eventType).addListener(createMonitor(method));
|
||||
}
|
||||
}
|
||||
|
||||
private static IllegalArgumentException fail(Class<?> listenerClass, String reason) {
|
||||
return new IllegalArgumentException("Failed to register " + listenerClass.getName() + ": " + reason);
|
||||
}
|
||||
|
||||
private static IllegalArgumentException fail(Method mtd, String reason) {
|
||||
return new IllegalArgumentException("Failed to register " + mtd.getDeclaringClass().getName() + "." + mtd.getName() + ": " + reason);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <T extends Event> Consumer<T> createConsumer(Method callback) {
|
||||
var factoryMH = getOrMakeFactory(callback, RETURNS_CONSUMER, CONSUMER_FI_TYPE, "accept");
|
||||
|
||||
try {
|
||||
return (Consumer<T>) factoryMH.invokeExact();
|
||||
} catch (Exception e) {
|
||||
throw makeRuntimeException(callback, e);
|
||||
} catch (Throwable t) {
|
||||
throw new RuntimeException(t);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <T extends Event> Predicate<T> createPredicate(Method callback) {
|
||||
var factoryMH = getOrMakeFactory(callback, RETURNS_PREDICATE, PREDICATE_FI_TYPE, "test");
|
||||
|
||||
try {
|
||||
return (Predicate<T>) factoryMH.invokeExact();
|
||||
} catch (Exception e) {
|
||||
throw makeRuntimeException(callback, e);
|
||||
} catch (Throwable t) {
|
||||
throw new RuntimeException(t);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <T extends Event> ObjBooleanBiConsumer<T> createMonitor(Method callback) {
|
||||
var factoryMH = getOrMakeFactory(callback, RETURNS_MONITOR, MONITOR_FI_TYPE, "accept");
|
||||
|
||||
try {
|
||||
return (ObjBooleanBiConsumer<T>) factoryMH.invokeExact();
|
||||
} catch (Exception e) {
|
||||
throw makeRuntimeException(callback, e);
|
||||
} catch (Throwable t) {
|
||||
throw new RuntimeException(t);
|
||||
}
|
||||
}
|
||||
|
||||
private static MethodHandle getOrMakeFactory(Method callback, MethodType factoryReturnType,
|
||||
MethodType fiMethodType, String fiMethodName) {
|
||||
return makeFactory(callback, factoryReturnType, fiMethodType, fiMethodName);
|
||||
}
|
||||
|
||||
private static MethodHandle makeFactory(Method callback,
|
||||
MethodType factoryReturnType,
|
||||
MethodType fiMethodType, String fiMethodName) {
|
||||
final class DodgyLookup {
|
||||
private DodgyLookup() {}
|
||||
private static final MethodHandles.Lookup INSTANCE;
|
||||
static {
|
||||
try {
|
||||
var lookupField = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
|
||||
UnsafeHacks.setAccessible(lookupField);
|
||||
INSTANCE = (MethodHandles.Lookup) lookupField.get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
var callbackDeclaredClass = callback.getDeclaringClass();
|
||||
var lookup = DodgyLookup.INSTANCE.in(callbackDeclaredClass);
|
||||
var mh = lookup.unreflect(callback);
|
||||
|
||||
return LambdaMetafactory.metafactory(
|
||||
lookup, fiMethodName, factoryReturnType, fiMethodType, mh, mh.type()
|
||||
).getTarget();
|
||||
} catch (Exception e) {
|
||||
throw makeRuntimeException(callback, e);
|
||||
}
|
||||
}
|
||||
|
||||
private static RuntimeException makeRuntimeException(Method callback, Exception e) {
|
||||
return switch (e) {
|
||||
case IllegalAccessException iae -> {
|
||||
var errMsg = "Failed to create listener";
|
||||
if (!Modifier.isPublic(callback.getModifiers()))
|
||||
errMsg += " - is it public?";
|
||||
|
||||
yield new RuntimeException(errMsg, iae);
|
||||
}
|
||||
case NullPointerException npe -> new RuntimeException(
|
||||
"Failed to create listener - was given a non-static method without an instance to invoke it with",
|
||||
npe
|
||||
);
|
||||
default -> new RuntimeException("Failed to create listener", e);
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
-9
@@ -5,14 +5,13 @@
|
||||
|
||||
package net.minecraftforge.fml.javafmlmod;
|
||||
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.fml.ModLoadingContext;
|
||||
|
||||
/**
|
||||
* Use the context provided by your language loader in your mod's constructor
|
||||
*/
|
||||
public class FMLJavaModLoadingContext extends ModLoadingContext
|
||||
{
|
||||
public class FMLJavaModLoadingContext extends ModLoadingContext {
|
||||
private final FMLModContainer container;
|
||||
|
||||
FMLJavaModLoadingContext(FMLModContainer container) {
|
||||
@@ -20,11 +19,10 @@ public class FMLJavaModLoadingContext extends ModLoadingContext
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The mod's event bus, to allow subscription to Mod specific events
|
||||
* @return The mod's event bus group, to allow subscription to Mod specific events
|
||||
*/
|
||||
public IEventBus getModEventBus()
|
||||
{
|
||||
return container.getEventBus();
|
||||
public BusGroup getModBusGroup() {
|
||||
return container.getModBusGroup();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -39,9 +37,15 @@ public class FMLJavaModLoadingContext extends ModLoadingContext
|
||||
* Helper to get the right instance from the {@link ModLoadingContext} correctly.
|
||||
* @return The FMLJavaMod language specific extension from the ModLoadingContext
|
||||
*
|
||||
* @deprecated use {@link FMLJavaModLoadingContext} in your mod constructor
|
||||
* @deprecated use {@link FMLJavaModLoadingContext} in your mod constructor. For example: {@snippet :
|
||||
* @Mod("examplemod")
|
||||
* public final class ExampleMod {
|
||||
* public ExampleMod(FMLJavaModLoadingContext context) {
|
||||
* // Use context from the param instead of FMLJavaModLoadingContext.get() or ModLoadingContext.get()
|
||||
* }
|
||||
* }}
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since="1.21.1")
|
||||
@Deprecated(forRemoval = true, since = "1.21.1")
|
||||
public static FMLJavaModLoadingContext get() {
|
||||
return ModLoadingContext.get().extension();
|
||||
}
|
||||
|
||||
+13
-16
@@ -5,11 +5,8 @@
|
||||
|
||||
package net.minecraftforge.fml.javafmlmod;
|
||||
|
||||
import net.minecraftforge.eventbus.EventBusErrorMessage;
|
||||
import net.minecraftforge.eventbus.api.BusBuilder;
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.eventbus.api.IEventBus;
|
||||
import net.minecraftforge.eventbus.api.IEventListener;
|
||||
import net.minecraftforge.eventbus.api.bus.BusGroup;
|
||||
import net.minecraftforge.eventbus.api.bus.EventBus;
|
||||
import net.minecraftforge.fml.ModContainer;
|
||||
import net.minecraftforge.fml.ModLoadingException;
|
||||
import net.minecraftforge.fml.ModLoadingStage;
|
||||
@@ -36,7 +33,7 @@ public class FMLModContainer extends ModContainer {
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
private static final Marker LOADING = MarkerManager.getMarker("LOADING");
|
||||
private final ModFileScanData scanResults;
|
||||
private final IEventBus eventBus;
|
||||
private final BusGroup eventBusGroup;
|
||||
private Object modInstance;
|
||||
private final Class<?> modClass;
|
||||
private final FMLJavaModLoadingContext context = new FMLJavaModLoadingContext(this);
|
||||
@@ -46,7 +43,7 @@ public class FMLModContainer extends ModContainer {
|
||||
LOGGER.debug(LOADING,"Creating FMLModContainer instance for {}", className);
|
||||
this.scanResults = modFileScanResults;
|
||||
activityMap.put(ModLoadingStage.CONSTRUCT, this::constructMod);
|
||||
this.eventBus = BusBuilder.builder().setExceptionHandler(FMLModContainer::onEventFailed).setTrackPhases(false).markerType(IModBusEvent.class).useModLauncher().build();
|
||||
this.eventBusGroup = BusGroup.create("modBusFor" + info.getModId());
|
||||
this.contextExtension = () -> context;
|
||||
try {
|
||||
var moduleName = info.getOwningFile().moduleName();
|
||||
@@ -128,10 +125,6 @@ public class FMLModContainer extends ModContainer {
|
||||
implAddExportsOrOpens.invoke(target, pkg, reader, open, /*syncVM*/true);
|
||||
}
|
||||
|
||||
private static void onEventFailed(IEventBus iEventBus, Event event, IEventListener[] iEventListeners, int i, Throwable throwable) {
|
||||
LOGGER.error(new EventBusErrorMessage(event, i, iEventListeners, throwable));
|
||||
}
|
||||
|
||||
private void constructMod() {
|
||||
try {
|
||||
LOGGER.trace(LOADING, "Loading mod instance {} of type {}", getModId(), modClass.getName());
|
||||
@@ -173,15 +166,17 @@ public class FMLModContainer extends ModContainer {
|
||||
return modInstance;
|
||||
}
|
||||
|
||||
public IEventBus getEventBus() {
|
||||
return this.eventBus;
|
||||
public BusGroup getModBusGroup() {
|
||||
return this.eventBusGroup;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <T extends Event & IModBusEvent> void acceptEvent(final T e) {
|
||||
protected <T extends IModBusEvent> void acceptEvent(final T e) {
|
||||
try {
|
||||
LOGGER.trace(LOADING, "Firing event for modid {} : {}", this.getModId(), e);
|
||||
this.eventBus.post(e);
|
||||
@SuppressWarnings("unchecked")
|
||||
var eventBus = (EventBus<T>) IModBusEvent.getBus(eventBusGroup, e.getClass());
|
||||
eventBus.post(e);
|
||||
LOGGER.trace(LOADING, "Fired event for modid {} : {}", this.getModId(), e);
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error(LOADING,"Caught exception during event {} dispatch for modid {}", e, this.getModId(), t);
|
||||
@@ -190,8 +185,10 @@ public class FMLModContainer extends ModContainer {
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public void dispatchConfigEvent(IConfigEvent event) {
|
||||
this.eventBus.post(event.self());
|
||||
var eventBus = (EventBus) EventBus.create(eventBusGroup, event.self().getClass());
|
||||
eventBus.post(event.self());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,7 +15,7 @@ java {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.nulls)
|
||||
compileOnly(libs.jetbrains.annotations)
|
||||
|
||||
implementation(project(':fmlloader'))
|
||||
implementation(project(':fmlcore'))
|
||||
|
||||
+6
-15
@@ -6,41 +6,32 @@
|
||||
package net.minecraftforge.fml.lowcodemod;
|
||||
|
||||
import com.mojang.logging.LogUtils;
|
||||
import net.minecraftforge.eventbus.api.Event;
|
||||
import net.minecraftforge.fml.IExtensionPoint;
|
||||
import net.minecraftforge.fml.ModContainer;
|
||||
import net.minecraftforge.fml.event.IModBusEvent;
|
||||
import net.minecraftforge.fml.loading.LogMarkers;
|
||||
import net.minecraftforge.forgespi.language.IModInfo;
|
||||
import net.minecraftforge.forgespi.language.ModFileScanData;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static net.minecraftforge.fml.loading.LogMarkers.LOADING;
|
||||
|
||||
public class LowCodeModContainer extends ModContainer
|
||||
{
|
||||
public class LowCodeModContainer extends ModContainer {
|
||||
private static final Logger LOGGER = LogUtils.getLogger();
|
||||
private final Object modInstance;
|
||||
|
||||
public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer gameLayer)
|
||||
{
|
||||
public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer gameLayer) {
|
||||
super(info);
|
||||
LOGGER.debug(LOADING, "Creating LowCodeModContainer for {}", info.getModId());
|
||||
LOGGER.debug(LogMarkers.LOADING, "Creating LowCodeModContainer for {}", info.getModId());
|
||||
this.modInstance = new Object();
|
||||
this.contextExtension = () -> null;
|
||||
this.extensionPoints.remove(IExtensionPoint.DisplayTest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Object mod)
|
||||
{
|
||||
public boolean matches(Object mod) {
|
||||
return mod == modInstance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getMod()
|
||||
{
|
||||
public Object getMod() {
|
||||
return modInstance;
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ plugins {
|
||||
apply from: rootProject.file('build_shared.gradle')
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.nulls)
|
||||
compileOnly(libs.jetbrains.annotations)
|
||||
implementation(project(':fmlloader'))
|
||||
implementation(project(':fmlcore'))
|
||||
}
|
||||
|
||||
@@ -68,6 +68,9 @@ minecraft {
|
||||
|
||||
property 'forge.logging.console.level', 'debug'
|
||||
|
||||
// Recommended for development - enables more descriptive errors at the cost of slower startup and registration.
|
||||
property 'eventbus.api.strictRuntimeChecks', 'true'
|
||||
|
||||
// arg "-mixin.config=${mod_id}.mixins.json"
|
||||
}
|
||||
|
||||
@@ -139,6 +142,11 @@ dependencies {
|
||||
// then special handling is done to allow a setup of a vanilla dependency without the use of an external repository.
|
||||
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
|
||||
|
||||
// Forge 1.21.6+ uses EventBus 7, which shifts most of its runtime validation to compile-time via an annotation processor
|
||||
// to improve performance in production environments. This line is required to enable said compile-time validation
|
||||
// in your development environment, helping you catch issues early.
|
||||
annotationProcessor 'net.minecraftforge:eventbus-validator:7.0-beta.7'
|
||||
|
||||
// Example mod dependency with JEI
|
||||
// The JEI API is declared for compile time use, while the full JEI artifact is used at runtime
|
||||
// compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/com/mojang/blaze3d/opengl/GlCommandEncoder.java
|
||||
+++ b/com/mojang/blaze3d/opengl/GlCommandEncoder.java
|
||||
@@ -109,6 +_,9 @@
|
||||
@@ -132,6 +_,9 @@
|
||||
GlStateManager._colorMask(true, true, true, true);
|
||||
GlStateManager._clear(16384);
|
||||
GlStateManager._glFramebufferTexture2D(36160, 36064, 3553, 0, 0);
|
||||
|
||||
@@ -1,53 +1,74 @@
|
||||
--- a/com/mojang/blaze3d/opengl/GlDevice.java
|
||||
+++ b/com/mojang/blaze3d/opengl/GlDevice.java
|
||||
@@ -80,11 +_,25 @@
|
||||
|
||||
@Override
|
||||
public GpuTexture createTexture(@Nullable Supplier<String> p_397830_, TextureFormat p_394839_, int p_394481_, int p_391831_, int p_395609_) {
|
||||
- return this.createTexture(this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394839_, p_394481_, p_391831_, p_395609_);
|
||||
+ return this.createTexture(p_397830_, p_394839_, p_394481_, p_391831_, p_395609_, false);
|
||||
@@ -88,8 +_,15 @@
|
||||
public GpuTexture createTexture(
|
||||
@Nullable Supplier<String> p_397830_, int p_394481_, TextureFormat p_394839_, int p_391831_, int p_395609_, int p_407582_, int p_408928_
|
||||
) {
|
||||
+ return createTexture(p_397830_, p_394481_, p_394839_, p_391831_, p_395609_, p_407582_, p_408928_, false);
|
||||
+ }
|
||||
+
|
||||
+ /** @see GpuDevice#createTexture(Supplier, TextureFormat, int, int, int, boolean) */
|
||||
+ @Override
|
||||
+ public GpuTexture createTexture(@Nullable Supplier<String> p_397830_, TextureFormat p_394839_, int p_394481_, int p_391831_, int p_395609_, boolean stencil) {
|
||||
+ return this.createTexture(this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394839_, p_394481_, p_391831_, p_395609_, stencil);
|
||||
+ public GpuTexture createTexture(
|
||||
+ @Nullable Supplier<String> p_397830_, int p_394481_, TextureFormat p_394839_, int p_391831_, int p_395609_, int p_407582_, int p_408928_, boolean stencil
|
||||
+ ) {
|
||||
return this.createTexture(
|
||||
- this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394481_, p_394839_, p_391831_, p_395609_, p_407582_, p_408928_
|
||||
+ this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394481_, p_394839_, p_391831_, p_395609_, p_407582_, p_408928_, stencil
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GpuTexture createTexture(@Nullable String p_394142_, TextureFormat p_394951_, int p_395535_, int p_393944_, int p_392329_) {
|
||||
+ return this.createTexture(p_394142_, p_394951_, p_395535_, p_393944_, p_392329_, false);
|
||||
@@ -97,6 +_,15 @@
|
||||
public GpuTexture createTexture(
|
||||
@Nullable String p_394142_, int p_395535_, TextureFormat p_394951_, int p_393944_, int p_392329_, int p_408015_, int p_406483_
|
||||
) {
|
||||
+ return createTexture(p_394142_, p_395535_, p_394951_, p_393944_, p_392329_, p_408015_, p_406483_, false);
|
||||
+ }
|
||||
+
|
||||
+ /** @see GpuDevice#createTexture(String, TextureFormat, int, int, int, boolean) */
|
||||
+ @Override
|
||||
+ public GpuTexture createTexture(@Nullable String p_394142_, TextureFormat p_394951_, int p_395535_, int p_393944_, int p_392329_, boolean stencil) {
|
||||
+ public GpuTexture createTexture(
|
||||
+ @Nullable String p_394142_, int p_395535_, TextureFormat p_394951_, int p_393944_, int p_392329_, int p_408015_, int p_406483_, boolean stencil
|
||||
+ ) {
|
||||
+ // Forge: stencil rendering is only for depth
|
||||
+ stencil &= p_394951_.hasDepthAspect();
|
||||
if (p_392329_ < 1) {
|
||||
if (p_406483_ < 1) {
|
||||
throw new IllegalArgumentException("mipLevels must be at least 1");
|
||||
} else {
|
||||
@@ -106,11 +_,14 @@
|
||||
GlStateManager._texImage2D(
|
||||
3553,
|
||||
j,
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8 :
|
||||
GlConst.toGlInternalId(p_394951_),
|
||||
p_395535_ >> j,
|
||||
p_393944_ >> j,
|
||||
0,
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL :
|
||||
GlConst.toGlExternalId(p_394951_),
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV :
|
||||
GlConst.toGlType(p_394951_),
|
||||
null
|
||||
);
|
||||
@@ -122,7 +_,7 @@
|
||||
} else if (k != 0) {
|
||||
throw new IllegalStateException("OpenGL error " + k);
|
||||
} else if (p_408015_ < 1) {
|
||||
@@ -147,11 +_,14 @@
|
||||
GlStateManager._texImage2D(
|
||||
k,
|
||||
l,
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8 :
|
||||
GlConst.toGlInternalId(p_394951_),
|
||||
p_393944_ >> l,
|
||||
p_392329_ >> l,
|
||||
0,
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL :
|
||||
GlConst.toGlExternalId(p_394951_),
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV :
|
||||
GlConst.toGlType(p_394951_),
|
||||
null
|
||||
);
|
||||
@@ -162,11 +_,14 @@
|
||||
GlStateManager._texImage2D(
|
||||
j,
|
||||
i1,
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8 :
|
||||
GlConst.toGlInternalId(p_394951_),
|
||||
p_393944_ >> i1,
|
||||
p_392329_ >> i1,
|
||||
0,
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL :
|
||||
GlConst.toGlExternalId(p_394951_),
|
||||
+ stencil ? org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV :
|
||||
GlConst.toGlType(p_394951_),
|
||||
null
|
||||
);
|
||||
@@ -179,7 +_,7 @@
|
||||
} else if (j1 != 0) {
|
||||
throw new IllegalStateException("OpenGL error " + j1);
|
||||
} else {
|
||||
- GlTexture gltexture = new GlTexture(p_394142_, p_394951_, p_395535_, p_393944_, p_392329_, i);
|
||||
+ GlTexture gltexture = new GlTexture(p_394142_, p_394951_, p_395535_, p_393944_, p_392329_, i, stencil);
|
||||
- GlTexture gltexture = new GlTexture(p_395535_, p_394142_, p_394951_, p_393944_, p_392329_, p_408015_, p_406483_, i);
|
||||
+ GlTexture gltexture = new GlTexture(p_395535_, p_394142_, p_394951_, p_393944_, p_392329_, p_408015_, p_406483_, i, stencil);
|
||||
this.debugLabels.applyLabel(gltexture);
|
||||
return gltexture;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/com/mojang/blaze3d/opengl/GlStateManager.java
|
||||
+++ b/com/mojang/blaze3d/opengl/GlStateManager.java
|
||||
@@ -90,6 +_,11 @@
|
||||
@@ -89,6 +_,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
public static void _disableBlend() {
|
||||
RenderSystem.assertOnRenderThread();
|
||||
BLEND.mode.disable();
|
||||
@@ -411,9 +_,17 @@
|
||||
@@ -404,9 +_,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
--- a/com/mojang/blaze3d/opengl/GlTexture.java
|
||||
+++ b/com/mojang/blaze3d/opengl/GlTexture.java
|
||||
@@ -18,8 +_,13 @@
|
||||
protected boolean modesDirty = true;
|
||||
@@ -19,8 +_,13 @@
|
||||
private int views;
|
||||
|
||||
protected GlTexture(String p_393950_, TextureFormat p_392837_, int p_394590_, int p_391379_, int p_391947_, int p_396659_) {
|
||||
+ this(p_393950_, p_392837_, p_394590_, p_391379_, p_391947_, p_396659_, false);
|
||||
protected GlTexture(int p_394590_, String p_393950_, TextureFormat p_392837_, int p_391379_, int p_391947_, int p_396659_, int p_408255_, int p_408889_) {
|
||||
+ this(p_394590_, p_393950_, p_392837_, p_391379_, p_391947_, p_396659_, p_408255_, p_408889_, false);
|
||||
+ }
|
||||
+
|
||||
+ protected GlTexture(String p_393950_, TextureFormat p_392837_, int p_394590_, int p_391379_, int p_391947_, int p_396659_, boolean stencil) {
|
||||
super(p_393950_, p_392837_, p_394590_, p_391379_, p_391947_);
|
||||
this.id = p_396659_;
|
||||
+ protected GlTexture(int p_394590_, String p_393950_, TextureFormat p_392837_, int p_391379_, int p_391947_, int p_396659_, int p_408255_, int p_408889_, boolean stencil) {
|
||||
super(p_394590_, p_393950_, p_392837_, p_391379_, p_391947_, p_396659_, p_408255_);
|
||||
this.id = p_408889_;
|
||||
+ this.stencilEnabled = stencil;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -86,5 +_,15 @@
|
||||
@@ -93,6 +_,16 @@
|
||||
public void setTextureFilter(FilterMode p_394977_, FilterMode p_397175_, boolean p_393558_) {
|
||||
super.setTextureFilter(p_394977_, p_397175_, p_393558_);
|
||||
this.modesDirty = true;
|
||||
@@ -29,4 +29,5 @@
|
||||
+ public boolean isStencilEnabled() {
|
||||
+ return this.stencilEnabled;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1,18 +1,18 @@
|
||||
--- a/com/mojang/blaze3d/pipeline/RenderTarget.java
|
||||
+++ b/com/mojang/blaze3d/pipeline/RenderTarget.java
|
||||
@@ -75,7 +_,7 @@
|
||||
@@ -92,7 +_,7 @@
|
||||
this.width = p_83951_;
|
||||
this.height = p_83952_;
|
||||
if (this.useDepth) {
|
||||
- this.depthTexture = RenderSystem.getDevice().createTexture(() -> this.label + " / Depth", TextureFormat.DEPTH32, p_83951_, p_83952_, 1);
|
||||
+ this.depthTexture = RenderSystem.getDevice().createTexture(() -> this.label + " / Depth", TextureFormat.DEPTH32, p_83951_, p_83952_, 1, this.stencilEnabled);
|
||||
- this.depthTexture = gpudevice.createTexture(() -> this.label + " / Depth", 15, TextureFormat.DEPTH32, p_83951_, p_83952_, 1, 1);
|
||||
+ this.depthTexture = gpudevice.createTexture(() -> this.label + " / Depth", 15, TextureFormat.DEPTH32, p_83951_, p_83952_, 1, 1, this.stencilEnabled);
|
||||
this.depthTextureView = gpudevice.createTextureView(this.depthTexture);
|
||||
this.depthTexture.setTextureFilter(FilterMode.NEAREST, false);
|
||||
this.depthTexture.setAddressMode(AddressMode.CLAMP_TO_EDGE);
|
||||
}
|
||||
@@ -134,5 +_,26 @@
|
||||
@@ -166,5 +_,26 @@
|
||||
@Nullable
|
||||
public GpuTexture getDepthTexture() {
|
||||
return this.depthTexture;
|
||||
public GpuTextureView getDepthTextureView() {
|
||||
return this.depthTextureView;
|
||||
+ }
|
||||
+
|
||||
+ private boolean stencilEnabled = false;
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
--- a/com/mojang/blaze3d/systems/GpuDevice.java
|
||||
+++ b/com/mojang/blaze3d/systems/GpuDevice.java
|
||||
@@ -25,7 +_,17 @@
|
||||
@@ -26,7 +_,17 @@
|
||||
@Nullable Supplier<String> p_394357_, int p_395623_, TextureFormat p_395807_, int p_395802_, int p_396157_, int p_408810_, int p_407070_
|
||||
);
|
||||
|
||||
GpuTexture createTexture(@Nullable Supplier<String> p_394357_, TextureFormat p_395807_, int p_395623_, int p_395802_, int p_396157_);
|
||||
|
||||
+ /** Forge: same as {@link #createTexture(Supplier, TextureFormat, int, int, int)} but with stencil support */
|
||||
+ default GpuTexture createTexture(@Nullable Supplier<String> p_394357_, TextureFormat p_395807_, int p_395623_, int p_395802_, int p_396157_, boolean stencil) {
|
||||
+ return this.createTexture(p_394357_, p_395807_, p_395623_, p_395802_, p_396157_);
|
||||
+ /** Forge: same as {@link #createTexture(Supplier, int, TextureFormat, int, int, int)} but with stencil support */
|
||||
+ default GpuTexture createTexture(@Nullable Supplier<String> p_394357_, int p_395623_, TextureFormat p_395807_, int p_395802_, int p_396157_, int p_408810_, int p_407070_, boolean stencil) {
|
||||
+ return this.createTexture(p_394357_, p_395623_, p_395807_, p_395802_, p_396157_, p_408810_, p_407070_);
|
||||
+ }
|
||||
+
|
||||
GpuTexture createTexture(@Nullable String p_391798_, TextureFormat p_393333_, int p_391800_, int p_395600_, int p_394065_);
|
||||
GpuTexture createTexture(@Nullable String p_391798_, int p_391800_, TextureFormat p_393333_, int p_395600_, int p_394065_, int p_408732_, int p_407125_);
|
||||
+
|
||||
+ /** Forge: same as {@link #createTexture(String, TextureFormat, int, int, int)} but with stencil support */
|
||||
+ default GpuTexture createTexture(@Nullable String p_391798_, TextureFormat p_393333_, int p_391800_, int p_395600_, int p_394065_, boolean stencil) {
|
||||
+ return this.createTexture(p_391798_, p_393333_, p_391800_, p_395600_, p_394065_);
|
||||
+ /** Forge: same as {@link #createTexture(String, int, TextureFormat, int, int, int)} but with stencil support */
|
||||
+ default GpuTexture createTexture(@Nullable String p_391798_, int p_391800_, TextureFormat p_393333_, int p_395600_, int p_394065_, int p_408732_, int p_407125_, boolean stencil) {
|
||||
+ return this.createTexture(p_391798_, p_391800_, p_393333_, p_395600_, p_394065_, p_408732_, p_407125_);
|
||||
+ }
|
||||
|
||||
GpuBuffer createBuffer(@Nullable Supplier<String> p_395215_, BufferType p_392847_, BufferUsage p_391478_, int p_397054_);
|
||||
GpuTextureView createTextureView(GpuTexture p_409045_);
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
@DontObfuscate
|
||||
-public abstract class GpuTexture implements AutoCloseable {
|
||||
+public abstract class GpuTexture implements AutoCloseable, net.minecraftforge.client.extensions.IForgeGpuTexture {
|
||||
private final TextureFormat format;
|
||||
private final int width;
|
||||
private final int height;
|
||||
public static final int USAGE_COPY_DST = 1;
|
||||
public static final int USAGE_COPY_SRC = 2;
|
||||
public static final int USAGE_TEXTURE_BINDING = 4;
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/com/mojang/blaze3d/vertex/VertexConsumer.java
|
||||
+++ b/com/mojang/blaze3d/vertex/VertexConsumer.java
|
||||
@@ -13,7 +_,7 @@
|
||||
@@ -15,7 +_,7 @@
|
||||
import org.lwjgl.system.MemoryStack;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@@ -9,7 +9,7 @@
|
||||
VertexConsumer addVertex(float p_344294_, float p_342213_, float p_344859_);
|
||||
|
||||
VertexConsumer setColor(int p_342749_, int p_344324_, int p_343336_, int p_342831_);
|
||||
@@ -133,9 +_,11 @@
|
||||
@@ -135,9 +_,11 @@
|
||||
|
||||
int j1 = ARGB.color(k, (int)f3, (int)f4, (int)f5);
|
||||
int k1 = LightTexture.lightCoordsWithEmission(p_331444_[i1], l);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/com/mojang/blaze3d/vertex/VertexFormat.java
|
||||
+++ b/com/mojang/blaze3d/vertex/VertexFormat.java
|
||||
@@ -20,7 +_,7 @@
|
||||
@@ -18,7 +_,7 @@
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@DontObfuscate
|
||||
@@ -9,7 +9,7 @@
|
||||
public static final int UNKNOWN_ELEMENT = -1;
|
||||
private final List<VertexFormatElement> elements;
|
||||
private final List<String> names;
|
||||
@@ -31,6 +_,7 @@
|
||||
@@ -29,6 +_,7 @@
|
||||
private GpuBuffer immediateDrawVertexBuffer;
|
||||
@Nullable
|
||||
private GpuBuffer immediateDrawIndexBuffer;
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
VertexFormat(List<VertexFormatElement> p_343616_, List<String> p_345241_, IntList p_345522_, int p_344162_) {
|
||||
this.elements = p_343616_;
|
||||
@@ -43,6 +_,11 @@
|
||||
@@ -41,6 +_,11 @@
|
||||
int j = vertexformatelement != null ? p_343616_.indexOf(vertexformatelement) : -1;
|
||||
this.offsetsByElement[i] = j != -1 ? p_345522_.getInt(j) : -1;
|
||||
}
|
||||
@@ -29,7 +29,7 @@
|
||||
}
|
||||
|
||||
public static VertexFormat.Builder builder() {
|
||||
@@ -146,6 +_,9 @@
|
||||
@@ -138,6 +_,9 @@
|
||||
|
||||
return this.immediateDrawIndexBuffer;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/SharedConstants.java
|
||||
+++ b/net/minecraft/SharedConstants.java
|
||||
@@ -171,6 +_,7 @@
|
||||
@@ -175,6 +_,7 @@
|
||||
}
|
||||
|
||||
static {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
--- a/net/minecraft/Util.java
|
||||
+++ b/net/minecraft/Util.java
|
||||
@@ -268,7 +_,7 @@
|
||||
.getSchema(DataFixUtils.makeKey(SharedConstants.getCurrentVersion().getDataVersion().getVersion()))
|
||||
.getSchema(DataFixUtils.makeKey(SharedConstants.getCurrentVersion().dataVersion().version()))
|
||||
.getChoiceType(p_137552_, p_137553_);
|
||||
} catch (IllegalArgumentException illegalargumentexception) {
|
||||
- LOGGER.error("No data fixer registered for {}", p_137553_);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
--- a/net/minecraft/advancements/AdvancementRewards.java
|
||||
+++ b/net/minecraft/advancements/AdvancementRewards.java
|
||||
@@ -40,6 +_,7 @@
|
||||
LootParams lootparams = new LootParams.Builder(p_9990_.serverLevel())
|
||||
@@ -43,6 +_,7 @@
|
||||
LootParams lootparams = new LootParams.Builder(serverlevel)
|
||||
.withParameter(LootContextParams.THIS_ENTITY, p_9990_)
|
||||
.withParameter(LootContextParams.ORIGIN, p_9990_.position())
|
||||
+ .withLuck(p_9990_.getLuck())
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/Camera.java
|
||||
+++ b/net/minecraft/client/Camera.java
|
||||
@@ -118,9 +_,13 @@
|
||||
@@ -133,9 +_,13 @@
|
||||
}
|
||||
|
||||
protected void setRotation(float p_90573_, float p_90574_) {
|
||||
@@ -15,7 +15,7 @@
|
||||
FORWARDS.rotate(this.rotation, this.forwards);
|
||||
UP.rotate(this.rotation, this.up);
|
||||
LEFT.rotate(this.rotation, this.left);
|
||||
@@ -236,6 +_,13 @@
|
||||
@@ -251,6 +_,13 @@
|
||||
|
||||
public float getPartialTickTime() {
|
||||
return this.partialTickTime;
|
||||
@@ -28,4 +28,4 @@
|
||||
+ return this.level.getBlockState(this.blockPosition).getStateAtViewpoint(this.level, this.blockPosition, this.position);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@Override
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/KeyboardHandler.java
|
||||
+++ b/net/minecraft/client/KeyboardHandler.java
|
||||
@@ -431,12 +_,12 @@
|
||||
@@ -440,12 +_,12 @@
|
||||
if (screen != null) {
|
||||
try {
|
||||
if (p_90897_ != 1 && p_90897_ != 2) {
|
||||
@@ -15,7 +15,7 @@
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -495,6 +_,7 @@
|
||||
@@ -504,6 +_,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -504,10 +_,10 @@
|
||||
@@ -513,10 +_,10 @@
|
||||
if (screen != null && this.minecraft.getOverlay() == null) {
|
||||
try {
|
||||
if (Character.isBmpCodePoint(p_90891_)) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/Minecraft.java
|
||||
+++ b/net/minecraft/client/Minecraft.java
|
||||
@@ -248,7 +_,7 @@
|
||||
@@ -256,7 +_,7 @@
|
||||
import org.slf4j.Logger;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@@ -9,7 +9,7 @@
|
||||
static Minecraft instance;
|
||||
private static final Logger LOGGER = LogUtils.getLogger();
|
||||
public static final boolean ON_OSX = Util.getPlatform() == Util.OS.OSX;
|
||||
@@ -426,7 +_,6 @@
|
||||
@@ -435,7 +_,6 @@
|
||||
}
|
||||
}, Util.nonCriticalIoPool());
|
||||
LOGGER.info("Setting user: {}", this.user.getName());
|
||||
@@ -17,7 +17,7 @@
|
||||
this.demo = p_91084_.game.demo;
|
||||
this.allowsMultiplayer = !p_91084_.game.disableMultiplayer;
|
||||
this.allowsChat = !p_91084_.game.disableChat;
|
||||
@@ -478,10 +_,9 @@
|
||||
@@ -486,10 +_,9 @@
|
||||
LOGGER.error("Couldn't set icon", (Throwable)ioexception);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
RenderSystem.initRenderer(
|
||||
this.window.getWindow(),
|
||||
this.options.glDebugVerbosity,
|
||||
@@ -492,6 +_,7 @@
|
||||
@@ -500,6 +_,7 @@
|
||||
LOGGER.info("Using optional rendering extensions: {}", String.join(", ", RenderSystem.getDevice().getEnabledExtensions()));
|
||||
this.mainRenderTarget = new MainTarget(this.window.getWidth(), this.window.getHeight());
|
||||
this.resourceManager = new ReloadableResourceManager(PackType.CLIENT_RESOURCES);
|
||||
@@ -37,7 +37,7 @@
|
||||
this.resourcePackRepository.reload();
|
||||
this.options.loadSelectedResourcePacks(this.resourcePackRepository);
|
||||
this.languageManager = new LanguageManager(this.options.languageCode, p_340763_ -> {
|
||||
@@ -570,6 +_,7 @@
|
||||
@@ -578,6 +_,7 @@
|
||||
this.blockEntityRenderDispatcher = new BlockEntityRenderDispatcher(this.font, this.modelManager.entityModels(), this.blockRenderer, this.itemModelResolver, this.itemRenderer, this.entityRenderDispatcher);
|
||||
this.resourceManager.registerReloadListener(this.blockEntityRenderDispatcher);
|
||||
this.particleEngine = new ParticleEngine(this.level, this.textureManager);
|
||||
@@ -45,7 +45,7 @@
|
||||
this.resourceManager.registerReloadListener(this.particleEngine);
|
||||
this.paintingTextures = new PaintingTextureManager(this.textureManager);
|
||||
this.resourceManager.registerReloadListener(this.paintingTextures);
|
||||
@@ -585,6 +_,9 @@
|
||||
@@ -593,6 +_,9 @@
|
||||
this.resourceManager.registerReloadListener(this.gpuWarnlistManager);
|
||||
this.resourceManager.registerReloadListener(this.regionalCompliancies);
|
||||
this.gui = new Gui(this);
|
||||
@@ -55,7 +55,7 @@
|
||||
this.debugRenderer = new DebugRenderer(this);
|
||||
RealmsClient realmsclient = RealmsClient.getOrCreate(this);
|
||||
this.realmsDataFetcher = new RealmsDataFetcher(realmsclient);
|
||||
@@ -618,6 +_,7 @@
|
||||
@@ -626,6 +_,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
this.window.updateVsync(this.options.enableVsync().get());
|
||||
this.window.updateRawMouseInput(this.options.rawMouseInput().get());
|
||||
this.window.setDefaultErrorCallback();
|
||||
@@ -639,16 +_,17 @@
|
||||
@@ -648,16 +_,17 @@
|
||||
GameLoadTimesEvent.INSTANCE.beginStep(TelemetryProperty.LOAD_TIME_LOADING_OVERLAY_MS);
|
||||
Minecraft.GameLoadCookie minecraft$gameloadcookie = new Minecraft.GameLoadCookie(realmsclient, p_91084_.quickPlay);
|
||||
this.setOverlay(
|
||||
@@ -82,9 +82,9 @@
|
||||
- )
|
||||
+ ).get()
|
||||
);
|
||||
this.quickPlayLog = QuickPlayLog.of(p_91084_.quickPlay.path());
|
||||
this.quickPlayLog = QuickPlayLog.of(p_91084_.quickPlay.logPath());
|
||||
this.framerateLimitTracker = new FramerateLimitTracker(this.options, this);
|
||||
@@ -746,6 +_,7 @@
|
||||
@@ -759,6 +_,7 @@
|
||||
StringBuilder stringbuilder = new StringBuilder("Minecraft");
|
||||
if (checkModStatus().shouldReportAsModified()) {
|
||||
stringbuilder.append("*");
|
||||
@@ -92,7 +92,7 @@
|
||||
}
|
||||
|
||||
stringbuilder.append(" ");
|
||||
@@ -769,6 +_,8 @@
|
||||
@@ -782,6 +_,8 @@
|
||||
}
|
||||
|
||||
private UserApiService createUserApiService(YggdrasilAuthenticationService p_193586_, GameConfig p_193587_) {
|
||||
@@ -101,7 +101,7 @@
|
||||
return p_193587_.user.user.getType() != User.Type.MSA
|
||||
? UserApiService.OFFLINE
|
||||
: p_193586_.createUserApiService(p_193587_.user.user.getAccessToken());
|
||||
@@ -779,7 +_,7 @@
|
||||
@@ -792,7 +_,7 @@
|
||||
}
|
||||
|
||||
private void rollbackResourcePacks(Throwable p_91240_, @Nullable Minecraft.GameLoadCookie p_299515_) {
|
||||
@@ -110,7 +110,7 @@
|
||||
this.clearResourcePacksOnError(p_91240_, null, p_299515_);
|
||||
} else {
|
||||
Util.throwAsRuntime(p_91240_);
|
||||
@@ -1065,12 +_,6 @@
|
||||
@@ -1078,12 +_,6 @@
|
||||
LOGGER.error("setScreen called from non-game thread");
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
if (p_91153_ == null && this.clientLevelTeardownInProgress) {
|
||||
throw new IllegalStateException("Trying to return to in-game GUI during disconnection");
|
||||
} else {
|
||||
@@ -1084,6 +_,23 @@
|
||||
@@ -1097,6 +_,23 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
this.screen = p_91153_;
|
||||
if (this.screen != null) {
|
||||
this.screen.added();
|
||||
@@ -1168,6 +_,7 @@
|
||||
@@ -1180,6 +_,7 @@
|
||||
FreeTypeUtil.destroy();
|
||||
Util.shutdownExecutors();
|
||||
RenderSystem.getDevice().close();
|
||||
@@ -155,7 +155,7 @@
|
||||
} catch (Throwable throwable) {
|
||||
LOGGER.error("Shutdown failure!", throwable);
|
||||
throw throwable;
|
||||
@@ -1237,9 +_,11 @@
|
||||
@@ -1248,9 +_,11 @@
|
||||
this.mouseHandler.handleAccumulatedMovement();
|
||||
profilerfiller.pop();
|
||||
if (!this.noRender) {
|
||||
@@ -167,7 +167,7 @@
|
||||
}
|
||||
|
||||
profilerfiller.push("blit");
|
||||
@@ -1363,10 +_,12 @@
|
||||
@@ -1379,10 +_,12 @@
|
||||
this.window.setGuiScale(i);
|
||||
if (this.screen != null) {
|
||||
this.screen.resize(this, this.window.getGuiScaledWidth(), this.window.getGuiScaledHeight());
|
||||
@@ -180,7 +180,7 @@
|
||||
this.gameRenderer.resize(this.window.getWidth(), this.window.getHeight());
|
||||
this.mouseHandler.setIgnoreFirstMove();
|
||||
}
|
||||
@@ -1504,6 +_,7 @@
|
||||
@@ -1520,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
@@ -188,14 +188,14 @@
|
||||
this.running = false;
|
||||
}
|
||||
|
||||
@@ -1532,10 +_,18 @@
|
||||
@@ -1547,10 +_,18 @@
|
||||
if (p_91387_ && this.hitResult != null && this.hitResult.getType() == HitResult.Type.BLOCK) {
|
||||
BlockHitResult blockhitresult = (BlockHitResult)this.hitResult;
|
||||
BlockPos blockpos = blockhitresult.getBlockPos();
|
||||
- if (!this.level.getBlockState(blockpos).isAir()) {
|
||||
+ if (!this.level.isEmptyBlock(blockpos)) {
|
||||
+ var inputEvent = net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(0, this.options.keyAttack, InteractionHand.MAIN_HAND);
|
||||
+ if (inputEvent.isCanceled()) {
|
||||
+ var inputEvent = new net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered(0, this.options.keyAttack, InteractionHand.MAIN_HAND);
|
||||
+ if (net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered.BUS.post(inputEvent)) {
|
||||
+ if (inputEvent.shouldSwingHand()) {
|
||||
+ this.particleEngine.addBlockHitEffects(blockpos, blockhitresult);
|
||||
+ this.player.swing(InteractionHand.MAIN_HAND);
|
||||
@@ -210,16 +210,16 @@
|
||||
this.player.swing(InteractionHand.MAIN_HAND);
|
||||
}
|
||||
}
|
||||
@@ -1563,6 +_,8 @@
|
||||
@@ -1578,6 +_,8 @@
|
||||
return false;
|
||||
} else {
|
||||
boolean flag = false;
|
||||
+ var inputEvent = net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(0, this.options.keyAttack, InteractionHand.MAIN_HAND);
|
||||
+ if (!inputEvent.isCanceled())
|
||||
+ var inputEvent = new net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered(0, this.options.keyAttack, InteractionHand.MAIN_HAND);
|
||||
+ if (!net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered.BUS.post(inputEvent))
|
||||
switch (this.hitResult.getType()) {
|
||||
case ENTITY:
|
||||
this.gameMode.attack(this.player, ((EntityHitResult)this.hitResult).getEntity());
|
||||
@@ -1570,7 +_,7 @@
|
||||
@@ -1585,7 +_,7 @@
|
||||
case BLOCK:
|
||||
BlockHitResult blockhitresult = (BlockHitResult)this.hitResult;
|
||||
BlockPos blockpos = blockhitresult.getBlockPos();
|
||||
@@ -228,7 +228,7 @@
|
||||
this.gameMode.startDestroyBlock(blockpos, blockhitresult.getDirection());
|
||||
if (this.level.getBlockState(blockpos).isAir()) {
|
||||
flag = true;
|
||||
@@ -1583,8 +_,10 @@
|
||||
@@ -1598,8 +_,10 @@
|
||||
}
|
||||
|
||||
this.player.resetAttackStrengthTicker();
|
||||
@@ -239,12 +239,12 @@
|
||||
this.player.swing(InteractionHand.MAIN_HAND);
|
||||
return flag;
|
||||
}
|
||||
@@ -1600,6 +_,12 @@
|
||||
@@ -1615,6 +_,12 @@
|
||||
}
|
||||
|
||||
for (InteractionHand interactionhand : InteractionHand.values()) {
|
||||
+ var inputEvent = net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(1, this.options.keyUse, interactionhand);
|
||||
+ if (inputEvent.isCanceled()) {
|
||||
+ var inputEvent = new net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered(1, this.options.keyUse, interactionhand);
|
||||
+ if (net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered.BUS.post(inputEvent)) {
|
||||
+ if (inputEvent.shouldSwingHand()) this.player.swing(interactionhand);
|
||||
+ return;
|
||||
+ }
|
||||
@@ -252,7 +252,7 @@
|
||||
ItemStack itemstack = this.player.getItemInHand(interactionhand);
|
||||
if (!itemstack.isItemEnabled(this.level.enabledFeatures())) {
|
||||
return;
|
||||
@@ -1620,7 +_,7 @@
|
||||
@@ -1635,7 +_,7 @@
|
||||
}
|
||||
|
||||
if (interactionresult instanceof InteractionResult.Success interactionresult$success2) {
|
||||
@@ -261,7 +261,7 @@
|
||||
this.player.swing(interactionhand);
|
||||
}
|
||||
|
||||
@@ -1632,7 +_,7 @@
|
||||
@@ -1647,7 +_,7 @@
|
||||
int i = itemstack.getCount();
|
||||
InteractionResult interactionresult1 = this.gameMode.useItemOn(this.player, interactionhand, blockhitresult);
|
||||
if (interactionresult1 instanceof InteractionResult.Success interactionresult$success) {
|
||||
@@ -270,7 +270,7 @@
|
||||
this.player.swing(interactionhand);
|
||||
if (!itemstack.isEmpty() && (itemstack.getCount() != i || this.player.hasInfiniteMaterials())) {
|
||||
this.gameRenderer.itemInHandRenderer.itemUsed(interactionhand);
|
||||
@@ -1648,6 +_,9 @@
|
||||
@@ -1663,6 +_,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
if (!itemstack.isEmpty()
|
||||
&& this.gameMode.useItem(this.player, interactionhand) instanceof InteractionResult.Success interactionresult$success1) {
|
||||
if (interactionresult$success1.swingSource() == InteractionResult.SwingSource.CLIENT) {
|
||||
@@ -1677,6 +_,8 @@
|
||||
@@ -1692,6 +_,8 @@
|
||||
}
|
||||
|
||||
ProfilerFiller profilerfiller = Profiler.get();
|
||||
@@ -289,7 +289,7 @@
|
||||
profilerfiller.push("gui");
|
||||
this.chatListener.tick();
|
||||
this.gui.tick(this.pause);
|
||||
@@ -1766,6 +_,7 @@
|
||||
@@ -1778,6 +_,7 @@
|
||||
|
||||
this.tutorial.tick();
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
try {
|
||||
this.level.tick(() -> true);
|
||||
} catch (Throwable throwable1) {
|
||||
@@ -1779,6 +_,7 @@
|
||||
@@ -1791,6 +_,7 @@
|
||||
|
||||
throw new ReportedException(crashreport1);
|
||||
}
|
||||
@@ -305,7 +305,7 @@
|
||||
}
|
||||
|
||||
profilerfiller.popPush("animateTick");
|
||||
@@ -1803,6 +_,7 @@
|
||||
@@ -1815,6 +_,7 @@
|
||||
profilerfiller.popPush("keyboard");
|
||||
this.keyboardHandler.tick();
|
||||
profilerfiller.pop();
|
||||
@@ -313,7 +313,7 @@
|
||||
}
|
||||
|
||||
private boolean isLevelRunningNormally() {
|
||||
@@ -2003,6 +_,7 @@
|
||||
@@ -2031,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void setLevel(ClientLevel p_91157_, ReceivingLevelScreen.Reason p_335893_) {
|
||||
@@ -321,7 +321,7 @@
|
||||
this.updateScreenAndTick(new ReceivingLevelScreen(() -> false, p_335893_));
|
||||
this.level = p_91157_;
|
||||
this.updateLevelInEngines(p_91157_);
|
||||
@@ -2040,6 +_,7 @@
|
||||
@@ -2068,6 +_,7 @@
|
||||
IntegratedServer integratedserver = this.singleplayerServer;
|
||||
this.singleplayerServer = null;
|
||||
this.gameRenderer.resetData();
|
||||
@@ -329,7 +329,7 @@
|
||||
this.gameMode = null;
|
||||
this.narrator.clear();
|
||||
this.clientLevelTeardownInProgress = true;
|
||||
@@ -2047,6 +_,7 @@
|
||||
@@ -2075,6 +_,7 @@
|
||||
try {
|
||||
this.updateScreenAndTick(p_335030_);
|
||||
if (this.level != null) {
|
||||
@@ -337,7 +337,7 @@
|
||||
if (integratedserver != null) {
|
||||
ProfilerFiller profilerfiller = Profiler.get();
|
||||
profilerfiller.push("waitForServer");
|
||||
@@ -2060,6 +_,7 @@
|
||||
@@ -2088,6 +_,7 @@
|
||||
|
||||
this.gui.onDisconnected();
|
||||
this.isLocalServer = false;
|
||||
@@ -345,11 +345,11 @@
|
||||
}
|
||||
|
||||
this.level = null;
|
||||
@@ -2207,6 +_,7 @@
|
||||
@@ -2236,6 +_,7 @@
|
||||
|
||||
private void pickBlock() {
|
||||
if (this.hitResult != null && this.hitResult.getType() != HitResult.Type.MISS) {
|
||||
+ if (net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(2, this.options.keyPickItem, InteractionHand.MAIN_HAND).isCanceled()) return;
|
||||
+ if (net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInputPickBlock(this.options.keyPickItem)) return;
|
||||
boolean flag = Screen.hasControlDown();
|
||||
switch (this.hitResult) {
|
||||
case BlockHitResult blockhitresult:
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/Options.java
|
||||
+++ b/net/minecraft/client/Options.java
|
||||
@@ -668,7 +_,8 @@
|
||||
@@ -671,7 +_,8 @@
|
||||
},
|
||||
new OptionInstance.LazyEnum<>(
|
||||
() -> Stream.concat(Stream.of(""), Minecraft.getInstance().getSoundManager().getAvailableSoundDevices().stream()).toList(),
|
||||
@@ -10,15 +10,15 @@
|
||||
? Optional.empty()
|
||||
: Optional.of(p_232011_),
|
||||
Codec.STRING
|
||||
@@ -683,6 +_,7 @@
|
||||
public boolean onboardAccessibility = true;
|
||||
@@ -705,6 +_,7 @@
|
||||
);
|
||||
public boolean syncWrites;
|
||||
public boolean startedCleanly = true;
|
||||
+ private final Map<String, String> unknownKeys = new java.util.HashMap<>();
|
||||
|
||||
public OptionInstance<Boolean> darkMojangStudiosBackground() {
|
||||
return this.darkMojangStudiosBackground;
|
||||
@@ -1050,6 +_,7 @@
|
||||
@@ -1088,6 +_,7 @@
|
||||
}
|
||||
|
||||
public Options(Minecraft p_92138_, File p_92139_) {
|
||||
@@ -26,10 +26,10 @@
|
||||
this.minecraft = p_92138_;
|
||||
this.optionsFile = new File(p_92139_, "options.txt");
|
||||
boolean flag = Runtime.getRuntime().maxMemory() >= 1000000000L;
|
||||
@@ -1181,15 +_,28 @@
|
||||
this.onboardAccessibility = p_168428_.process("onboardAccessibility", this.onboardAccessibility);
|
||||
p_168428_.process("menuBackgroundBlurriness", this.menuBackgroundBlurriness);
|
||||
@@ -1222,15 +_,28 @@
|
||||
this.startedCleanly = p_168428_.process("startedCleanly", this.startedCleanly);
|
||||
p_168428_.process("showNowPlayingToast", this.showNowPlayingToast);
|
||||
p_168428_.process("musicFrequency", this.musicFrequency);
|
||||
+ processOptionsKeysOnly(p_168428_);
|
||||
+ processOptionsEnd(p_168428_);
|
||||
+ }
|
||||
@@ -56,7 +56,7 @@
|
||||
for (SoundSource soundsource : SoundSource.values()) {
|
||||
p_168428_.process("soundCategory_" + soundsource.getName(), this.soundSourceVolumes.get(soundsource));
|
||||
}
|
||||
@@ -1204,6 +_,10 @@
|
||||
@@ -1245,6 +_,10 @@
|
||||
}
|
||||
|
||||
public void load() {
|
||||
@@ -67,7 +67,7 @@
|
||||
try {
|
||||
if (!this.optionsFile.exists()) {
|
||||
return;
|
||||
@@ -1228,7 +_,8 @@
|
||||
@@ -1269,7 +_,8 @@
|
||||
this.graphicsMode.set(isTrue(optional.get()) ? GraphicsStatus.FANCY : GraphicsStatus.FAST);
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
new Options.FieldAccess() {
|
||||
@Nullable
|
||||
private String getValue(String p_394210_) {
|
||||
@@ -1310,6 +_,17 @@
|
||||
@@ -1350,6 +_,17 @@
|
||||
);
|
||||
compoundtag1.getString("fullscreenResolution").ifPresent(p_389133_ -> this.fullscreenVideoModeString = p_389133_);
|
||||
KeyMapping.resetMapping();
|
||||
@@ -95,10 +95,10 @@
|
||||
} catch (Exception exception) {
|
||||
LOGGER.error("Failed to load options", (Throwable)exception);
|
||||
}
|
||||
@@ -1337,9 +_,11 @@
|
||||
@@ -1377,9 +_,11 @@
|
||||
public void save() {
|
||||
try (final PrintWriter printwriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(this.optionsFile), StandardCharsets.UTF_8))) {
|
||||
printwriter.println("version:" + SharedConstants.getCurrentVersion().getDataVersion().getVersion());
|
||||
printwriter.println("version:" + SharedConstants.getCurrentVersion().dataVersion().version());
|
||||
+ var seen = new java.util.HashSet<String>();
|
||||
this.processOptions(
|
||||
new Options.FieldAccess() {
|
||||
@@ -107,7 +107,7 @@
|
||||
printwriter.print(p_168491_);
|
||||
printwriter.print(':');
|
||||
}
|
||||
@@ -1395,6 +_,12 @@
|
||||
@@ -1435,6 +_,12 @@
|
||||
if (s != null) {
|
||||
printwriter.println("fullscreenResolution:" + s);
|
||||
}
|
||||
@@ -120,7 +120,7 @@
|
||||
} catch (Exception exception) {
|
||||
LOGGER.error("Failed to save options", (Throwable)exception);
|
||||
}
|
||||
@@ -1433,6 +_,7 @@
|
||||
@@ -1473,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void broadcastOptions() {
|
||||
@@ -128,7 +128,7 @@
|
||||
if (this.minecraft.player != null) {
|
||||
this.minecraft.player.connection.broadcastClientInformation(this.buildPlayerInformation());
|
||||
}
|
||||
@@ -1546,6 +_,23 @@
|
||||
@@ -1586,6 +_,23 @@
|
||||
|
||||
public static Component genericValueLabel(Component p_231901_, int p_231902_) {
|
||||
return genericValueLabel(p_231901_, Component.literal(Integer.toString(p_231902_)));
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
file2 = new File(file1, p_92297_);
|
||||
}
|
||||
|
||||
+ var event = net.minecraftforge.client.event.ForgeEventFactoryClient.onScreenshot(p_389141_, file2);
|
||||
+ if (event.isCanceled()) {
|
||||
+ var event = new net.minecraftforge.client.event.ScreenshotEvent(p_389141_, file2);
|
||||
+ if (net.minecraftforge.client.event.ScreenshotEvent.BUS.post(event)) {
|
||||
+ p_92301_.accept(event.getCancelMessage());
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/data/Main.java
|
||||
+++ b/net/minecraft/client/data/Main.java
|
||||
@@ -30,13 +_,18 @@
|
||||
@@ -31,13 +_,18 @@
|
||||
OptionSpec<Void> optionspec1 = optionparser.accepts("client", "Include client generators");
|
||||
OptionSpec<Void> optionspec2 = optionparser.accepts("all", "Include all generators");
|
||||
OptionSpec<String> optionspec3 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated");
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/data/models/ItemModelGenerators.java
|
||||
+++ b/net/minecraft/client/data/models/ItemModelGenerators.java
|
||||
@@ -852,6 +_,9 @@
|
||||
@@ -870,6 +_,9 @@
|
||||
this.declareCustomModelItem(Items.COD);
|
||||
this.declareCustomModelItem(Items.FEATHER);
|
||||
this.declareCustomModelItem(Items.LEAD);
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
-public class Font {
|
||||
+public class Font implements net.minecraftforge.client.extensions.IForgeFont {
|
||||
private static final float EFFECT_DEPTH = 0.01F;
|
||||
public static final float SHADOW_DEPTH = 0.03F;
|
||||
public static final int NO_SHADOW = 0;
|
||||
private static final float EFFECT_DEPTH = 0.001F;
|
||||
private static final float OVER_EFFECT_DEPTH = 0.001F;
|
||||
private static final float UNDER_EFFECT_DEPTH = -0.001F;
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/Gui.java
|
||||
+++ b/net/minecraft/client/gui/Gui.java
|
||||
@@ -148,7 +_,7 @@
|
||||
@@ -151,7 +_,7 @@
|
||||
public float vignetteBrightness = 1.0F;
|
||||
private int toolHighlightTimer;
|
||||
private ItemStack lastToolHighlight = ItemStack.EMPTY;
|
||||
@@ -9,16 +9,16 @@
|
||||
private final SubtitleOverlay subtitleOverlay;
|
||||
private final SpectatorGui spectatorGui;
|
||||
private final PlayerTabOverlay tabList;
|
||||
@@ -347,7 +_,7 @@
|
||||
Window window = this.minecraft.getWindow();
|
||||
@@ -377,7 +_,7 @@
|
||||
int i = Mth.floor(this.minecraft.mouseHandler.getScaledXPos(window));
|
||||
int j = Mth.floor(this.minecraft.mouseHandler.getScaledYPos(window));
|
||||
p_329202_.nextStratum();
|
||||
- this.chat.render(p_329202_, this.tickCount, i, j, false);
|
||||
+ net.minecraftforge.client.ForgeHooksClient.onCustomizeChatEvent(p_329202_, this.chat, window, i, j, this.tickCount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,6 +_,8 @@
|
||||
@@ -472,6 +_,8 @@
|
||||
|
||||
for (MobEffectInstance mobeffectinstance : Ordering.natural().reverse().sortedCopy(collection)) {
|
||||
Holder<MobEffect> holder = mobeffectinstance.getEffect();
|
||||
@@ -27,15 +27,15 @@
|
||||
if (mobeffectinstance.showIcon()) {
|
||||
int k = p_282812_.guiWidth();
|
||||
int l = 1;
|
||||
@@ -475,6 +_,7 @@
|
||||
@@ -502,6 +_,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ if (renderer.renderGuiIcon(mobeffectinstance, this, p_282812_, k, l, 0, f)) continue;
|
||||
TextureAtlasSprite textureatlassprite = mobeffecttexturemanager.get(holder);
|
||||
int l1 = k;
|
||||
int k1 = l;
|
||||
@@ -625,6 +_,10 @@
|
||||
p_282812_.blitSprite(RenderPipelines.GUI_TEXTURED, getMobEffectSprite(holder), k + 3, l + 3, 18, 18, ARGB.white(f));
|
||||
}
|
||||
}
|
||||
@@ -598,6 +_,10 @@
|
||||
}
|
||||
|
||||
private void renderSelectedItemName(GuiGraphics p_283501_) {
|
||||
@@ -46,7 +46,7 @@
|
||||
Profiler.get().push("selectedItemName");
|
||||
if (this.toolHighlightTimer > 0 && !this.lastToolHighlight.isEmpty()) {
|
||||
MutableComponent mutablecomponent = Component.empty().append(this.lastToolHighlight.getHoverName()).withStyle(this.lastToolHighlight.getRarity().color());
|
||||
@@ -632,9 +_,13 @@
|
||||
@@ -605,9 +_,13 @@
|
||||
mutablecomponent.withStyle(ChatFormatting.ITALIC);
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
if (!this.minecraft.gameMode.canHurtPlayer()) {
|
||||
k += 14;
|
||||
}
|
||||
@@ -645,7 +_,7 @@
|
||||
@@ -618,7 +_,7 @@
|
||||
}
|
||||
|
||||
if (l > 0) {
|
||||
@@ -71,7 +71,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1154,7 +_,7 @@
|
||||
@@ -1148,7 +_,7 @@
|
||||
ItemStack itemstack = this.minecraft.player.getInventory().getSelectedItem();
|
||||
if (itemstack.isEmpty()) {
|
||||
this.toolHighlightTimer = 0;
|
||||
|
||||
@@ -1,160 +1,129 @@
|
||||
--- a/net/minecraft/client/gui/GuiGraphics.java
|
||||
+++ b/net/minecraft/client/gui/GuiGraphics.java
|
||||
@@ -52,7 +_,7 @@
|
||||
import org.joml.Vector2ic;
|
||||
@@ -72,7 +_,7 @@
|
||||
import org.joml.Vector3f;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
-public class GuiGraphics {
|
||||
+public class GuiGraphics implements net.minecraftforge.client.extensions.IForgeGuiGraphics {
|
||||
public static final float MAX_GUI_Z = 10000.0F;
|
||||
public static final float MIN_GUI_Z = -10000.0F;
|
||||
private static final int EXTRA_SPACE_AFTER_FIRST_TOOLTIP_LINE = 2;
|
||||
@@ -229,6 +_,11 @@
|
||||
}
|
||||
|
||||
public int drawString(Font p_283343_, @Nullable String p_281896_, int p_283569_, int p_283418_, int p_281560_, boolean p_282130_) {
|
||||
+ return this.drawString(p_283343_, p_281896_, (float)p_283569_, (float)p_283418_, p_281560_, p_282130_);
|
||||
+ }
|
||||
+
|
||||
+ // Forge: Add float variant for x,y coordinates
|
||||
+ public int drawString(Font p_283343_, @Nullable String p_281896_, float p_283569_, float p_283418_, int p_281560_, boolean p_282130_) {
|
||||
return p_281896_ == null
|
||||
? 0
|
||||
: p_283343_.drawInBatch(
|
||||
@@ -250,6 +_,11 @@
|
||||
}
|
||||
|
||||
public int drawString(Font p_282636_, FormattedCharSequence p_281596_, int p_281586_, int p_282816_, int p_281743_, boolean p_282394_) {
|
||||
+ return this.drawString(p_282636_, p_281596_, (float)p_281586_, (float)p_282816_, p_281743_, p_282394_);
|
||||
+ }
|
||||
+
|
||||
+ // Forge: Add float variant for x,y coordinates
|
||||
+ public int drawString(Font p_282636_, FormattedCharSequence p_281596_, float p_281586_, float p_282816_, int p_281743_, boolean p_282394_) {
|
||||
return p_282636_.drawInBatch(
|
||||
p_281596_, p_281586_, p_282816_, p_281743_, p_282394_, this.pose.last().pose(), this.bufferSource, Font.DisplayMode.NORMAL, 0, 15728880
|
||||
);
|
||||
@@ -850,6 +_,7 @@
|
||||
private final Minecraft minecraft;
|
||||
private final Matrix3x2fStack pose;
|
||||
@@ -870,6 +_,7 @@
|
||||
CrashReport crashreport = CrashReport.forThrowable(throwable, "Rendering item");
|
||||
CrashReportCategory crashreportcategory = crashreport.addCategory("Item being rendered");
|
||||
crashreportcategory.setDetail("Item Type", () -> String.valueOf(p_281675_.getItem()));
|
||||
+ crashreportcategory.setDetail("Registry Name", () -> String.valueOf(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(p_281675_.getItem())));
|
||||
crashreportcategory.setDetail("Item Components", () -> String.valueOf(p_281675_.getComponents()));
|
||||
crashreportcategory.setDetail("Item Foil", () -> String.valueOf(p_281675_.hasFoil()));
|
||||
crashreportcategory.setDetail("Item Type", () -> String.valueOf(p_283653_.getItem()));
|
||||
+ crashreportcategory.setDetail("Registry Name", () -> String.valueOf(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(p_283653_.getItem())));
|
||||
crashreportcategory.setDetail("Item Components", () -> String.valueOf(p_283653_.getComponents()));
|
||||
crashreportcategory.setDetail("Item Foil", () -> String.valueOf(p_283653_.hasFoil()));
|
||||
throw new ReportedException(crashreport);
|
||||
@@ -870,13 +_,24 @@
|
||||
this.renderItemCount(p_282005_, p_283349_, p_282641_, p_282146_, p_282803_);
|
||||
@@ -888,6 +_,7 @@
|
||||
this.renderItemCooldown(p_283349_, p_282641_, p_282146_);
|
||||
this.pose.popPose();
|
||||
this.renderItemCount(p_282005_, p_283349_, p_282641_, p_282146_, p_282803_);
|
||||
this.pose.popMatrix();
|
||||
+ net.minecraftforge.client.ItemDecoratorHandler.of(p_283349_).render(this, p_282005_, p_283349_, p_282641_, p_282146_);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ private ItemStack tooltipStack = ItemStack.EMPTY;
|
||||
|
||||
public void renderTooltip(Font p_282308_, ItemStack p_282781_, int p_282687_, int p_282292_) {
|
||||
+ this.tooltipStack = p_282781_;
|
||||
this.renderTooltip(
|
||||
p_282308_, Screen.getTooltipFromItem(this.minecraft, p_282781_), p_282781_.getTooltipImage(), p_282687_, p_282292_, p_282781_.get(DataComponents.TOOLTIP_STYLE)
|
||||
@@ -899,21 +_,30 @@
|
||||
this.setTooltipForNextFrame(this.minecraft.font, p_407686_, DefaultTooltipPositioner.INSTANCE, p_410475_, p_407139_, false);
|
||||
}
|
||||
|
||||
+ private ItemStack tooltipStack = ItemStack.EMPTY;
|
||||
+
|
||||
public void setTooltipForNextFrame(Font p_408152_, ItemStack p_410145_, int p_410585_, int p_408354_) {
|
||||
+ this.tooltipStack = p_410145_;
|
||||
this.setTooltipForNextFrame(
|
||||
p_408152_, Screen.getTooltipFromItem(this.minecraft, p_410145_), p_410145_.getTooltipImage(), p_410585_, p_408354_, p_410145_.get(DataComponents.TOOLTIP_STYLE)
|
||||
);
|
||||
+ this.tooltipStack = ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
public void setTooltipForNextFrame(Font p_407170_, List<Component> p_407123_, Optional<TooltipComponent> p_409349_, int p_406573_, int p_409911_) {
|
||||
this.setTooltipForNextFrame(p_407170_, p_407123_, p_409349_, p_406573_, p_409911_, null);
|
||||
}
|
||||
|
||||
+ public void setTooltipForNextFrame(Font font, List<Component> textComponents, Optional<TooltipComponent> tooltipComponent, ItemStack stack, int mouseX, int mouseY) {
|
||||
+ this.tooltipStack = stack;
|
||||
+ this.setTooltipForNextFrame(font, textComponents, tooltipComponent, mouseX, mouseY, stack.get(DataComponents.TOOLTIP_STYLE));
|
||||
+ this.tooltipStack = ItemStack.EMPTY;
|
||||
+ }
|
||||
+
|
||||
+ public void renderTooltip(Font font, List<Component> textComponents, Optional<TooltipComponent> tooltipComponent, ItemStack stack, int mouseX, int mouseY) {
|
||||
+ this.tooltipStack = stack;
|
||||
+ this.renderTooltip(font, textComponents, tooltipComponent, mouseX, mouseY, stack.get(DataComponents.TOOLTIP_STYLE));
|
||||
+ this.tooltipStack = ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
public void renderTooltip(Font p_283128_, List<Component> p_282716_, Optional<TooltipComponent> p_281682_, int p_283678_, int p_281696_) {
|
||||
@@ -886,8 +_,7 @@
|
||||
public void renderTooltip(
|
||||
Font p_362491_, List<Component> p_368544_, Optional<TooltipComponent> p_362815_, int p_366300_, int p_368952_, @Nullable ResourceLocation p_368469_
|
||||
public void setTooltipForNextFrame(
|
||||
Font p_407847_, List<Component> p_408847_, Optional<TooltipComponent> p_410489_, int p_409369_, int p_407472_, @Nullable ResourceLocation p_410303_
|
||||
) {
|
||||
- List<ClientTooltipComponent> list = p_368544_.stream().map(Component::getVisualOrderText).map(ClientTooltipComponent::create).collect(Util.toMutableList());
|
||||
- p_362815_.ifPresent(p_325321_ -> list.add(list.isEmpty() ? 0 : 1, ClientTooltipComponent.create(p_325321_)));
|
||||
+ List<ClientTooltipComponent> list = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_368544_, p_362815_, p_366300_, guiWidth(), guiHeight(), p_362491_);
|
||||
this.renderTooltipInternal(p_362491_, list, p_366300_, p_368952_, DefaultTooltipPositioner.INSTANCE, p_368469_);
|
||||
- List<ClientTooltipComponent> list = p_408847_.stream().map(Component::getVisualOrderText).map(ClientTooltipComponent::create).collect(Util.toMutableList());
|
||||
- p_410489_.ifPresent(p_325321_ -> list.add(list.isEmpty() ? 0 : 1, ClientTooltipComponent.create(p_325321_)));
|
||||
+ List<ClientTooltipComponent> list = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_408847_, p_410489_, p_409369_, guiWidth(), guiHeight(), p_407847_);
|
||||
this.setTooltipForNextFrameInternal(p_407847_, list, p_409369_, p_407472_, DefaultTooltipPositioner.INSTANCE, p_410303_, false);
|
||||
}
|
||||
|
||||
@@ -900,7 +_,22 @@
|
||||
@@ -926,7 +_,22 @@
|
||||
}
|
||||
|
||||
public void renderComponentTooltip(Font p_282739_, List<Component> p_281832_, int p_282191_, int p_282446_) {
|
||||
- this.renderComponentTooltip(p_282739_, p_281832_, p_282191_, p_282446_, null);
|
||||
+ List<ClientTooltipComponent> components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_281832_, p_282191_, guiWidth(), guiHeight(), p_282739_);
|
||||
+ this.renderTooltipInternal(p_282739_, components, p_282191_, p_282446_, DefaultTooltipPositioner.INSTANCE, null);
|
||||
public void setComponentTooltipForNextFrame(Font p_406239_, List<Component> p_410275_, int p_410594_, int p_409343_) {
|
||||
- this.setComponentTooltipForNextFrame(p_406239_, p_410275_, p_410594_, p_409343_, null);
|
||||
+ List<ClientTooltipComponent> components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_410275_, p_410594_, guiWidth(), guiHeight(), p_406239_);
|
||||
+ this.setTooltipForNextFrameInternal(p_406239_, components, p_410594_, p_409343_, DefaultTooltipPositioner.INSTANCE, null, false);
|
||||
+ }
|
||||
+
|
||||
+ public void renderComponentTooltip(Font font, List<? extends net.minecraft.network.chat.FormattedText> tooltips, int mouseX, int mouseY, ItemStack stack) {
|
||||
+ this.tooltipStack = stack;
|
||||
+ List<ClientTooltipComponent> components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(stack, tooltips, mouseX, guiWidth(), guiHeight(), font);
|
||||
+ this.renderTooltipInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null);
|
||||
+ this.setTooltipForNextFrameInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null, false);
|
||||
+ this.tooltipStack = ItemStack.EMPTY;
|
||||
+ }
|
||||
+
|
||||
+ public void renderComponentTooltipFromElements(Font font, List<com.mojang.datafixers.util.Either<FormattedText, TooltipComponent>> elements, int mouseX, int mouseY, ItemStack stack) {
|
||||
+ this.tooltipStack = stack;
|
||||
+ List<ClientTooltipComponent> components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponentsFromElements(stack, elements, mouseX, guiWidth(), guiHeight(), font);
|
||||
+ this.renderTooltipInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null);
|
||||
+ this.setTooltipForNextFrameInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null, false);
|
||||
+ this.tooltipStack = ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
public void renderComponentTooltip(Font p_369090_, List<Component> p_365405_, int p_368143_, int p_366244_, @Nullable ResourceLocation p_364763_) {
|
||||
@@ -942,11 +_,13 @@
|
||||
@Nullable ResourceLocation p_368234_
|
||||
public void setComponentTooltipForNextFrame(Font p_408650_, List<Component> p_407512_, int p_406019_, int p_408123_, @Nullable ResourceLocation p_409993_) {
|
||||
@@ -989,11 +_,13 @@
|
||||
ClientTooltipPositioner p_409451_,
|
||||
@Nullable ResourceLocation p_409298_
|
||||
) {
|
||||
if (!p_282615_.isEmpty()) {
|
||||
+ var preEvent = net.minecraftforge.client.ForgeHooksClient.onRenderTooltipPre(this.tooltipStack, this, p_283230_, p_283417_, guiWidth(), guiHeight(), p_282615_, p_282675_, p_282442_);
|
||||
+ if (preEvent.isCanceled()) return;
|
||||
int i = 0;
|
||||
int j = p_282615_.size() == 1 ? -2 : 0;
|
||||
+ var preEvent = net.minecraftforge.client.ForgeHooksClient.onRenderTooltipPre(this.tooltipStack, this, p_283678_, p_281696_, guiWidth(), guiHeight(), p_282716_, p_283128_, p_409451_);
|
||||
+ if (preEvent == null) return;
|
||||
int i = 0;
|
||||
int j = p_282716_.size() == 1 ? -2 : 0;
|
||||
|
||||
for (ClientTooltipComponent clienttooltipcomponent : p_282615_) {
|
||||
- int k = clienttooltipcomponent.getWidth(p_282675_);
|
||||
+ int k = clienttooltipcomponent.getWidth(preEvent.getFont());
|
||||
if (k > i) {
|
||||
i = k;
|
||||
}
|
||||
@@ -956,18 +_,19 @@
|
||||
|
||||
int i2 = i;
|
||||
int j2 = j;
|
||||
- Vector2ic vector2ic = p_282442_.positionTooltip(this.guiWidth(), this.guiHeight(), p_283230_, p_283417_, i, j);
|
||||
+ Vector2ic vector2ic = p_282442_.positionTooltip(this.guiWidth(), this.guiHeight(), preEvent.getX(), preEvent.getY(), i2, j2);
|
||||
int l = vector2ic.x();
|
||||
int i1 = vector2ic.y();
|
||||
this.pose.pushPose();
|
||||
int j1 = 400;
|
||||
- TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, 400, p_368234_);
|
||||
+ var background_event = net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderTooltipBackground(this.tooltipStack, this, l, i1, preEvent.getFont(), p_282615_, p_368234_);
|
||||
+ TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, 400, background_event.getBackground());
|
||||
this.pose.translate(0.0F, 0.0F, 400.0F);
|
||||
int k1 = i1;
|
||||
|
||||
for (int l1 = 0; l1 < p_282615_.size(); l1++) {
|
||||
ClientTooltipComponent clienttooltipcomponent1 = p_282615_.get(l1);
|
||||
- clienttooltipcomponent1.renderText(p_282675_, l, k1, this.pose.last().pose(), this.bufferSource);
|
||||
+ clienttooltipcomponent1.renderText(preEvent.getFont(), l, k1, this.pose.last().pose(), this.bufferSource);
|
||||
k1 += clienttooltipcomponent1.getHeight(p_282675_) + (l1 == 0 ? 2 : 0);
|
||||
for (ClientTooltipComponent clienttooltipcomponent : p_282716_) {
|
||||
- int k = clienttooltipcomponent.getWidth(p_283128_);
|
||||
+ int k = clienttooltipcomponent.getWidth(preEvent.getFont());
|
||||
if (k > i) {
|
||||
i = k;
|
||||
}
|
||||
@@ -1003,16 +_,17 @@
|
||||
|
||||
@@ -975,7 +_,7 @@
|
||||
int l1 = i;
|
||||
int i2 = j;
|
||||
- Vector2ic vector2ic = p_409451_.positionTooltip(this.guiWidth(), this.guiHeight(), p_283678_, p_281696_, i, j);
|
||||
+ Vector2ic vector2ic = p_409451_.positionTooltip(this.guiWidth(), this.guiHeight(), preEvent.getX(), preEvent.getY(), i, j);
|
||||
int l = vector2ic.x();
|
||||
int i1 = vector2ic.y();
|
||||
this.pose.pushMatrix();
|
||||
- TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, p_409298_);
|
||||
+ var background_event = net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderTooltipBackground(this.tooltipStack, this, l, i1, preEvent.getFont(), p_282716_, p_409298_);
|
||||
+ TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, background_event.getBackground());
|
||||
int j1 = i1;
|
||||
|
||||
for (int k2 = 0; k2 < p_282615_.size(); k2++) {
|
||||
ClientTooltipComponent clienttooltipcomponent2 = p_282615_.get(k2);
|
||||
- clienttooltipcomponent2.renderImage(p_282675_, l, k1, i2, j2, this);
|
||||
+ clienttooltipcomponent2.renderImage(preEvent.getFont(), l, k1, i2, j2, this);
|
||||
k1 += clienttooltipcomponent2.getHeight(p_282675_) + (k2 == 0 ? 2 : 0);
|
||||
}
|
||||
|
||||
@@ -1030,6 +_,10 @@
|
||||
default:
|
||||
}
|
||||
for (int k1 = 0; k1 < p_282716_.size(); k1++) {
|
||||
ClientTooltipComponent clienttooltipcomponent1 = p_282716_.get(k1);
|
||||
- clienttooltipcomponent1.renderText(this, p_283128_, l, j1);
|
||||
+ clienttooltipcomponent1.renderText(this, preEvent.getFont(), l, j1);
|
||||
j1 += clienttooltipcomponent1.getHeight(p_283128_) + (k1 == 0 ? 2 : 0);
|
||||
}
|
||||
|
||||
@@ -1020,7 +_,7 @@
|
||||
|
||||
for (int j2 = 0; j2 < p_282716_.size(); j2++) {
|
||||
ClientTooltipComponent clienttooltipcomponent2 = p_282716_.get(j2);
|
||||
- clienttooltipcomponent2.renderImage(p_283128_, l, j1, l1, i2, this);
|
||||
+ clienttooltipcomponent2.renderImage(preEvent.getFont(), l, j1, l1, i2, this);
|
||||
j1 += clienttooltipcomponent2.getHeight(p_283128_) + (j2 == 0 ? 2 : 0);
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+ public MultiBufferSource.BufferSource getBufferSource() {
|
||||
+ return this.bufferSource;
|
||||
}
|
||||
|
||||
public void drawSpecial(Consumer<MultiBufferSource> p_367429_) {
|
||||
@@ -1,11 +1,11 @@
|
||||
--- a/net/minecraft/client/gui/components/AbstractButton.java
|
||||
+++ b/net/minecraft/client/gui/components/AbstractButton.java
|
||||
@@ -39,7 +_,7 @@
|
||||
@@ -38,7 +_,7 @@
|
||||
this.getHeight(),
|
||||
ARGB.white(this.alpha)
|
||||
);
|
||||
- int i = this.active ? 16777215 : 10526880;
|
||||
- int i = ARGB.color(this.alpha, this.active ? -1 : -6250336);
|
||||
+ int i = getFGColor();
|
||||
this.renderString(p_281670_, minecraft.font, i | Mth.ceil(this.alpha * 255.0F) << 24);
|
||||
this.renderString(p_281670_, minecraft.font, i);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/components/AbstractWidget.java
|
||||
+++ b/net/minecraft/client/gui/components/AbstractWidget.java
|
||||
@@ -250,6 +_,25 @@
|
||||
@@ -236,6 +_,25 @@
|
||||
this.focused = p_93693_;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
+
|
||||
+ public int getFGColor() {
|
||||
+ if (packedFGColor != UNSET_FG_COLOR) return packedFGColor;
|
||||
+ return this.active ? 16777215 : 10526880; // White : Light Grey
|
||||
+ return net.minecraft.util.ARGB.color(this.alpha, this.active ? -1 : -6250336); // White : Light Grey
|
||||
+ }
|
||||
+
|
||||
+ public void setFGColor(int color) {
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
--- a/net/minecraft/client/gui/components/BossHealthOverlay.java
|
||||
+++ b/net/minecraft/client/gui/components/BossHealthOverlay.java
|
||||
@@ -66,13 +_,16 @@
|
||||
@@ -67,13 +_,16 @@
|
||||
|
||||
for (LerpingBossEvent lerpingbossevent : this.events.values()) {
|
||||
int k = i / 2 - 91;
|
||||
+ var event = net.minecraftforge.client.ForgeHooksClient.onCustomizeBossEventProgress(p_283175_, this.minecraft.getWindow(), lerpingbossevent, k, j, 10 + this.minecraft.font.lineHeight);
|
||||
+ if (!event.isCanceled()) {
|
||||
+ if (event != null) {
|
||||
this.drawBar(p_283175_, k, j, lerpingbossevent);
|
||||
Component component = lerpingbossevent.getName();
|
||||
int l = this.minecraft.font.width(component);
|
||||
int i1 = i / 2 - l / 2;
|
||||
int j1 = j - 9;
|
||||
p_283175_.drawString(this.minecraft.font, component, i1, j1, 16777215);
|
||||
p_283175_.drawString(this.minecraft.font, component, i1, j1, -1);
|
||||
- j += 10 + 9;
|
||||
+ }
|
||||
+ j += event.getIncrement();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/components/DebugScreenOverlay.java
|
||||
+++ b/net/minecraft/client/gui/components/DebugScreenOverlay.java
|
||||
@@ -134,9 +_,9 @@
|
||||
@@ -139,9 +_,9 @@
|
||||
@Nullable
|
||||
private CompletableFuture<LevelChunk> serverChunk;
|
||||
private boolean renderDebug;
|
||||
@@ -13,7 +13,7 @@
|
||||
private final LocalSampleLogger frameTimeLogger = new LocalSampleLogger(1);
|
||||
private final LocalSampleLogger tickTimeLogger = new LocalSampleLogger(TpsDebugDimensions.values().length);
|
||||
private final LocalSampleLogger pingLogger = new LocalSampleLogger(1);
|
||||
@@ -179,14 +_,18 @@
|
||||
@@ -183,15 +_,19 @@
|
||||
this.clientChunk = null;
|
||||
}
|
||||
|
||||
@@ -29,13 +29,14 @@
|
||||
+ protected void drawText(ProfilerFiller profilerfiller, GuiGraphics p_281427_) {
|
||||
this.drawGameInformation(p_281427_);
|
||||
this.drawSystemInformation(p_281427_);
|
||||
p_281427_.nextStratum();
|
||||
+ }
|
||||
+
|
||||
+ protected void drawFPSCharts(ProfilerFiller profilerfiller, GuiGraphics p_281427_) {
|
||||
this.profilerPieChart.setBottomOffset(10);
|
||||
if (this.renderFpsCharts) {
|
||||
int i = p_281427_.guiWidth();
|
||||
@@ -199,7 +_,9 @@
|
||||
@@ -204,7 +_,9 @@
|
||||
|
||||
this.profilerPieChart.setBottomOffset(this.tpsChart.getFullHeight());
|
||||
}
|
||||
@@ -45,7 +46,7 @@
|
||||
if (this.renderNetworkCharts) {
|
||||
int l = p_281427_.guiWidth();
|
||||
int i1 = l / 2;
|
||||
@@ -215,12 +_,22 @@
|
||||
@@ -220,12 +_,22 @@
|
||||
try (Zone zone = profilerfiller.zone("profilerPie")) {
|
||||
this.profilerPieChart.render(p_281427_);
|
||||
}
|
||||
@@ -70,7 +71,7 @@
|
||||
list.add("");
|
||||
boolean flag = this.minecraft.getSingleplayerServer() != null;
|
||||
list.add(
|
||||
@@ -234,11 +_,18 @@
|
||||
@@ -239,11 +_,18 @@
|
||||
+ (this.renderNetworkCharts ? " visible" : " hidden")
|
||||
);
|
||||
list.add("For help: press F3 + Q");
|
||||
@@ -90,7 +91,7 @@
|
||||
this.renderLines(p_281261_, list, false);
|
||||
}
|
||||
|
||||
@@ -592,6 +_,7 @@
|
||||
@@ -597,6 +_,7 @@
|
||||
list.add("");
|
||||
list.add(ChatFormatting.UNDERLINE + "Targeted Entity");
|
||||
list.add(String.valueOf(BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType())));
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/components/toasts/ToastManager.java
|
||||
+++ b/net/minecraft/client/gui/components/toasts/ToastManager.java
|
||||
@@ -127,6 +_,7 @@
|
||||
@@ -146,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void addToast(Toast p_360768_) {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
@Override
|
||||
public void render(GuiGraphics p_281839_, int p_282704_, int p_283650_, float p_283394_) {
|
||||
int i = p_281839_.guiWidth();
|
||||
@@ -95,6 +_,7 @@
|
||||
@@ -97,6 +_,7 @@
|
||||
f2 = 1.0F;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
int l2 = (int)(p_281839_.guiWidth() * 0.5);
|
||||
int i1 = (int)(p_281839_.guiHeight() * 0.5);
|
||||
double d0 = Math.min(p_281839_.guiWidth() * 0.75, (double)p_281839_.guiHeight()) * 0.25;
|
||||
@@ -110,12 +_,14 @@
|
||||
@@ -112,12 +_,14 @@
|
||||
if (f < 1.0F) {
|
||||
this.drawProgressBar(p_281839_, i / 2 - k1, i2 - 5, i / 2 + k1, i2 + 5, 1.0F - Mth.clamp(f, 0.0F, 1.0F));
|
||||
}
|
||||
@@ -32,7 +32,7 @@
|
||||
try {
|
||||
this.reload.checkExceptions();
|
||||
this.onFinish.accept(Optional.empty());
|
||||
@@ -123,7 +_,6 @@
|
||||
@@ -125,7 +_,6 @@
|
||||
this.onFinish.accept(Optional.of(throwable));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
--- a/net/minecraft/client/gui/screens/PauseScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/PauseScreen.java
|
||||
@@ -95,6 +_,7 @@
|
||||
@@ -105,6 +_,7 @@
|
||||
} else {
|
||||
gridlayout$rowhelper.addChild(this.openScreenButton(PLAYER_REPORTING, () -> new SocialInteractionsScreen(this)));
|
||||
}
|
||||
+ gridlayout$rowhelper.addChild(Button.builder(Component.translatable("fml.menu.mods"), button -> this.minecraft.setScreen(new net.minecraftforge.client.gui.ModListScreen(this))).width(BUTTON_WIDTH_FULL).build(), 2);
|
||||
|
||||
Component component = this.minecraft.isLocalServer() ? RETURN_TO_MENU : CommonComponents.GUI_DISCONNECT;
|
||||
this.disconnectButton = gridlayout$rowhelper.addChild(Button.builder(component, p_280815_ -> {
|
||||
this.disconnectButton = gridlayout$rowhelper.addChild(Button.builder(CommonComponents.disconnectButtonLabel(this.minecraft.isLocalServer()), p_280815_ -> {
|
||||
p_280815_.active = false;
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/screens/Screen.java
|
||||
+++ b/net/minecraft/client/gui/screens/Screen.java
|
||||
@@ -197,7 +_,7 @@
|
||||
@@ -191,7 +_,7 @@
|
||||
}
|
||||
|
||||
public void onClose() {
|
||||
@@ -9,37 +9,37 @@
|
||||
}
|
||||
|
||||
protected <T extends GuiEventListener & Renderable & NarratableEntry> T addRenderableWidget(T p_169406_) {
|
||||
@@ -311,8 +_,10 @@
|
||||
@@ -339,8 +_,10 @@
|
||||
this.width = p_96608_;
|
||||
this.height = p_96609_;
|
||||
if (!this.initialized) {
|
||||
+ if (!net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget)))
|
||||
+ if (!net.minecraftforge.client.event.ScreenEvent.Init.Pre.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget)))
|
||||
this.init();
|
||||
this.setInitialFocus();
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget));
|
||||
+ net.minecraftforge.client.event.ScreenEvent.Init.Post.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget));
|
||||
} else {
|
||||
this.repositionElements();
|
||||
}
|
||||
@@ -325,8 +_,10 @@
|
||||
@@ -353,8 +_,10 @@
|
||||
protected void rebuildWidgets() {
|
||||
this.clearWidgets();
|
||||
this.clearFocus();
|
||||
+ if (!net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget)))
|
||||
+ if (!net.minecraftforge.client.event.ScreenEvent.Init.Pre.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget)))
|
||||
this.init();
|
||||
this.setInitialFocus();
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget));
|
||||
+ net.minecraftforge.client.event.ScreenEvent.Init.Post.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -353,6 +_,7 @@
|
||||
protected void fadeWidgets(float p_409453_) {
|
||||
@@ -389,6 +_,7 @@
|
||||
|
||||
this.renderBlurredBackground();
|
||||
this.renderBlurredBackground(p_283688_);
|
||||
this.renderMenuBackground(p_283688_);
|
||||
+ net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderScreenBackground(this, p_283688_);
|
||||
}
|
||||
|
||||
protected void renderBlurredBackground() {
|
||||
@@ -453,6 +_,19 @@
|
||||
protected void renderBlurredBackground(GuiGraphics p_407253_) {
|
||||
@@ -492,6 +_,19 @@
|
||||
}
|
||||
|
||||
public void onFilesDrop(List<Path> p_96591_) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/screens/TitleScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/TitleScreen.java
|
||||
@@ -58,6 +_,7 @@
|
||||
@@ -54,6 +_,7 @@
|
||||
private boolean fading;
|
||||
private long fadeInStart;
|
||||
private final LogoRenderer logoRenderer;
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
public TitleScreen() {
|
||||
this(false);
|
||||
@@ -111,11 +_,15 @@
|
||||
@@ -106,11 +_,15 @@
|
||||
int j = this.width - i - 2;
|
||||
int k = 24;
|
||||
int l = this.height / 4 + 48;
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
l = this.createTestWorldButton(l, 24);
|
||||
SpriteIconButton spriteiconbutton = this.addRenderableWidget(
|
||||
@@ -180,7 +_,7 @@
|
||||
@@ -175,7 +_,7 @@
|
||||
}).bounds(this.width / 2 - 100, i = p_96764_ + p_96765_, 200, 20).tooltip(tooltip).build()).active = flag;
|
||||
this.addRenderableWidget(
|
||||
Button.builder(Component.translatable("menu.online"), p_325369_ -> this.minecraft.setScreen(new RealmsMainScreen(this)))
|
||||
@@ -33,22 +33,22 @@
|
||||
.tooltip(tooltip)
|
||||
.build()
|
||||
)
|
||||
@@ -304,10 +_,18 @@
|
||||
s = s + I18n.get("menu.modded");
|
||||
}
|
||||
@@ -295,9 +_,18 @@
|
||||
s = s + I18n.get("menu.modded");
|
||||
}
|
||||
|
||||
- p_282860_.drawString(this.font, s, 2, this.height - 10, 16777215 | i);
|
||||
+ net.minecraftforge.internal.BrandingControl.forEachLine(true, true, (brd, brdline) ->
|
||||
+ p_282860_.drawString(this.font, brd, 2, this.height - ( 10 + brdline * (this.font.lineHeight + 1)), 16777215 | i)
|
||||
+ );
|
||||
- p_282860_.drawString(this.font, s, 2, this.height - 10, ARGB.color(f, -1));
|
||||
+ final float f_f = f;
|
||||
+ net.minecraftforge.internal.BrandingControl.forEachLine(true, true, (brd, brdline) ->
|
||||
+ p_282860_.drawString(this.font, brd, 2, this.height - ( 10 + brdline * (this.font.lineHeight + 1)), ARGB.color(f_f, -1))
|
||||
+ );
|
||||
+
|
||||
+ net.minecraftforge.internal.BrandingControl.forEachAboveCopyrightLine((brd, brdline) ->
|
||||
+ p_282860_.drawString(this.font, brd, this.width - font.width(brd), this.height - (10 + (brdline + 1) * ( this.font.lineHeight + 1)), 16777215 | i)
|
||||
+ );
|
||||
+ net.minecraftforge.internal.BrandingControl.forEachAboveCopyrightLine((brd, brdline) ->
|
||||
+ p_282860_.drawString(this.font, brd, this.width - font.width(brd), this.height - (10 + (brdline + 1) * ( this.font.lineHeight + 1)), ARGB.color(f_f, -1))
|
||||
+ );
|
||||
+
|
||||
if (this.realmsNotificationsEnabled() && f >= 1.0F) {
|
||||
this.realmsNotificationsScreen.render(p_282860_, p_281753_, p_283539_, p_282628_);
|
||||
}
|
||||
if (this.realmsNotificationsEnabled() && f >= 1.0F) {
|
||||
this.realmsNotificationsScreen.render(p_282860_, p_281753_, p_283539_, p_282628_);
|
||||
+ if (f >= 1.0f) this.modUpdateNotification.render(p_282860_, p_281753_, p_283539_, p_282628_);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
public AdvancementTabType getType() {
|
||||
return this.type;
|
||||
}
|
||||
@@ -148,8 +_,8 @@
|
||||
@@ -145,8 +_,8 @@
|
||||
return null;
|
||||
} else {
|
||||
for (AdvancementTabType advancementtabtype : AdvancementTabType.values()) {
|
||||
|
||||
+4
-4
@@ -37,8 +37,8 @@
|
||||
this.advancements.setSelectedTab(advancementtab.getRootNode().holder(), true);
|
||||
break;
|
||||
}
|
||||
@@ -181,10 +_,12 @@
|
||||
p_283395_.blit(RenderType::guiTextured, WINDOW_LOCATION, p_281890_, p_282532_, 0.0F, 0.0F, 252, 140, 256, 256);
|
||||
@@ -183,10 +_,12 @@
|
||||
p_283395_.blit(RenderPipelines.GUI_TEXTURED, WINDOW_LOCATION, p_281890_, p_282532_, 0.0F, 0.0F, 252, 140, 256, 256);
|
||||
if (this.tabs.size() > 1) {
|
||||
for (AdvancementTab advancementtab : this.tabs.values()) {
|
||||
+ if (advancementtab.getPage() == tabPage)
|
||||
@@ -50,11 +50,11 @@
|
||||
advancementtab1.drawIcon(p_283395_, p_281890_, p_282532_);
|
||||
}
|
||||
}
|
||||
@@ -202,6 +_,7 @@
|
||||
@@ -205,6 +_,7 @@
|
||||
|
||||
if (this.tabs.size() > 1) {
|
||||
for (AdvancementTab advancementtab : this.tabs.values()) {
|
||||
+ if (advancementtab.getPage() == tabPage)
|
||||
if (advancementtab.isMouseOver(p_281519_, p_283371_, p_283556_, p_282458_)) {
|
||||
p_282784_.renderTooltip(this.font, advancementtab.getTitle(), p_283556_, p_282458_);
|
||||
p_282784_.setTooltipForNextFrame(this.font, advancementtab.getTitle(), p_283556_, p_282458_);
|
||||
}
|
||||
+27
-25
@@ -1,42 +1,42 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java
|
||||
@@ -106,6 +_,7 @@
|
||||
@@ -107,6 +_,7 @@
|
||||
int i = this.leftPos;
|
||||
int j = this.topPos;
|
||||
super.render(p_283479_, p_283661_, p_281248_, p_281886_);
|
||||
+ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderBackground(this, p_283479_, p_283661_, p_281248_);
|
||||
p_283479_.pose().pushPose();
|
||||
p_283479_.pose().translate(i, j, 0.0F);
|
||||
Slot slot = this.hoveredSlot;
|
||||
@@ -117,6 +_,8 @@
|
||||
super.render(p_409971_, p_409213_, p_408205_, p_408282_);
|
||||
+ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderBackground(this, p_409971_, p_409213_, p_408205_);
|
||||
p_409971_.pose().pushMatrix();
|
||||
p_409971_.pose().translate(i, j);
|
||||
this.renderLabels(p_409971_, p_409213_, p_408205_);
|
||||
@@ -119,6 +_,8 @@
|
||||
this.onStopHovering(slot);
|
||||
}
|
||||
|
||||
+ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderForeground(this, p_283479_, p_283661_, p_281248_);
|
||||
+ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderForeground(this, p_409971_, p_409213_, p_408205_);
|
||||
+
|
||||
this.renderLabels(p_283479_, p_283661_, p_281248_);
|
||||
ItemStack itemstack = this.draggingItem.isEmpty() ? this.menu.getCarried() : this.draggingItem;
|
||||
if (!itemstack.isEmpty()) {
|
||||
@@ -197,7 +_,7 @@
|
||||
p_409971_.pose().popMatrix();
|
||||
}
|
||||
|
||||
@@ -202,7 +_,7 @@
|
||||
ItemStack itemstack = this.hoveredSlot.getItem();
|
||||
if (this.menu.getCarried().isEmpty() || this.showTooltipWithItemInHand(itemstack)) {
|
||||
p_283594_.renderTooltip(
|
||||
p_283594_.setTooltipForNextFrame(
|
||||
- this.font, this.getTooltipFromContainerItem(itemstack), itemstack.getTooltipImage(), p_282171_, p_281909_, itemstack.get(DataComponents.TOOLTIP_STYLE)
|
||||
+ this.font, this.getTooltipFromContainerItem(itemstack), itemstack.getTooltipImage(), itemstack, p_282171_, p_281909_
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -215,7 +_,8 @@
|
||||
p_282567_.pose().pushPose();
|
||||
p_282567_.pose().translate(0.0F, 0.0F, 232.0F);
|
||||
@@ -218,7 +_,8 @@
|
||||
|
||||
private void renderFloatingItem(GuiGraphics p_282567_, ItemStack p_281330_, int p_281772_, int p_281689_, @Nullable String p_282568_) {
|
||||
p_282567_.renderItem(p_281330_, p_281772_, p_281689_);
|
||||
- p_282567_.renderItemDecorations(this.font, p_281330_, p_281772_, p_281689_ - (this.draggingItem.isEmpty() ? 0 : 8), p_282568_);
|
||||
+ var font = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(p_281330_).getFont(p_281330_, net.minecraftforge.client.extensions.common.IClientItemExtensions.FontContext.ITEM_COUNT);
|
||||
+ p_282567_.renderItemDecorations(font == null ? this.font : font, p_281330_, p_281772_, p_281689_ - (this.draggingItem.isEmpty() ? 0 : 8), p_282568_);
|
||||
p_282567_.pose().popPose();
|
||||
}
|
||||
|
||||
@@ -321,7 +_,8 @@
|
||||
protected void renderLabels(GuiGraphics p_281635_, int p_282681_, int p_283686_) {
|
||||
@@ -319,7 +_,8 @@
|
||||
if (super.mouseClicked(p_97748_, p_97749_, p_97750_)) {
|
||||
return true;
|
||||
} else {
|
||||
@@ -46,7 +46,7 @@
|
||||
Slot slot = this.getHoveredSlot(p_97748_, p_97749_);
|
||||
long i = Util.getMillis();
|
||||
this.doubleclick = this.lastClickSlot == slot && i - this.lastClickTime < 250L && this.lastClickButton == p_97750_;
|
||||
@@ -332,6 +_,7 @@
|
||||
@@ -330,6 +_,7 @@
|
||||
int j = this.leftPos;
|
||||
int k = this.topPos;
|
||||
boolean flag1 = this.hasClickedOutside(p_97748_, p_97749_, j, k, p_97750_);
|
||||
@@ -54,7 +54,7 @@
|
||||
int l = -1;
|
||||
if (slot != null) {
|
||||
l = slot.index;
|
||||
@@ -357,7 +_,7 @@
|
||||
@@ -355,7 +_,7 @@
|
||||
}
|
||||
} else if (!this.isQuickCrafting) {
|
||||
if (this.menu.getCarried().isEmpty()) {
|
||||
@@ -63,7 +63,7 @@
|
||||
this.slotClicked(slot, l, p_97750_, ClickType.CLONE);
|
||||
} else {
|
||||
boolean flag2 = l != -999
|
||||
@@ -385,7 +_,7 @@
|
||||
@@ -383,7 +_,7 @@
|
||||
this.quickCraftingType = 0;
|
||||
} else if (p_97750_ == 1) {
|
||||
this.quickCraftingType = 1;
|
||||
@@ -72,7 +72,7 @@
|
||||
this.quickCraftingType = 2;
|
||||
}
|
||||
}
|
||||
@@ -461,10 +_,13 @@
|
||||
@@ -459,10 +_,13 @@
|
||||
|
||||
@Override
|
||||
public boolean mouseReleased(double p_97812_, double p_97813_, int p_97814_) {
|
||||
@@ -86,7 +86,7 @@
|
||||
int k = -1;
|
||||
if (slot != null) {
|
||||
k = slot.index;
|
||||
@@ -481,7 +_,7 @@
|
||||
@@ -479,7 +_,7 @@
|
||||
if (slot2 != null
|
||||
&& slot2.mayPickup(this.minecraft.player)
|
||||
&& slot2.hasItem()
|
||||
@@ -116,7 +116,7 @@
|
||||
this.onClose();
|
||||
return true;
|
||||
} else {
|
||||
@@ -698,4 +_,11 @@
|
||||
@@ -698,6 +_,13 @@
|
||||
|
||||
super.onClose();
|
||||
}
|
||||
@@ -127,4 +127,6 @@
|
||||
+ public int getGuiTop() { return topPos; }
|
||||
+ public int getXSize() { return imageWidth; }
|
||||
+ public int getYSize() { return imageHeight; }
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
record SnapbackData(ItemStack item, Vector2i start, Vector2i end, long time) {
|
||||
+22
-31
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java
|
||||
@@ -114,6 +_,8 @@
|
||||
@@ -113,6 +_,8 @@
|
||||
private final Set<TagKey<Item>> visibleTags = new HashSet<>();
|
||||
private final boolean displayOperatorCreativeTab;
|
||||
private final EffectsInInventory effects;
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
public CreativeModeInventoryScreen(LocalPlayer p_344408_, FeatureFlagSet p_260074_, boolean p_259569_) {
|
||||
super(new CreativeModeInventoryScreen.ItemPickerMenu(p_344408_), p_344408_.getInventory(), CommonComponents.EMPTY);
|
||||
@@ -162,7 +_,7 @@
|
||||
@@ -161,7 +_,7 @@
|
||||
private void refreshCurrentTabContents(Collection<ItemStack> p_261591_) {
|
||||
int i = this.menu.getRowIndexForScroll(this.scrollOffs);
|
||||
this.menu.items.clear();
|
||||
@@ -18,7 +18,7 @@
|
||||
this.refreshSearchResults();
|
||||
} else {
|
||||
this.menu.items.addAll(p_261591_);
|
||||
@@ -330,6 +_,35 @@
|
||||
@@ -329,6 +_,35 @@
|
||||
protected void init() {
|
||||
if (this.minecraft.player.hasInfiniteMaterials()) {
|
||||
super.init();
|
||||
@@ -54,7 +54,7 @@
|
||||
this.searchBox = new EditBox(this.font, this.leftPos + 82, this.topPos + 6, 80, 9, Component.translatable("itemGroup.search"));
|
||||
this.searchBox.setMaxLength(50);
|
||||
this.searchBox.setBordered(false);
|
||||
@@ -376,7 +_,7 @@
|
||||
@@ -375,7 +_,7 @@
|
||||
public boolean charTyped(char p_98521_, int p_98522_) {
|
||||
if (this.ignoreTextInput) {
|
||||
return false;
|
||||
@@ -63,7 +63,7 @@
|
||||
return false;
|
||||
} else {
|
||||
String s = this.searchBox.getValue();
|
||||
@@ -395,7 +_,7 @@
|
||||
@@ -394,7 +_,7 @@
|
||||
@Override
|
||||
public boolean keyPressed(int p_98547_, int p_98548_, int p_98549_) {
|
||||
this.ignoreTextInput = false;
|
||||
@@ -72,7 +72,7 @@
|
||||
if (this.minecraft.options.keyChat.matches(p_98547_, p_98548_)) {
|
||||
this.ignoreTextInput = true;
|
||||
this.selectTab(CreativeModeTabs.searchTab());
|
||||
@@ -431,6 +_,7 @@
|
||||
@@ -430,6 +_,7 @@
|
||||
}
|
||||
|
||||
private void refreshSearchResults() {
|
||||
@@ -80,7 +80,7 @@
|
||||
this.menu.items.clear();
|
||||
this.visibleTags.clear();
|
||||
String s = this.searchBox.getValue();
|
||||
@@ -443,10 +_,10 @@
|
||||
@@ -442,10 +_,10 @@
|
||||
SearchTree<ItemStack> searchtree;
|
||||
if (s.startsWith("#")) {
|
||||
s = s.substring(1);
|
||||
@@ -93,17 +93,17 @@
|
||||
}
|
||||
|
||||
this.menu.items.addAll(searchtree.search(s.toLowerCase(Locale.ROOT)));
|
||||
@@ -478,7 +_,8 @@
|
||||
@@ -477,7 +_,8 @@
|
||||
@Override
|
||||
protected void renderLabels(GuiGraphics p_283168_, int p_281774_, int p_281466_) {
|
||||
if (selectedTab.showTitle()) {
|
||||
- p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, 4210752, false);
|
||||
- p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, -12566464, false);
|
||||
+ com.mojang.blaze3d.opengl.GlStateManager._disableBlend();
|
||||
+ p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, selectedTab.getLabelColor(), false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -488,7 +_,7 @@
|
||||
@@ -487,7 +_,7 @@
|
||||
double d0 = p_98531_ - this.leftPos;
|
||||
double d1 = p_98532_ - this.topPos;
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
if (this.checkTabClicked(creativemodetab, d0, d1)) {
|
||||
return true;
|
||||
}
|
||||
@@ -510,7 +_,7 @@
|
||||
@@ -509,7 +_,7 @@
|
||||
double d1 = p_98623_ - this.topPos;
|
||||
this.scrolling = false;
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
if (this.checkTabClicked(creativemodetab, d0, d1)) {
|
||||
this.selectTab(creativemodetab);
|
||||
return true;
|
||||
@@ -604,13 +_,15 @@
|
||||
@@ -603,13 +_,15 @@
|
||||
this.originalSlots = null;
|
||||
}
|
||||
|
||||
@@ -138,31 +138,22 @@
|
||||
|
||||
this.refreshSearchResults();
|
||||
} else {
|
||||
@@ -673,7 +_,15 @@
|
||||
@@ -673,7 +_,14 @@
|
||||
super.render(p_283000_, p_281317_, p_282770_, p_281295_);
|
||||
this.effects.render(p_283000_, p_281317_, p_282770_, p_281295_);
|
||||
this.effects.renderTooltip(p_283000_, p_281317_, p_282770_);
|
||||
|
||||
- for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) {
|
||||
+ if (this.pages.size() != 1) {
|
||||
+ Component page = Component.literal(String.format("%d / %d", this.pages.indexOf(this.currentPage) + 1, this.pages.size()));
|
||||
+ p_283000_.pose().pushPose();
|
||||
+ p_283000_.pose().translate(0F, 0F, 300F);
|
||||
+ p_283000_.pose().pushMatrix();
|
||||
+ p_283000_.drawString(font, page.getVisualOrderText(), leftPos + (imageWidth / 2) - (font.width(page) / 2), topPos - 44, -1);
|
||||
+ p_283000_.pose().popPose();
|
||||
+ p_283000_.pose().popMatrix();
|
||||
+ }
|
||||
+
|
||||
+ for (CreativeModeTab creativemodetab : currentPage.getVisibleTabs()) {
|
||||
if (this.checkTabHovering(p_283000_, creativemodetab, p_281317_, p_282770_)) {
|
||||
break;
|
||||
}
|
||||
@@ -685,6 +_,7 @@
|
||||
p_283000_.renderTooltip(this.font, TRASH_SLOT_TOOLTIP, p_281317_, p_282770_);
|
||||
}
|
||||
|
||||
+ com.mojang.blaze3d.systems.RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
this.renderTooltip(p_283000_, p_281317_, p_282770_);
|
||||
}
|
||||
|
||||
@@ -697,7 +_,7 @@
|
||||
public List<Component> getTooltipFromContainerItem(ItemStack p_281769_) {
|
||||
boolean flag = this.hoveredSlot != null && this.hoveredSlot instanceof CreativeModeInventoryScreen.CustomCreativeSlot;
|
||||
@@ -191,7 +182,7 @@
|
||||
this.renderTabButton(p_282663_, creativemodetab);
|
||||
}
|
||||
@@ -745,6 +_,7 @@
|
||||
p_282663_.blitSprite(RenderType::guiTextured, resourcelocation, j, k + (int)((i - k - 17) * this.scrollOffs), 12, 15);
|
||||
p_282663_.blitSprite(RenderPipelines.GUI_TEXTURED, resourcelocation, j, k + (int)((i - k - 17) * this.scrollOffs), 12, 15);
|
||||
}
|
||||
|
||||
+ if (currentPage.getVisibleTabs().contains(selectedTab)) //Forge: only display tab selection when the selected tab is on the current page
|
||||
@@ -232,10 +223,10 @@
|
||||
}
|
||||
|
||||
+ com.mojang.blaze3d.opengl.GlStateManager._enableBlend(); //Forge: Make sure blend is enabled else tabs show a white border.
|
||||
p_283590_.blitSprite(RenderType::guiTextured, aresourcelocation[Mth.clamp(i, 0, aresourcelocation.length)], j, k, 26, 32);
|
||||
p_283590_.pose().pushPose();
|
||||
p_283590_.pose().translate(0.0F, 0.0F, 100.0F);
|
||||
@@ -855,6 +_,14 @@
|
||||
p_283590_.blitSprite(RenderPipelines.GUI_TEXTURED, aresourcelocation[Mth.clamp(i, 0, aresourcelocation.length)], j, k, 26, 32);
|
||||
int l = j + 13 - 8;
|
||||
int i1 = k + 16 - 8 + (flag1 ? 1 : -1);
|
||||
@@ -850,6 +_,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,7 +241,7 @@
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
static class CustomCreativeSlot extends Slot {
|
||||
public CustomCreativeSlot(Container p_98633_, int p_98634_, int p_98635_, int p_98636_) {
|
||||
@@ -1036,6 +_,22 @@
|
||||
@@ -1031,6 +_,22 @@
|
||||
@Override
|
||||
public boolean mayPickup(Player p_98665_) {
|
||||
return this.target.mayPickup(p_98665_);
|
||||
|
||||
+8
-8
@@ -1,11 +1,11 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java
|
||||
@@ -48,12 +_,16 @@
|
||||
@@ -47,12 +_,16 @@
|
||||
Collection<MobEffectInstance> collection = this.minecraft.player.getActiveEffects();
|
||||
if (!collection.isEmpty() && j >= 32) {
|
||||
boolean flag = j >= 120;
|
||||
+ var event = net.minecraftforge.client.event.ForgeEventFactoryClient.onScreenEffectSize(this.screen, j, !flag, i);
|
||||
+ if (event.isCanceled()) return;
|
||||
+ if (event == null) return;
|
||||
+ flag = !event.isCompact();
|
||||
+ i = event.getHorizontalOffset();
|
||||
int k = 33;
|
||||
@@ -18,7 +18,7 @@
|
||||
this.renderBackgrounds(p_362146_, i, k, iterable, flag);
|
||||
this.renderIcons(p_362146_, i, k, iterable, flag);
|
||||
if (flag) {
|
||||
@@ -99,6 +_,11 @@
|
||||
@@ -98,6 +_,11 @@
|
||||
int i = this.screen.topPos;
|
||||
|
||||
for (MobEffectInstance mobeffectinstance : p_361981_) {
|
||||
@@ -28,9 +28,9 @@
|
||||
+ continue;
|
||||
+ }
|
||||
Holder<MobEffect> holder = mobeffectinstance.getEffect();
|
||||
TextureAtlasSprite textureatlassprite = mobeffecttexturemanager.get(holder);
|
||||
p_367085_.blitSprite(RenderType::guiTextured, textureatlassprite, p_367644_ + (p_368681_ ? 6 : 7), i + 7, 18, 18);
|
||||
@@ -110,6 +_,11 @@
|
||||
ResourceLocation resourcelocation = Gui.getMobEffectSprite(holder);
|
||||
p_367085_.blitSprite(RenderPipelines.GUI_TEXTURED, resourcelocation, p_367644_ + (p_368681_ ? 6 : 7), i + 7, 18, 18);
|
||||
@@ -109,6 +_,11 @@
|
||||
int i = this.screen.topPos;
|
||||
|
||||
for (MobEffectInstance mobeffectinstance : p_365480_) {
|
||||
@@ -40,9 +40,9 @@
|
||||
+ continue;
|
||||
+ }
|
||||
Component component = this.getEffectName(mobeffectinstance);
|
||||
p_361851_.drawString(this.screen.getFont(), component, p_367468_ + 10 + 18, i + 6, 16777215);
|
||||
p_361851_.drawString(this.screen.getFont(), component, p_367468_ + 10 + 18, i + 6, -1);
|
||||
Component component1 = MobEffectUtil.formatDuration(mobeffectinstance, 1.0F, this.minecraft.level.tickRateManager().tickrate());
|
||||
@@ -125,5 +_,9 @@
|
||||
@@ -124,5 +_,9 @@
|
||||
}
|
||||
|
||||
return mutablecomponent;
|
||||
|
||||
+6
-6
@@ -1,15 +1,15 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java
|
||||
@@ -109,7 +_,7 @@
|
||||
@@ -106,7 +_,7 @@
|
||||
int l1 = 86 - this.font.width(s);
|
||||
FormattedText formattedtext = EnchantmentNames.getInstance().getRandomName(this.font, l1);
|
||||
int i2 = 6839882;
|
||||
int i2 = -9937334;
|
||||
- if ((k < l + 1 || this.minecraft.player.experienceLevel < k1) && !this.minecraft.player.hasInfiniteMaterials()) {
|
||||
+ if (((k < l + 1 || this.minecraft.player.experienceLevel < k1) && !this.minecraft.player.hasInfiniteMaterials()) || this.menu.enchantClue[l] == -1) { // Forge: render buttons as disabled when enchantable but enchantability not met on lower levels{
|
||||
p_282430_.blitSprite(RenderType::guiTextured, ENCHANTMENT_SLOT_DISABLED_SPRITE, i1, j + 14 + 19 * l, 108, 19);
|
||||
p_282430_.blitSprite(RenderType::guiTextured, DISABLED_LEVEL_SPRITES[l], i1 + 1, j + 15 + 19 * l, 16, 16);
|
||||
p_282430_.drawWordWrap(this.font, formattedtext, j1, j + 16 + 19 * l, l1, (i2 & 16711422) >> 1, false);
|
||||
@@ -175,13 +_,16 @@
|
||||
p_282430_.blitSprite(RenderPipelines.GUI_TEXTURED, ENCHANTMENT_SLOT_DISABLED_SPRITE, i1, j + 14 + 19 * l, 108, 19);
|
||||
p_282430_.blitSprite(RenderPipelines.GUI_TEXTURED, DISABLED_LEVEL_SPRITES[l], i1 + 1, j + 15 + 19 * l, 16, 16);
|
||||
p_282430_.drawWordWrap(this.font, formattedtext, j1, j + 16 + 19 * l, l1, ARGB.opaque((i2 & 16711422) >> 1), false);
|
||||
@@ -157,13 +_,16 @@
|
||||
.registryAccess()
|
||||
.lookupOrThrow(Registries.ENCHANTMENT)
|
||||
.get(this.menu.enchantClue[j]);
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java
|
||||
@@ -16,7 +_,7 @@
|
||||
@@ -15,7 +_,7 @@
|
||||
private static final Vector3f TEXT_SCALE = new Vector3f(1.0F, 1.0F, 1.0F);
|
||||
private static final int TEXTURE_WIDTH = 16;
|
||||
private static final int TEXTURE_HEIGHT = 16;
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/MerchantScreen.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/MerchantScreen.java
|
||||
@@ -232,6 +_,14 @@
|
||||
@@ -229,6 +_,14 @@
|
||||
} else {
|
||||
p_281357_.renderItemDecorations(this.font, p_282046_, p_282403_, p_283601_, p_282046_.getCount() == 1 ? "1" : null);
|
||||
p_281357_.renderItemDecorations(this.font, p_283466_, p_282403_ + 14, p_283601_, p_283466_.getCount() == 1 ? "1" : null);
|
||||
@@ -12,6 +12,6 @@
|
||||
+ font.drawInBatch(count, (float) (p_282403_ + 14) + 19 - 2 - font.width(count), (float)p_283601_ + 6 + 3, 0xFFFFFF, true, p_281357_.pose().last().pose(), p_281357_.bufferSource(), net.minecraft.client.gui.Font.DisplayMode.NORMAL, 0, 15728880, false);
|
||||
+ p_281357_.pose().popPose();
|
||||
+ */
|
||||
p_281357_.pose().pushPose();
|
||||
p_281357_.pose().translate(0.0F, 0.0F, 300.0F);
|
||||
p_281357_.blitSprite(RenderType::guiTextured, DISCOUNT_STRIKETHRUOGH_SPRITE, p_282403_ + 7, p_283601_ + 12, 9, 2);
|
||||
p_281357_.blitSprite(RenderPipelines.GUI_TEXTURED, DISCOUNT_STRIKETHRUOGH_SPRITE, p_282403_ + 7, p_283601_ + 12, 9, 2);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java
|
||||
+++ b/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java
|
||||
@@ -22,7 +_,7 @@
|
||||
@@ -20,7 +_,7 @@
|
||||
case ClientActivePlayersTooltip.ActivePlayersTooltip clientactiveplayerstooltip$activeplayerstooltip -> new ClientActivePlayersTooltip(
|
||||
clientactiveplayerstooltip$activeplayerstooltip
|
||||
);
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
--- a/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java
|
||||
+++ b/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java
|
||||
@@ -371,6 +_,8 @@
|
||||
this.screen.setTooltipForNextRenderPass(Lists.transform(this.onlinePlayersTooltip, Component::getVisualOrderText));
|
||||
p_281406_.setTooltipForNextFrame(Lists.transform(this.onlinePlayersTooltip, Component::getVisualOrderText), p_283567_, p_282864_);
|
||||
}
|
||||
|
||||
+ net.minecraftforge.client.ForgeHooksClient.drawForgePingInfo(this.screen, serverData, p_281406_, p_281363_, p_282921_, p_283596_, p_283567_ - p_281363_, p_282864_ - p_282921_);
|
||||
|
||||
+2
-2
@@ -6,6 +6,6 @@
|
||||
p_100014_.setSelected(null);
|
||||
- p_100015_.forEach(
|
||||
+ p_100015_.filter(PackSelectionModel.Entry::notHidden).forEach(
|
||||
p_389318_ -> {
|
||||
p_404866_ -> {
|
||||
TransferableSelectionList.PackEntry transferableselectionlist$packentry1 = new TransferableSelectionList.PackEntry(
|
||||
this.minecraft, p_100014_, p_389318_
|
||||
this.minecraft, p_100014_, p_404866_
|
||||
+5
-5
@@ -11,13 +11,13 @@
|
||||
@@ -400,6 +_,7 @@
|
||||
p_281612_.drawString(this.minecraft.font, s1, p_282820_ + 32 + 3, p_283181_ + 9 + 3, -8355712);
|
||||
p_281612_.drawString(this.minecraft.font, component, p_282820_ + 32 + 3, p_283181_ + 9 + 9 + 3, -8355712);
|
||||
p_281612_.blit(RenderType::guiTextured, this.icon.textureLocation(), p_282820_, p_283181_, 0.0F, 0.0F, 32, 32, 32, 32);
|
||||
p_281612_.blit(RenderPipelines.GUI_TEXTURED, this.icon.textureLocation(), p_282820_, p_283181_, 0.0F, 0.0F, 32, 32, 32, 32);
|
||||
+ renderExperimentalWarning(p_281612_, p_283204_, p_283025_, p_283181_, p_282820_);
|
||||
if (this.minecraft.options.touchscreen().get() || p_283396_) {
|
||||
p_281612_.fill(p_282820_, p_283181_, p_282820_ + 32, p_283181_ + 32, -1601138544);
|
||||
int j = p_283204_ - p_282820_;
|
||||
@@ -446,6 +_,19 @@
|
||||
p_281612_.blitSprite(RenderType::guiTextured, resourcelocation, p_282820_, p_283181_, 32, 32);
|
||||
@@ -450,6 +_,19 @@
|
||||
p_281612_.blitSprite(RenderPipelines.GUI_TEXTURED, resourcelocation, p_282820_, p_283181_, 32, 32);
|
||||
}
|
||||
}
|
||||
+ }
|
||||
@@ -26,11 +26,11 @@
|
||||
+ private void renderExperimentalWarning(GuiGraphics guiGraphics, int mouseX, int mouseY, int top, int left) {
|
||||
+ if (this.summary.isLifecycleExperimental()) {
|
||||
+ int leftStart = left + WorldSelectionList.this.getRowWidth();
|
||||
+ guiGraphics.blit(RenderType::guiTextured, WorldSelectionList.FORGE_EXPERIMENTAL_WARNING_ICON, leftStart - 36, top, 0.0F, 0.0F, 32, 32, 32, 32);
|
||||
+ guiGraphics.blit(RenderPipelines.GUI_TEXTURED, WorldSelectionList.FORGE_EXPERIMENTAL_WARNING_ICON, leftStart - 36, top, 0.0F, 0.0F, 32, 32, 32, 32);
|
||||
+ if (WorldSelectionList.this.getEntryAtPosition(mouseX, mouseY) == this && mouseX > leftStart - 36 && mouseX < leftStart) {
|
||||
+ var font = Minecraft.getInstance().font;
|
||||
+ List<net.minecraft.util.FormattedCharSequence> tooltip = font.split(Component.translatable("forge.experimentalsettings.tooltip"), 200);
|
||||
+ guiGraphics.renderTooltip(font, tooltip, mouseX, mouseY);
|
||||
+ guiGraphics.setTooltipForNextFrame(font, tooltip, mouseX, mouseY);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/main/Main.java
|
||||
+++ b/net/minecraft/client/main/Main.java
|
||||
@@ -121,8 +_,8 @@
|
||||
@@ -123,8 +_,8 @@
|
||||
CrashReport.preload();
|
||||
logger = LogUtils.getLogger();
|
||||
s1 = "Bootstrap";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/model/geom/LayerDefinitions.java
|
||||
+++ b/net/minecraft/client/model/geom/LayerDefinitions.java
|
||||
@@ -497,6 +_,7 @@
|
||||
@@ -505,6 +_,7 @@
|
||||
builder.put(ModelLayers.createHangingSignModelName(p_374591_, hangingsignrenderer$attachmenttype), layerdefinition60);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/model/geom/ModelLayers.java
|
||||
+++ b/net/minecraft/client/model/geom/ModelLayers.java
|
||||
@@ -330,15 +_,18 @@
|
||||
@@ -336,15 +_,18 @@
|
||||
}
|
||||
|
||||
public static ModelLayerLocation createStandingSignModelName(WoodType p_171292_) {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
int i = this.storage.getIndex(p_298665_.x, p_298665_.z);
|
||||
LevelChunk levelchunk = this.storage.getChunk(i);
|
||||
if (isValidChunk(levelchunk, p_298665_.x, p_298665_.z)) {
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.level.ChunkEvent.Unload(levelchunk));
|
||||
+ net.minecraftforge.event.level.ChunkEvent.Unload.BUS.post(new net.minecraftforge.event.level.ChunkEvent.Unload(levelchunk));
|
||||
this.storage.drop(i, levelchunk);
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
|
||||
this.level.onChunkLoaded(chunkpos);
|
||||
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.level.ChunkEvent.Load(levelchunk, false));
|
||||
+ net.minecraftforge.event.level.ChunkEvent.Load.BUS.post(new net.minecraftforge.event.level.ChunkEvent.Load(levelchunk, false));
|
||||
return levelchunk;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java
|
||||
+++ b/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java
|
||||
@@ -142,6 +_,7 @@
|
||||
@@ -153,6 +_,7 @@
|
||||
|
||||
@Override
|
||||
public void handleCustomPayload(ClientboundCustomPayloadPacket p_298103_) {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java
|
||||
+++ b/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java
|
||||
@@ -147,6 +_,7 @@
|
||||
@@ -157,6 +_,7 @@
|
||||
return true;
|
||||
}
|
||||
}));
|
||||
|
||||
+3
-3
@@ -1,14 +1,14 @@
|
||||
--- a/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java
|
||||
+++ b/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java
|
||||
@@ -209,6 +_,7 @@
|
||||
@@ -208,6 +_,7 @@
|
||||
Component component = this.wasTransferredTo ? CommonComponents.TRANSFER_CONNECT_FAILED : CommonComponents.CONNECT_FAILED;
|
||||
if (this.serverData != null && this.serverData.isRealm()) {
|
||||
this.minecraft.setScreen(new DisconnectedRealmsScreen(this.parent, component, p_342266_.reason()));
|
||||
this.minecraft.setScreen(new DisconnectedScreen(this.parent, component, p_342266_.reason(), CommonComponents.GUI_BACK));
|
||||
+ } else if (net.minecraftforge.client.ForgeHooksClient.onClientDisconnect(this.connection, this.minecraft, this.parent, p_342266_.reason())) {
|
||||
} else {
|
||||
this.minecraft.setScreen(new DisconnectedScreen(this.parent, component, p_342266_));
|
||||
}
|
||||
@@ -233,6 +_,7 @@
|
||||
@@ -232,6 +_,7 @@
|
||||
|
||||
@Override
|
||||
public void handleCustomQuery(ClientboundCustomQueryPacket p_104545_) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/multiplayer/ClientLevel.java
|
||||
+++ b/net/minecraft/client/multiplayer/ClientLevel.java
|
||||
@@ -126,6 +_,7 @@
|
||||
@@ -130,6 +_,7 @@
|
||||
p_389331_.put(BiomeColors.FOLIAGE_COLOR_RESOLVER, new BlockTintCache(p_194177_ -> this.calculateBlockTint(p_194177_, BiomeColors.FOLIAGE_COLOR_RESOLVER)));
|
||||
p_389331_.put(BiomeColors.DRY_FOLIAGE_COLOR_RESOLVER, new BlockTintCache(p_389335_ -> this.calculateBlockTint(p_389335_, BiomeColors.DRY_FOLIAGE_COLOR_RESOLVER)));
|
||||
p_389331_.put(BiomeColors.WATER_COLOR_RESOLVER, new BlockTintCache(p_194168_ -> this.calculateBlockTint(p_194168_, BiomeColors.WATER_COLOR_RESOLVER)));
|
||||
@@ -8,7 +8,7 @@
|
||||
});
|
||||
private final ClientChunkCache chunkSource;
|
||||
private final Deque<Runnable> lightUpdateQueue = Queues.newArrayDeque();
|
||||
@@ -134,6 +_,8 @@
|
||||
@@ -139,6 +_,8 @@
|
||||
private final int seaLevel;
|
||||
private boolean tickDayTime;
|
||||
private static final Set<Item> MARKER_PARTICLE_ITEMS = Set.of(Items.BARRIER, Items.LIGHT);
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
public void handleBlockChangedAck(int p_233652_) {
|
||||
this.blockStatePredictionHandler.endPredictionsUpTo(p_233652_, this);
|
||||
@@ -200,6 +_,8 @@
|
||||
@@ -217,6 +_,8 @@
|
||||
this.serverSimulationDistance = p_364305_;
|
||||
this.updateSkyBrightness();
|
||||
this.prepareWeather();
|
||||
@@ -26,7 +26,7 @@
|
||||
}
|
||||
|
||||
public void queueLightUpdate(Runnable p_194172_) {
|
||||
@@ -282,6 +_,7 @@
|
||||
@@ -299,6 +_,7 @@
|
||||
p_104640_.setOldPosAndRot();
|
||||
p_104640_.tickCount++;
|
||||
Profiler.get().push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_104640_.getType()).toString());
|
||||
@@ -34,7 +34,7 @@
|
||||
p_104640_.tick();
|
||||
Profiler.get().pop();
|
||||
|
||||
@@ -333,8 +_,10 @@
|
||||
@@ -350,8 +_,10 @@
|
||||
}
|
||||
|
||||
public void addEntity(Entity p_104741_) {
|
||||
@@ -45,12 +45,12 @@
|
||||
}
|
||||
|
||||
public void removeEntity(int p_171643_, Entity.RemovalReason p_171644_) {
|
||||
@@ -516,6 +_,12 @@
|
||||
@@ -532,6 +_,12 @@
|
||||
float p_263349_,
|
||||
long p_263408_
|
||||
) {
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtPosition(this, p_263372_, p_263404_, p_263365_, p_263335_, p_263417_, p_263416_, p_263349_);
|
||||
+ if (event.isCanceled() || event.getSound() == null) return;
|
||||
+ if (event == null || event.getSound() == null) return;
|
||||
+ p_263335_ = event.getSound();
|
||||
+ p_263417_ = event.getSource();
|
||||
+ p_263416_ = event.getNewVolume();
|
||||
@@ -58,12 +58,12 @@
|
||||
if (p_394722_ == this.minecraft.player) {
|
||||
this.playSound(p_263372_, p_263404_, p_263365_, p_263335_.value(), p_263417_, p_263416_, p_263349_, false, p_263408_);
|
||||
}
|
||||
@@ -525,6 +_,12 @@
|
||||
@@ -541,6 +_,12 @@
|
||||
public void playSeededSound(
|
||||
@Nullable Entity p_263536_, Entity p_396496_, Holder<SoundEvent> p_263518_, SoundSource p_263487_, float p_263538_, float p_263524_, long p_263509_
|
||||
) {
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtEntity(this.minecraft.level, p_263536_, p_263518_, p_263487_, p_263538_, p_263524_);
|
||||
+ if (event.isCanceled() || event.getSound() == null) return;
|
||||
+ if (event == null || event.getSound() == null) return;
|
||||
+ p_263518_ = event.getSound();
|
||||
+ p_263487_ = event.getSource();
|
||||
+ p_263538_ = event.getNewVolume();
|
||||
@@ -71,7 +71,7 @@
|
||||
if (p_263536_ == this.minecraft.player) {
|
||||
this.minecraft.getSoundManager().play(new EntityBoundSoundInstance(p_263518_.value(), p_263487_, p_263538_, p_263524_, p_396496_, p_263509_));
|
||||
}
|
||||
@@ -975,6 +_,16 @@
|
||||
@@ -991,6 +_,16 @@
|
||||
this.connection.registerForCleaning(p_396040_);
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static class ClientLevelData implements WritableLevelData {
|
||||
private final boolean hardcore;
|
||||
@@ -1063,6 +_,7 @@
|
||||
@@ -1079,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void setDifficulty(Difficulty p_104852_) {
|
||||
@@ -96,7 +96,7 @@
|
||||
this.difficulty = p_104852_;
|
||||
}
|
||||
|
||||
@@ -1105,6 +_,12 @@
|
||||
@@ -1121,6 +_,12 @@
|
||||
break;
|
||||
default:
|
||||
}
|
||||
@@ -109,7 +109,7 @@
|
||||
}
|
||||
|
||||
public void onTrackingEnd(Entity p_171716_) {
|
||||
@@ -1117,6 +_,15 @@
|
||||
@@ -1133,6 +_,15 @@
|
||||
ClientLevel.this.dragonParts.removeAll(Arrays.asList(enderdragon.getSubEntities()));
|
||||
break;
|
||||
default:
|
||||
|
||||
+19
-19
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/multiplayer/ClientPacketListener.java
|
||||
+++ b/net/minecraft/client/multiplayer/ClientPacketListener.java
|
||||
@@ -477,6 +_,7 @@
|
||||
@@ -528,6 +_,7 @@
|
||||
|
||||
this.minecraft.debugRenderer.clear();
|
||||
this.minecraft.player.resetPos();
|
||||
@@ -8,7 +8,7 @@
|
||||
this.minecraft.player.setId(p_105030_.playerId());
|
||||
this.level.addEntity(this.minecraft.player);
|
||||
this.minecraft.player.input = new KeyboardInput(this.minecraft.options);
|
||||
@@ -1263,6 +_,8 @@
|
||||
@@ -1315,6 +_,8 @@
|
||||
localplayer1.getAttributes().assignBaseValues(localplayer.getAttributes());
|
||||
}
|
||||
|
||||
@@ -17,27 +17,27 @@
|
||||
this.level.addEntity(localplayer1);
|
||||
localplayer1.input = new KeyboardInput(this.minecraft.options);
|
||||
this.minecraft.gameMode.adjustPlayer(localplayer1);
|
||||
@@ -1407,7 +_,7 @@
|
||||
PacketUtils.ensureRunningOnSameThread(p_104976_, this, this.minecraft);
|
||||
BlockPos blockpos = p_104976_.getPos();
|
||||
this.minecraft.level.getBlockEntity(blockpos, p_104976_.getType()).ifPresent(p_389343_ -> {
|
||||
- p_389343_.loadWithComponents(p_104976_.getTag(), this.registryAccess);
|
||||
+ p_389343_.onDataPacket(connection, p_104976_, this.registryAccess);
|
||||
if (p_389343_ instanceof CommandBlockEntity && this.minecraft.screen instanceof CommandBlockEditScreen) {
|
||||
((CommandBlockEditScreen)this.minecraft.screen).updateGui();
|
||||
}
|
||||
@@ -1567,7 +_,9 @@
|
||||
@@ -1462,7 +_,7 @@
|
||||
ProblemReporter.ScopedCollector problemreporter$scopedcollector = new ProblemReporter.ScopedCollector(p_404890_.problemPath(), LOGGER);
|
||||
|
||||
try {
|
||||
- p_404890_.loadWithComponents(TagValueInput.create(problemreporter$scopedcollector, this.registryAccess, p_104976_.getTag()));
|
||||
+ p_404890_.onDataPacket(connection, TagValueInput.create(problemreporter$scopedcollector, this.registryAccess, p_104976_.getTag()), this.registryAccess);
|
||||
} catch (Throwable throwable1) {
|
||||
try {
|
||||
problemreporter$scopedcollector.close();
|
||||
@@ -1630,7 +_,9 @@
|
||||
@Override
|
||||
public void handleCommands(ClientboundCommandsPacket p_104990_) {
|
||||
PacketUtils.ensureRunningOnSameThread(p_104990_, this, this.minecraft);
|
||||
- this.commands = new CommandDispatcher<>(p_104990_.getRoot(CommandBuildContext.simple(this.registryAccess, this.enabledFeatures)));
|
||||
- this.commands = new CommandDispatcher<>(p_104990_.getRoot(CommandBuildContext.simple(this.registryAccess, this.enabledFeatures), COMMAND_NODE_BUILDER));
|
||||
+ var context = CommandBuildContext.simple(this.registryAccess, this.enabledFeatures);
|
||||
+ this.commands = new CommandDispatcher<>(p_104990_.getRoot(context));
|
||||
+ this.commands = new CommandDispatcher<>(p_104990_.getRoot(context, COMMAND_NODE_BUILDER));
|
||||
+ this.commands = net.minecraftforge.client.ClientCommandHandler.mergeServerCommands(this.commands, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1668,6 +_,7 @@
|
||||
@@ -1731,6 +_,7 @@
|
||||
if (this.minecraft.screen instanceof RecipeUpdateListener recipeupdatelistener) {
|
||||
recipeupdatelistener.recipesUpdated();
|
||||
}
|
||||
@@ -45,7 +45,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1706,6 +_,8 @@
|
||||
@@ -1769,6 +_,8 @@
|
||||
this.fuelValues = FuelValues.vanillaBurnTimes(this.registryAccess, this.enabledFeatures);
|
||||
List<ItemStack> list1 = List.copyOf(CreativeModeTabs.searchTab().getDisplayItems());
|
||||
this.searchTrees.updateCreativeTags(list1);
|
||||
@@ -54,7 +54,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2548,6 +_,8 @@
|
||||
@@ -2617,6 +_,8 @@
|
||||
}
|
||||
|
||||
public void sendChat(String p_249888_) {
|
||||
@@ -63,11 +63,11 @@
|
||||
Instant instant = Instant.now();
|
||||
long i = Crypt.SaltSupplier.getLong();
|
||||
LastSeenMessagesTracker.Update lastseenmessagestracker$update = this.lastSeenMessages.generateAndApplyUpdate();
|
||||
@@ -2556,6 +_,7 @@
|
||||
@@ -2625,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void sendCommand(String p_250092_) {
|
||||
+ if (net.minecraftforge.client.ClientCommandHandler.runCommand(p_250092_)) return;
|
||||
SignableCommand<SharedSuggestionProvider> signablecommand = SignableCommand.of(this.parseCommand(p_250092_));
|
||||
SignableCommand<ClientSuggestionProvider> signablecommand = SignableCommand.of(this.commands.parse(p_250092_, this.suggestionsProvider));
|
||||
if (signablecommand.arguments().isEmpty()) {
|
||||
this.send(new ServerboundChatCommandPacket(p_250092_));
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/multiplayer/MultiPlayerGameMode.java
|
||||
+++ b/net/minecraft/client/multiplayer/MultiPlayerGameMode.java
|
||||
@@ -110,6 +_,7 @@
|
||||
@@ -111,6 +_,7 @@
|
||||
}
|
||||
|
||||
public boolean destroyBlock(BlockPos p_105268_) {
|
||||
@@ -8,7 +8,7 @@
|
||||
if (this.minecraft.player.blockActionRestricted(this.minecraft.level, p_105268_, this.localPlayerMode)) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -124,9 +_,8 @@
|
||||
@@ -125,9 +_,8 @@
|
||||
} else if (blockstate.isAir()) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -19,15 +19,15 @@
|
||||
if (flag) {
|
||||
block.destroy(level, p_105268_, blockstate);
|
||||
}
|
||||
@@ -147,6 +_,7 @@
|
||||
@@ -148,6 +_,7 @@
|
||||
BlockState blockstate = this.minecraft.level.getBlockState(p_105270_);
|
||||
this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105270_, blockstate, 1.0F);
|
||||
this.startPrediction(this.minecraft.level, p_233757_ -> {
|
||||
+ if (!net.minecraftforge.event.ForgeEventFactory.onLeftClickBlock(this.minecraft.player, p_105270_, p_105271_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK).isCanceled())
|
||||
+ if (!net.minecraftforge.event.ForgeEventFactory.isLeftClickBlockCancelled(this.minecraft.player, p_105270_, p_105271_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK))
|
||||
this.destroyBlock(p_105270_);
|
||||
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233757_);
|
||||
});
|
||||
@@ -156,15 +_,18 @@
|
||||
@@ -157,15 +_,18 @@
|
||||
this.connection
|
||||
.send(new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, this.destroyBlockPos, p_105271_));
|
||||
}
|
||||
@@ -38,15 +38,15 @@
|
||||
this.startPrediction(this.minecraft.level, p_233728_ -> {
|
||||
boolean flag = !blockstate1.isAir();
|
||||
if (flag && this.destroyProgress == 0.0F) {
|
||||
+ if (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY)
|
||||
+ if (event != null && !event.getUseBlock().isDenied())
|
||||
blockstate1.attack(this.minecraft.level, p_105270_, this.minecraft.player);
|
||||
}
|
||||
|
||||
+ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) {
|
||||
+ if (event != null && !event.getUseItem().isDenied()) {
|
||||
if (flag && blockstate1.getDestroyProgress(this.minecraft.player, this.minecraft.player.level(), p_105270_) >= 1.0F) {
|
||||
this.destroyBlock(p_105270_);
|
||||
} else {
|
||||
@@ -175,6 +_,7 @@
|
||||
@@ -176,6 +_,7 @@
|
||||
this.destroyTicks = 0.0F;
|
||||
this.minecraft.level.destroyBlockProgress(this.minecraft.player.getId(), this.destroyBlockPos, this.getDestroyStage());
|
||||
}
|
||||
@@ -54,15 +54,15 @@
|
||||
|
||||
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233728_);
|
||||
});
|
||||
@@ -207,6 +_,7 @@
|
||||
@@ -208,6 +_,7 @@
|
||||
BlockState blockstate1 = this.minecraft.level.getBlockState(p_105284_);
|
||||
this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105284_, blockstate1, 1.0F);
|
||||
this.startPrediction(this.minecraft.level, p_233753_ -> {
|
||||
+ if (!net.minecraftforge.event.ForgeEventFactory.onLeftClickBlock(this.minecraft.player, p_105284_, p_105285_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK).isCanceled())
|
||||
+ if (!net.minecraftforge.event.ForgeEventFactory.isLeftClickBlockCancelled(this.minecraft.player, p_105284_, p_105285_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK))
|
||||
this.destroyBlock(p_105284_);
|
||||
return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105284_, p_105285_, p_233753_);
|
||||
});
|
||||
@@ -219,7 +_,7 @@
|
||||
@@ -220,7 +_,7 @@
|
||||
} else {
|
||||
this.destroyProgress = this.destroyProgress + blockstate.getDestroyProgress(this.minecraft.player, this.minecraft.player.level(), p_105284_);
|
||||
if (this.destroyTicks % 4.0F == 0.0F) {
|
||||
@@ -71,15 +71,15 @@
|
||||
this.minecraft
|
||||
.getSoundManager()
|
||||
.play(
|
||||
@@ -236,6 +_,7 @@
|
||||
@@ -237,6 +_,7 @@
|
||||
|
||||
this.destroyTicks++;
|
||||
this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105284_, blockstate, Mth.clamp(this.destroyProgress, 0.0F, 1.0F));
|
||||
+ if (net.minecraftforge.event.ForgeEventFactory.onLeftClickBlockHold(this.minecraft.player, p_105284_, p_105285_).getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return true;
|
||||
+ if (net.minecraftforge.event.ForgeEventFactory.onLeftClickBlockHold(this.minecraft.player, p_105284_, p_105285_).getUseItem().isDenied()) return true;
|
||||
if (this.destroyProgress >= 1.0F) {
|
||||
this.isDestroying = false;
|
||||
this.startPrediction(this.minecraft.level, p_233739_ -> {
|
||||
@@ -274,7 +_,7 @@
|
||||
@@ -275,7 +_,7 @@
|
||||
|
||||
private boolean sameDestroyTarget(BlockPos p_105282_) {
|
||||
ItemStack itemstack = this.minecraft.player.getMainHandItem();
|
||||
@@ -88,12 +88,12 @@
|
||||
}
|
||||
|
||||
private void ensureHasSentCarriedItem() {
|
||||
@@ -302,12 +_,23 @@
|
||||
@@ -303,12 +_,23 @@
|
||||
private InteractionResult performUseItemOn(LocalPlayer p_233747_, InteractionHand p_233748_, BlockHitResult p_233749_) {
|
||||
BlockPos blockpos = p_233749_.getBlockPos();
|
||||
ItemStack itemstack = p_233747_.getItemInHand(p_233748_);
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onRightClickBlock(p_233747_, p_233748_, blockpos, p_233749_);
|
||||
+ if (event.isCanceled()) {
|
||||
+ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock(p_233747_, p_233748_, blockpos, p_233749_);
|
||||
+ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock.BUS.post(event)) {
|
||||
+ return event.getCancellationResult();
|
||||
+ }
|
||||
if (this.localPlayerMode == GameType.SPECTATOR) {
|
||||
@@ -101,7 +101,7 @@
|
||||
} else {
|
||||
- boolean flag = !p_233747_.getMainHandItem().isEmpty() || !p_233747_.getOffhandItem().isEmpty();
|
||||
+ UseOnContext useoncontext = new UseOnContext(p_233747_, p_233748_, p_233749_);
|
||||
+ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) {
|
||||
+ if (!event.getUseItem().isDenied()) {
|
||||
+ InteractionResult result = itemstack.onItemUseFirst(useoncontext);
|
||||
+ if (result != InteractionResult.PASS) {
|
||||
+ return result;
|
||||
@@ -110,36 +110,36 @@
|
||||
+ boolean flag = !p_233747_.getMainHandItem().doesSneakBypassUse(p_233747_.level(), blockpos, p_233747_) || !p_233747_.getOffhandItem().doesSneakBypassUse(p_233747_.level(), blockpos, p_233747_);
|
||||
boolean flag1 = p_233747_.isSecondaryUseActive() && flag;
|
||||
- if (!flag1) {
|
||||
+ if (event.getUseBlock() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY && !flag1)) {
|
||||
+ if (event.getUseBlock().isAllowed() || (!event.getUseBlock().isDenied() && !flag1)) {
|
||||
BlockState blockstate = this.minecraft.level.getBlockState(blockpos);
|
||||
if (!this.connection.isFeatureEnabled(blockstate.getBlock().requiredFeatures())) {
|
||||
return InteractionResult.FAIL;
|
||||
@@ -328,8 +_,10 @@
|
||||
@@ -329,8 +_,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (!itemstack.isEmpty() && !p_233747_.getCooldowns().isOnCooldown(itemstack)) {
|
||||
- UseOnContext useoncontext = new UseOnContext(p_233747_, p_233748_, p_233749_);
|
||||
+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) {
|
||||
+ if (event.getUseItem().isDenied()) {
|
||||
+ return InteractionResult.PASS;
|
||||
+ }
|
||||
+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (!itemstack.isEmpty() && !p_233747_.getCooldowns().isOnCooldown(itemstack))) {
|
||||
+ if (event.getUseItem().isAllowed() || (!itemstack.isEmpty() && !p_233747_.getCooldowns().isOnCooldown(itemstack))) {
|
||||
InteractionResult interactionresult2;
|
||||
if (p_233747_.hasInfiniteMaterials()) {
|
||||
int i = itemstack.getCount();
|
||||
@@ -363,6 +_,11 @@
|
||||
@@ -364,6 +_,11 @@
|
||||
mutableobject.setValue(InteractionResult.PASS);
|
||||
return serverbounduseitempacket;
|
||||
} else {
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onRightClickItem(p_233722_, p_233723_);
|
||||
+ if (event.isCanceled()) {
|
||||
+ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem(p_233722_, p_233723_);
|
||||
+ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem.BUS.post(event)) {
|
||||
+ mutableobject.setValue(event.getCancellationResult());
|
||||
+ return serverbounduseitempacket;
|
||||
+ }
|
||||
InteractionResult interactionresult = itemstack.use(this.minecraft.level, p_233722_, p_233723_);
|
||||
ItemStack itemstack1;
|
||||
if (interactionresult instanceof InteractionResult.Success interactionresult$success) {
|
||||
@@ -373,6 +_,9 @@
|
||||
@@ -374,6 +_,9 @@
|
||||
|
||||
if (itemstack1 != itemstack) {
|
||||
p_233722_.setItemInHand(p_233723_, itemstack1);
|
||||
@@ -149,24 +149,24 @@
|
||||
}
|
||||
|
||||
mutableobject.setValue(interactionresult);
|
||||
@@ -404,6 +_,10 @@
|
||||
@@ -405,6 +_,10 @@
|
||||
public InteractionResult interact(Player p_105227_, Entity p_105228_, InteractionHand p_105229_) {
|
||||
this.ensureHasSentCarriedItem();
|
||||
this.connection.send(ServerboundInteractPacket.createInteractionPacket(p_105228_, p_105227_.isShiftKeyDown(), p_105229_));
|
||||
+ if (this.localPlayerMode != GameType.SPECTATOR) {
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onEntityInteract(p_105227_, p_105228_, p_105229_);
|
||||
+ if (event.isCanceled()) return event.getCancellationResult();
|
||||
+ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract(p_105227_, p_105229_, p_105228_);
|
||||
+ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract.BUS.post(event)) return event.getCancellationResult();
|
||||
+ }
|
||||
return (InteractionResult)(this.localPlayerMode == GameType.SPECTATOR ? InteractionResult.PASS : p_105227_.interactOn(p_105228_, p_105229_));
|
||||
}
|
||||
|
||||
@@ -411,6 +_,10 @@
|
||||
@@ -412,6 +_,10 @@
|
||||
this.ensureHasSentCarriedItem();
|
||||
Vec3 vec3 = p_105233_.getLocation().subtract(p_105232_.getX(), p_105232_.getY(), p_105232_.getZ());
|
||||
this.connection.send(ServerboundInteractPacket.createInteractionPacket(p_105232_, p_105231_.isShiftKeyDown(), p_105234_, vec3));
|
||||
+ if (this.localPlayerMode != GameType.SPECTATOR) {
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onEntityInteractSpecific(p_105231_, p_105232_, p_105234_, vec3);
|
||||
+ if (event.isCanceled()) return event.getCancellationResult();
|
||||
+ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific(p_105231_, p_105234_, p_105232_, vec3);
|
||||
+ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific.BUS.post(event)) return event.getCancellationResult();
|
||||
+ }
|
||||
return (InteractionResult)(this.localPlayerMode == GameType.SPECTATOR ? InteractionResult.PASS : p_105232_.interactAt(p_105231_, vec3, p_105234_));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/multiplayer/chat/ChatListener.java
|
||||
+++ b/net/minecraft/client/multiplayer/chat/ChatListener.java
|
||||
@@ -123,7 +_,9 @@
|
||||
@@ -124,7 +_,9 @@
|
||||
Instant instant = Instant.now();
|
||||
this.handleMessage(null, () -> {
|
||||
Component component = p_251256_.decorate(p_250375_);
|
||||
@@ -11,7 +11,7 @@
|
||||
this.narrateChatMessage(p_251256_, p_250375_);
|
||||
this.logSystemMessage(component, instant);
|
||||
this.previousMessageTime = Util.getMillis();
|
||||
@@ -142,12 +_,16 @@
|
||||
@@ -143,12 +_,16 @@
|
||||
MessageSignature messagesignature = p_249430_.signature();
|
||||
FilterMask filtermask = p_249430_.filterMask();
|
||||
if (filtermask.isEmpty()) {
|
||||
@@ -30,7 +30,7 @@
|
||||
this.narrateChatMessage(p_251766_, component);
|
||||
}
|
||||
}
|
||||
@@ -180,6 +_,8 @@
|
||||
@@ -181,6 +_,8 @@
|
||||
|
||||
public void handleSystemMessage(Component p_240522_, boolean p_240642_) {
|
||||
if (!this.minecraft.options.hideMatchedNames().get() || !this.minecraft.isBlocked(this.guessChatUUID(p_240522_))) {
|
||||
@@ -38,4 +38,4 @@
|
||||
+ if (p_240522_ == null) return;
|
||||
if (p_240642_) {
|
||||
this.minecraft.gui.setOverlayMessage(p_240522_, false);
|
||||
} else {
|
||||
this.minecraft.getNarrator().saySystemQueued(p_240522_);
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/player/LocalPlayer.java
|
||||
+++ b/net/minecraft/client/player/LocalPlayer.java
|
||||
@@ -303,6 +_,7 @@
|
||||
@@ -297,6 +_,7 @@
|
||||
ServerboundPlayerActionPacket.Action serverboundplayeractionpacket$action = p_108701_
|
||||
? ServerboundPlayerActionPacket.Action.DROP_ALL_ITEMS
|
||||
: ServerboundPlayerActionPacket.Action.DROP_ITEM;
|
||||
@@ -8,14 +8,14 @@
|
||||
ItemStack itemstack = this.getInventory().removeFromSelected(p_108701_);
|
||||
this.connection.send(new ServerboundPlayerActionPacket(serverboundplayeractionpacket$action, BlockPos.ZERO, Direction.DOWN));
|
||||
return !itemstack.isEmpty();
|
||||
@@ -483,7 +_,11 @@
|
||||
@@ -478,7 +_,11 @@
|
||||
|
||||
@Override
|
||||
public void playSound(SoundEvent p_108651_, float p_108652_, float p_108653_) {
|
||||
- this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), p_108651_, this.getSoundSource(), p_108652_, p_108653_, false);
|
||||
+ var holder = net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT.wrapAsHolder(p_108651_);
|
||||
+ var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtEntity(this.level(), this, holder, this.getSoundSource(), p_108652_, p_108653_);
|
||||
+ if (event.isCanceled() || event.getSound() == null) return;
|
||||
+ if (event == null || event.getSound() == null) return;
|
||||
+ this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), event.getSound().get(), event.getSource(), event.getNewVolume(), event.getNewPitch(), false);
|
||||
+
|
||||
}
|
||||
@@ -76,7 +76,7 @@
|
||||
}
|
||||
|
||||
private boolean vehicleCanSprint(Entity p_265184_) {
|
||||
@@ -1169,6 +_,18 @@
|
||||
@@ -1169,6 +_,17 @@
|
||||
@Override
|
||||
public float getVisualRotationYInDegrees() {
|
||||
return this.getYRot();
|
||||
@@ -89,7 +89,6 @@
|
||||
+ this.yRotLast = old.yRotLast;
|
||||
+ this.xRotLast = old.xRotLast;
|
||||
+ this.lastOnGround = old.lastOnGround;
|
||||
+ this.wasShiftKeyDown = old.wasShiftKeyDown;
|
||||
+ this.wasSprinting = old.wasSprinting;
|
||||
+ this.positionReminder = old.positionReminder;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/renderer/DimensionSpecialEffects.java
|
||||
+++ b/net/minecraft/client/renderer/DimensionSpecialEffects.java
|
||||
@@ -36,7 +_,7 @@
|
||||
@@ -32,7 +_,7 @@
|
||||
}
|
||||
|
||||
public static DimensionSpecialEffects forType(DimensionType p_108877_) {
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
--- a/net/minecraft/client/renderer/FogRenderer.java
|
||||
+++ b/net/minecraft/client/renderer/FogRenderer.java
|
||||
@@ -187,6 +_,12 @@
|
||||
f2 = f2 * (1.0F - f10) + f2 * f12 * f10;
|
||||
}
|
||||
|
||||
+ Vector3f fogColor = net.minecraftforge.client.ForgeHooksClient.getFogColor(p_362477_, p_364035_, p_361507_, p_361512_, p_367602_, f, f1, f2);
|
||||
+
|
||||
+ f = fogColor.x();
|
||||
+ f1 = fogColor.y();
|
||||
+ f2 = fogColor.z();
|
||||
+
|
||||
return new Vector4f(f, f1, f2, 1.0F);
|
||||
}
|
||||
|
||||
@@ -265,9 +_,10 @@
|
||||
fogrenderer$fogdata.shape = FogShape.CYLINDER;
|
||||
}
|
||||
|
||||
- return new FogParameters(
|
||||
+ var original = new FogParameters(
|
||||
fogrenderer$fogdata.start, fogrenderer$fogdata.end, fogrenderer$fogdata.shape, p_365589_.x, p_365589_.y, p_365589_.z, p_365589_.w
|
||||
);
|
||||
+ return net.minecraftforge.client.ForgeHooksClient.getFogParameters(p_234174_, fogtype, p_234173_, p_234177_, p_234175_, original);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/renderer/GameRenderer.java
|
||||
+++ b/net/minecraft/client/renderer/GameRenderer.java
|
||||
@@ -168,6 +_,10 @@
|
||||
@@ -194,6 +_,10 @@
|
||||
this.setPostEffect(ResourceLocation.withDefaultNamespace("spider"));
|
||||
} else if (p_109107_ instanceof EnderMan) {
|
||||
this.setPostEffect(ResourceLocation.withDefaultNamespace("invert"));
|
||||
@@ -11,21 +11,21 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,7 +_,13 @@
|
||||
if (!(f < 1.0F)) {
|
||||
PostChain postchain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS);
|
||||
if (postchain != null) {
|
||||
+ // TODO: [Forge][Rendering] Check if this blend management is needed anymnore with the new render pipeline changes
|
||||
+ boolean wasBlendEnabled = com.mojang.blaze3d.opengl.GlStateManager._isBlendEnabled();
|
||||
+ if (wasBlendEnabled)
|
||||
+ com.mojang.blaze3d.opengl.GlStateManager._disableBlend();
|
||||
postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool, p_389358_ -> p_389358_.setUniform("Radius", f));
|
||||
+ if (wasBlendEnabled)
|
||||
+ com.mojang.blaze3d.opengl.GlStateManager._enableBlend();
|
||||
}
|
||||
@@ -205,7 +_,13 @@
|
||||
public void processBlurEffect() {
|
||||
PostChain postchain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS);
|
||||
if (postchain != null) {
|
||||
+ // TODO: [Forge][Rendering] Check if this blend management is needed anymnore with the new render pipeline changes
|
||||
+ boolean wasBlendEnabled = com.mojang.blaze3d.opengl.GlStateManager._isBlendEnabled();
|
||||
+ if (wasBlendEnabled)
|
||||
+ com.mojang.blaze3d.opengl.GlStateManager._disableBlend();
|
||||
postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool);
|
||||
+ if (wasBlendEnabled)
|
||||
+ com.mojang.blaze3d.opengl.GlStateManager._enableBlend();
|
||||
}
|
||||
}
|
||||
@@ -347,7 +_,7 @@
|
||||
|
||||
@@ -364,7 +_,7 @@
|
||||
f *= Mth.lerp(f2, 1.0F, 0.85714287F);
|
||||
}
|
||||
|
||||
@@ -34,21 +34,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -490,11 +_,11 @@
|
||||
RenderTarget rendertarget = this.minecraft.getMainRenderTarget();
|
||||
RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(rendertarget.getDepthTexture(), 1.0);
|
||||
Matrix4f matrix4f = new Matrix4f()
|
||||
- .setOrtho(0.0F, (float)(window.getWidth() / window.getGuiScale()), (float)(window.getHeight() / window.getGuiScale()), 0.0F, 1000.0F, 21000.0F);
|
||||
+ .setOrtho(0.0F, (float)(window.getWidth() / window.getGuiScale()), (float)(window.getHeight() / window.getGuiScale()), 0.0F, 1000.0F, net.minecraftforge.client.ForgeHooksClient.getGuiFarPlane());
|
||||
RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.ORTHOGRAPHIC);
|
||||
Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack();
|
||||
matrix4fstack.pushMatrix();
|
||||
- matrix4fstack.translation(0.0F, 0.0F, -11000.0F);
|
||||
+ matrix4fstack.translation(0.0F, 0.0F, 10000F - net.minecraftforge.client.ForgeHooksClient.getGuiFarPlane());
|
||||
Lighting.setupFor3DItems();
|
||||
GuiGraphics guigraphics = new GuiGraphics(this.minecraft, this.renderBuffers.bufferSource());
|
||||
if (flag && p_109096_ && this.minecraft.level != null) {
|
||||
@@ -520,7 +_,7 @@
|
||||
@@ -512,7 +_,7 @@
|
||||
}
|
||||
} else if (flag && this.minecraft.screen != null) {
|
||||
try {
|
||||
@@ -57,7 +43,7 @@
|
||||
} catch (Throwable throwable1) {
|
||||
CrashReport crashreport1 = CrashReport.forThrowable(throwable1, "Rendering screen");
|
||||
CrashReportCategory crashreportcategory1 = crashreport1.addCategory("Screen render details");
|
||||
@@ -654,6 +_,9 @@
|
||||
@@ -646,6 +_,9 @@
|
||||
if (this.minecraft.options.bobView().get()) {
|
||||
this.bobView(posestack, camera.getPartialTickTime());
|
||||
}
|
||||
|
||||
@@ -1,63 +1,62 @@
|
||||
--- a/net/minecraft/client/renderer/ItemBlockRenderTypes.java
|
||||
+++ b/net/minecraft/client/renderer/ItemBlockRenderTypes.java
|
||||
@@ -18,6 +_,7 @@
|
||||
@@ -19,6 +_,7 @@
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public class ItemBlockRenderTypes {
|
||||
+ @Deprecated
|
||||
private static final Map<Block, RenderType> TYPE_BY_BLOCK = Util.make(Maps.newHashMap(), p_389364_ -> {
|
||||
RenderType rendertype = RenderType.tripwire();
|
||||
p_389364_.put(Blocks.TRIPWIRE, rendertype);
|
||||
@@ -352,6 +_,7 @@
|
||||
p_389364_.put(Blocks.BUBBLE_COLUMN, rendertype3);
|
||||
p_389364_.put(Blocks.TINTED_GLASS, rendertype3);
|
||||
private static final Map<Block, ChunkSectionLayer> TYPE_BY_BLOCK = Util.make(Maps.newHashMap(), p_389364_ -> {
|
||||
ChunkSectionLayer chunksectionlayer = ChunkSectionLayer.TRIPWIRE;
|
||||
p_389364_.put(Blocks.TRIPWIRE, chunksectionlayer);
|
||||
@@ -353,12 +_,15 @@
|
||||
p_389364_.put(Blocks.BUBBLE_COLUMN, chunksectionlayer3);
|
||||
p_389364_.put(Blocks.TINTED_GLASS, chunksectionlayer3);
|
||||
});
|
||||
+ @Deprecated
|
||||
private static final Map<Fluid, RenderType> TYPE_BY_FLUID = Util.make(Maps.newHashMap(), p_109290_ -> {
|
||||
RenderType rendertype = RenderType.translucent();
|
||||
p_109290_.put(Fluids.FLOWING_WATER, rendertype);
|
||||
@@ -359,6 +_,8 @@
|
||||
private static final Map<Fluid, ChunkSectionLayer> LAYER_BY_FLUID = Util.make(Maps.newHashMap(), p_404902_ -> {
|
||||
p_404902_.put(Fluids.FLOWING_WATER, ChunkSectionLayer.TRANSLUCENT);
|
||||
p_404902_.put(Fluids.WATER, ChunkSectionLayer.TRANSLUCENT);
|
||||
});
|
||||
private static boolean renderCutout;
|
||||
|
||||
+ /** @deprecated Forge: Use {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */
|
||||
+ @Deprecated // Note: this method does NOT support model-based render types
|
||||
public static RenderType getChunkRenderType(BlockState p_109283_) {
|
||||
public static ChunkSectionLayer getChunkRenderType(BlockState p_109283_) {
|
||||
Block block = p_109283_.getBlock();
|
||||
if (block instanceof LeavesBlock) {
|
||||
@@ -369,6 +_,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getMovingBlockRenderType(RenderType)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */
|
||||
+ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getMovingBlockRenderType(ChunkSectionLayer)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */
|
||||
+ @Deprecated // Note: this method does NOT support model-based render types
|
||||
public static RenderType getMovingBlockRenderType(BlockState p_109294_) {
|
||||
Block block = p_109294_.getBlock();
|
||||
if (block instanceof LeavesBlock) {
|
||||
@@ -383,11 +_,14 @@
|
||||
@@ -389,11 +_,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getEntityRenderType(RenderType)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */
|
||||
+ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getEntityRenderType(ChunkSectionLayer)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */
|
||||
+ @Deprecated // Note: this method does NOT support model-based render types
|
||||
public static RenderType getRenderType(BlockState p_364446_) {
|
||||
RenderType rendertype = getChunkRenderType(p_364446_);
|
||||
return rendertype == RenderType.translucent() ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet();
|
||||
ChunkSectionLayer chunksectionlayer = getChunkRenderType(p_364446_);
|
||||
return chunksectionlayer == ChunkSectionLayer.TRANSLUCENT ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet();
|
||||
}
|
||||
|
||||
+ /* Forge: Use {@link net.minecraft.client.resources.model.BakedModel#getRenderPasses(ItemStack, boolean)} and {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(ItemStack, boolean)}. */
|
||||
public static RenderType getRenderType(ItemStack p_363859_) {
|
||||
if (p_363859_.getItem() instanceof BlockItem blockitem) {
|
||||
Block block = blockitem.getBlock();
|
||||
@@ -397,12 +_,81 @@
|
||||
@@ -403,12 +_,71 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ // Note: this method does NOT support model-based render types
|
||||
public static RenderType getRenderLayer(FluidState p_109288_) {
|
||||
- RenderType rendertype = TYPE_BY_FLUID.get(p_109288_.getType());
|
||||
+ RenderType rendertype = FLUID_RENDER_TYPES.get(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(p_109288_.getType()));
|
||||
return rendertype != null ? rendertype : RenderType.solid();
|
||||
public static ChunkSectionLayer getRenderLayer(FluidState p_109288_) {
|
||||
- ChunkSectionLayer chunksectionlayer = LAYER_BY_FLUID.get(p_109288_.getType());
|
||||
+ var chunksectionlayer = FLUID_RENDER_TYPES.get(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(p_109288_.getType()));
|
||||
return chunksectionlayer != null ? chunksectionlayer : ChunkSectionLayer.SOLID;
|
||||
}
|
||||
|
||||
public static void setFancy(boolean p_109292_) {
|
||||
@@ -69,24 +68,21 @@
|
||||
+ return renderCutout;
|
||||
+ }
|
||||
+
|
||||
+ private static final net.minecraftforge.client.ChunkRenderTypeSet CUTOUT_MIPPED = net.minecraftforge.client.ChunkRenderTypeSet.of(RenderType.cutoutMipped());
|
||||
+ private static final net.minecraftforge.client.ChunkRenderTypeSet SOLID = net.minecraftforge.client.ChunkRenderTypeSet.of(RenderType.solid());
|
||||
+ private static final Map<net.minecraft.core.Holder.Reference<Block>, net.minecraftforge.client.ChunkRenderTypeSet> BLOCK_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(TYPE_BY_BLOCK.size(), 0.5F), map -> {
|
||||
+ private static final java.util.Collection<ChunkSectionLayer> CUTOUT_MIPPED = java.util.EnumSet.of(ChunkSectionLayer.CUTOUT_MIPPED);
|
||||
+ private static final java.util.Collection<ChunkSectionLayer> SOLID = java.util.EnumSet.of(ChunkSectionLayer.SOLID);
|
||||
+ private static final Map<net.minecraft.core.Holder.Reference<Block>, java.util.Collection<ChunkSectionLayer>> BLOCK_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(TYPE_BY_BLOCK.size(), 0.5F), map -> {
|
||||
+ map.defaultReturnValue(SOLID);
|
||||
+ for(Map.Entry<Block, RenderType> entry : TYPE_BY_BLOCK.entrySet()) {
|
||||
+ map.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(entry.getKey()), net.minecraftforge.client.ChunkRenderTypeSet.of(entry.getValue()));
|
||||
+ }
|
||||
+ for(Map.Entry<Block, ChunkSectionLayer> entry : TYPE_BY_BLOCK.entrySet())
|
||||
+ map.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(entry.getKey()), java.util.EnumSet.of(entry.getValue()));
|
||||
+ });
|
||||
+ private static final Map<net.minecraft.core.Holder.Reference<Fluid>, RenderType> FLUID_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(TYPE_BY_FLUID.size(), 0.5F), map -> {
|
||||
+ map.defaultReturnValue(RenderType.solid());
|
||||
+ for(Map.Entry<Fluid, RenderType> entry : TYPE_BY_FLUID.entrySet()) {
|
||||
+ private static final Map<net.minecraft.core.Holder.Reference<Fluid>, ChunkSectionLayer> FLUID_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(LAYER_BY_FLUID.size(), 0.5F), map -> {
|
||||
+ map.defaultReturnValue(ChunkSectionLayer.SOLID);
|
||||
+ for(var entry : LAYER_BY_FLUID.entrySet())
|
||||
+ map.put(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(entry.getKey()), entry.getValue());
|
||||
+ }
|
||||
+ });
|
||||
+
|
||||
+ /** @deprecated Use {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */
|
||||
+ @Deprecated(forRemoval = true, since = "1.21.4")
|
||||
+ public static net.minecraftforge.client.ChunkRenderTypeSet getRenderLayers(BlockState state) {
|
||||
+ public static java.util.Collection<ChunkSectionLayer> getRenderLayers(BlockState state) {
|
||||
+ Block block = state.getBlock();
|
||||
+ if (block instanceof LeavesBlock) {
|
||||
+ return renderCutout ? CUTOUT_MIPPED : SOLID;
|
||||
@@ -95,28 +91,25 @@
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /** @deprecated Set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) or override {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)} */
|
||||
+ @Deprecated(forRemoval = true, since = "1.21.4")
|
||||
+ public static void setRenderLayer(Block block, RenderType type) {
|
||||
+ com.google.common.base.Preconditions.checkArgument(type.getChunkLayerId() >= 0, "The argument must be a valid chunk render type returned by RenderType#chunkBufferLayers().");
|
||||
+ setRenderLayer(block, net.minecraftforge.client.ChunkRenderTypeSet.of(type));
|
||||
+ }
|
||||
+
|
||||
+ /** @deprecated Set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) or override {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)} */
|
||||
+ @Deprecated(forRemoval = true, since = "1.21.4")
|
||||
+ public static synchronized void setRenderLayer(Block block, java.util.function.Predicate<RenderType> predicate) {
|
||||
+ setRenderLayer(block, createSetFromPredicate(predicate));
|
||||
+ }
|
||||
+
|
||||
+ /** @deprecated Set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) or override {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)} */
|
||||
+ @Deprecated(forRemoval = true, since = "1.21.4")
|
||||
+ public static synchronized void setRenderLayer(Block block, net.minecraftforge.client.ChunkRenderTypeSet layers) {
|
||||
+ /**
|
||||
+ * It is recommended to set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) so that it can be data driven.
|
||||
+ * But if you want to set it in code feel free to set it here like vanilla does.
|
||||
+ */
|
||||
+ public static void setRenderLayer(Block block, ChunkSectionLayer type) {
|
||||
+ checkClientLoading();
|
||||
+ BLOCK_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(block), layers);
|
||||
+ BLOCK_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(block), java.util.EnumSet.of(type));
|
||||
+ }
|
||||
+
|
||||
+ public static synchronized void setRenderLayer(Fluid fluid, RenderType type) {
|
||||
+ com.google.common.base.Preconditions.checkArgument(type.getChunkLayerId() >= 0, "The argument must be a valid chunk render type returned by RenderType#chunkBufferLayers().");
|
||||
+ /**
|
||||
+ * It is recommended to set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) so that it can be data driven.
|
||||
+ * But if you want to set it in code feel free to set it here like vanilla does.
|
||||
+ */
|
||||
+ public static synchronized void setRenderLayer(Block block, ChunkSectionLayer first, ChunkSectionLayer... others) {
|
||||
+ checkClientLoading();
|
||||
+ BLOCK_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(block), java.util.EnumSet.of(first, others));
|
||||
+ }
|
||||
+
|
||||
+ public static synchronized void setRenderLayer(Fluid fluid, ChunkSectionLayer type) {
|
||||
+ checkClientLoading();
|
||||
+ FLUID_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(fluid), type);
|
||||
+ }
|
||||
@@ -126,9 +119,5 @@
|
||||
+ "Render layers can only be set during client loading! " +
|
||||
+ "This might ideally be done from `FMLClientSetupEvent`."
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ private static net.minecraftforge.client.ChunkRenderTypeSet createSetFromPredicate(java.util.function.Predicate<RenderType> predicate) {
|
||||
+ return net.minecraftforge.client.ChunkRenderTypeSet.of(RenderType.chunkBufferLayers().stream().filter(predicate).toArray(RenderType[]::new));
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/renderer/LevelRenderer.java
|
||||
+++ b/net/minecraft/client/renderer/LevelRenderer.java
|
||||
@@ -113,7 +_,7 @@
|
||||
@@ -121,7 +_,7 @@
|
||||
private final SkyRenderer skyRenderer = new SkyRenderer();
|
||||
private final CloudRenderer cloudRenderer = new CloudRenderer();
|
||||
private final WorldBorderRenderer worldBorderRenderer = new WorldBorderRenderer();
|
||||
@@ -9,28 +9,16 @@
|
||||
@Nullable
|
||||
private ClientLevel level;
|
||||
private final SectionOcclusionGraph sectionOcclusionGraph = new SectionOcclusionGraph();
|
||||
@@ -483,7 +_,7 @@
|
||||
postchain1.addToFrame(framegraphbuilder, i, j, this.targets, null);
|
||||
@@ -480,7 +_,7 @@
|
||||
postchain1.addToFrame(framegraphbuilder, i, j, this.targets);
|
||||
}
|
||||
|
||||
- this.addParticlesPass(framegraphbuilder, p_109604_, f, fogparameters);
|
||||
+ this.addParticlesPass(framegraphbuilder, p_109604_, f, fogparameters, frustum);
|
||||
- this.addParticlesPass(framegraphbuilder, p_109604_, f, p_407881_);
|
||||
+ this.addParticlesPass(framegraphbuilder, p_109604_, f, p_407881_, frustum);
|
||||
CloudStatus cloudstatus = this.minecraft.options.getCloudsType();
|
||||
if (cloudstatus != CloudStatus.OFF) {
|
||||
float f2 = this.level.effects().getCloudHeight();
|
||||
@@ -561,7 +_,11 @@
|
||||
double d2 = vec3.z();
|
||||
p_369478_.push("terrain");
|
||||
this.renderSectionLayer(RenderType.solid(), d0, d1, d2, p_361439_, p_369924_);
|
||||
+ // FORGE: fix flickering leaves when mods mess up the blurMipmap settings
|
||||
+ var atlas = this.minecraft.getModelManager().getAtlas(net.minecraft.client.renderer.texture.TextureAtlas.LOCATION_BLOCKS);
|
||||
+ atlas.setBlurMipmap(false, this.minecraft.options.mipmapLevels().get() > 0);
|
||||
this.renderSectionLayer(RenderType.cutoutMipped(), d0, d1, d2, p_361439_, p_369924_);
|
||||
+ atlas.restoreLastBlurMipmap();
|
||||
this.renderSectionLayer(RenderType.cutout(), d0, d1, d2, p_361439_, p_369924_);
|
||||
if (this.level.effects().constantAmbientLight()) {
|
||||
Lighting.setupNetherLevel();
|
||||
@@ -586,7 +_,7 @@
|
||||
Optional<Integer> optional = this.level.dimensionType().cloudHeight();
|
||||
@@ -577,7 +_,7 @@
|
||||
multibuffersource$buffersource.endLastBatch();
|
||||
this.checkPoseStack(posestack);
|
||||
p_369478_.popPush("blockentities");
|
||||
@@ -39,7 +27,7 @@
|
||||
multibuffersource$buffersource.endLastBatch();
|
||||
this.checkPoseStack(posestack);
|
||||
multibuffersource$buffersource.endBatch(RenderType.solid());
|
||||
@@ -600,8 +_,8 @@
|
||||
@@ -591,8 +_,8 @@
|
||||
multibuffersource$buffersource.endBatch(Sheets.hangingSignSheet());
|
||||
multibuffersource$buffersource.endBatch(Sheets.chestSheet());
|
||||
this.renderBuffers.outlineBufferSource().endOutlineBatch();
|
||||
@@ -50,10 +38,10 @@
|
||||
}
|
||||
|
||||
p_369478_.popPush("debug");
|
||||
@@ -629,8 +_,8 @@
|
||||
this.renderSectionLayer(RenderType.translucent(), d0, d1, d2, p_361439_, p_369924_);
|
||||
@@ -620,8 +_,8 @@
|
||||
chunksectionstorender.renderGroup(ChunkSectionLayerGroup.TRANSLUCENT);
|
||||
p_369478_.popPush("string");
|
||||
this.renderSectionLayer(RenderType.tripwire(), d0, d1, d2, p_361439_, p_369924_);
|
||||
chunksectionstorender.renderGroup(ChunkSectionLayerGroup.TRIPWIRE);
|
||||
- if (p_362593_) {
|
||||
- this.renderBlockOutline(p_364769_, multibuffersource$buffersource, posestack, true);
|
||||
+ if (renderOutline) {
|
||||
@@ -61,16 +49,16 @@
|
||||
}
|
||||
|
||||
multibuffersource$buffersource.endBatch();
|
||||
@@ -638,7 +_,7 @@
|
||||
@@ -629,7 +_,7 @@
|
||||
});
|
||||
}
|
||||
|
||||
- private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, FogParameters p_363695_) {
|
||||
+ private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, FogParameters p_363695_, Frustum frustum) {
|
||||
- private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, GpuBufferSlice p_405857_) {
|
||||
+ private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, GpuBufferSlice p_405857_, Frustum frustum) {
|
||||
FramePass framepass = p_366471_.addPass("particles");
|
||||
if (this.targets.particles != null) {
|
||||
this.targets.particles = framepass.readsAndWrites(this.targets.particles);
|
||||
@@ -655,7 +_,7 @@
|
||||
@@ -646,7 +_,7 @@
|
||||
resourcehandle1.get().copyDepthFrom(resourcehandle.get());
|
||||
}
|
||||
|
||||
@@ -79,7 +67,7 @@
|
||||
});
|
||||
}
|
||||
|
||||
@@ -725,9 +_,9 @@
|
||||
@@ -716,9 +_,9 @@
|
||||
|| p_365712_.isDetached()
|
||||
|| p_365712_.getEntity() instanceof LivingEntity && ((LivingEntity)p_365712_.getEntity()).isSleeping()
|
||||
)
|
||||
@@ -91,7 +79,7 @@
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
@@ -767,9 +_,10 @@
|
||||
@@ -758,9 +_,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,15 +92,15 @@
|
||||
Vec3 vec3 = p_369847_.getPosition();
|
||||
double d0 = vec3.x();
|
||||
double d1 = vec3.y();
|
||||
@@ -779,6 +_,7 @@
|
||||
List<BlockEntity> list = sectionrenderdispatcher$rendersection.getCompiled().getRenderableBlockEntities();
|
||||
@@ -770,6 +_,7 @@
|
||||
List<BlockEntity> list = sectionrenderdispatcher$rendersection.getSectionMesh().getRenderableBlockEntities();
|
||||
if (!list.isEmpty()) {
|
||||
for (BlockEntity blockentity : list) {
|
||||
+ if (!frustum.isVisible(blockentity.getRenderBoundingBox())) continue;
|
||||
BlockPos blockpos = blockentity.getBlockPos();
|
||||
MultiBufferSource multibuffersource = p_362022_;
|
||||
p_366168_.pushPose();
|
||||
@@ -798,6 +_,9 @@
|
||||
@@ -789,6 +_,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,10 +110,10 @@
|
||||
this.blockEntityRenderDispatcher.render(blockentity, p_367074_, p_366168_, multibuffersource);
|
||||
p_366168_.popPose();
|
||||
}
|
||||
@@ -806,13 +_,18 @@
|
||||
|
||||
synchronized (this.globalBlockEntities) {
|
||||
for (BlockEntity blockentity1 : this.globalBlockEntities) {
|
||||
@@ -802,13 +_,18 @@
|
||||
if (blockentity1.isRemoved()) {
|
||||
iterator.remove();
|
||||
} else {
|
||||
+ if (!frustum.isVisible(blockentity1.getRenderBoundingBox())) continue;
|
||||
BlockPos blockpos1 = blockentity1.getBlockPos();
|
||||
p_366168_.pushPose();
|
||||
@@ -141,7 +129,7 @@
|
||||
}
|
||||
|
||||
private void renderBlockDestroyAnimation(PoseStack p_366956_, Camera p_369324_, MultiBufferSource.BufferSource p_365998_) {
|
||||
@@ -831,14 +_,14 @@
|
||||
@@ -827,14 +_,14 @@
|
||||
p_366956_.translate(blockpos.getX() - d0, blockpos.getY() - d1, blockpos.getZ() - d2);
|
||||
PoseStack.Pose posestack$pose = p_366956_.last();
|
||||
VertexConsumer vertexconsumer = new SheetedDecalTextureGenerator(p_365998_.getBuffer(ModelBakery.DESTROY_TYPES.get(i)), posestack$pose, 1.0F);
|
||||
@@ -158,7 +146,7 @@
|
||||
if (this.minecraft.hitResult instanceof BlockHitResult blockhitresult) {
|
||||
if (blockhitresult.getType() != HitResult.Type.MISS) {
|
||||
BlockPos blockpos = blockhitresult.getBlockPos();
|
||||
@@ -849,6 +_,9 @@
|
||||
@@ -845,6 +_,9 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -168,7 +156,7 @@
|
||||
Vec3 vec3 = p_367935_.getPosition();
|
||||
Boolean obool = this.minecraft.options.highContrastBlockOutline().get();
|
||||
if (obool) {
|
||||
@@ -864,6 +_,8 @@
|
||||
@@ -860,6 +_,8 @@
|
||||
p_367206_.endLastBatch();
|
||||
}
|
||||
}
|
||||
@@ -177,7 +165,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1359,7 +_,7 @@
|
||||
@@ -1344,7 +_,7 @@
|
||||
} else {
|
||||
int i = p_398213_.packedBrightness(p_109538_, p_109540_);
|
||||
int j = LightTexture.block(i);
|
||||
@@ -186,7 +174,7 @@
|
||||
if (j < k) {
|
||||
int l = LightTexture.sky(i);
|
||||
return LightTexture.pack(k, l);
|
||||
@@ -1422,6 +_,22 @@
|
||||
@@ -1406,6 +_,22 @@
|
||||
|
||||
public CloudRenderer getCloudRenderer() {
|
||||
return this.cloudRenderer;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/renderer/LightTexture.java
|
||||
+++ b/net/minecraft/client/renderer/LightTexture.java
|
||||
@@ -142,7 +_,7 @@
|
||||
@@ -171,7 +_,7 @@
|
||||
}
|
||||
|
||||
public static int block(int p_109884_) {
|
||||
|
||||
@@ -1,15 +1,6 @@
|
||||
--- a/net/minecraft/client/renderer/RenderType.java
|
||||
+++ b/net/minecraft/client/renderer/RenderType.java
|
||||
@@ -633,9 +_,20 @@
|
||||
.createCompositeState(false)
|
||||
);
|
||||
private static final ImmutableList<RenderType> CHUNK_BUFFER_LAYERS = ImmutableList.of(solid(), cutoutMipped(), cutout(), translucent(), tripwire());
|
||||
+ static {
|
||||
+ int i = 0;
|
||||
+ for (var layer : CHUNK_BUFFER_LAYERS)
|
||||
+ layer.chunkLayerId = i++;
|
||||
+ }
|
||||
+
|
||||
@@ -521,6 +_,11 @@
|
||||
private final int bufferSize;
|
||||
private final boolean affectsCrumbling;
|
||||
private final boolean sortOnUpload;
|
||||
@@ -21,7 +12,7 @@
|
||||
|
||||
public static RenderType solid() {
|
||||
return SOLID;
|
||||
@@ -820,7 +_,7 @@
|
||||
@@ -701,7 +_,7 @@
|
||||
}
|
||||
|
||||
public static RenderType text(ResourceLocation p_110498_) {
|
||||
@@ -30,7 +21,7 @@
|
||||
}
|
||||
|
||||
public static RenderType textBackground() {
|
||||
@@ -828,19 +_,19 @@
|
||||
@@ -709,19 +_,19 @@
|
||||
}
|
||||
|
||||
public static RenderType textIntensity(ResourceLocation p_173238_) {
|
||||
@@ -54,7 +45,7 @@
|
||||
}
|
||||
|
||||
public static RenderType textBackgroundSeeThrough() {
|
||||
@@ -848,7 +_,7 @@
|
||||
@@ -729,7 +_,7 @@
|
||||
}
|
||||
|
||||
public static RenderType textIntensitySeeThrough(ResourceLocation p_173241_) {
|
||||
|
||||
@@ -1,33 +1,32 @@
|
||||
--- a/net/minecraft/client/renderer/ScreenEffectRenderer.java
|
||||
+++ b/net/minecraft/client/renderer/ScreenEffectRenderer.java
|
||||
@@ -27,17 +_,24 @@
|
||||
Player player = p_110719_.player;
|
||||
if (!player.noPhysics) {
|
||||
BlockState blockstate = getViewBlockingState(player);
|
||||
- if (blockstate != null) {
|
||||
- renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockstate), p_110720_, p_378238_);
|
||||
+ var overlay = getOverlayBlock(player);
|
||||
+ if (overlay != null) {
|
||||
+ if (!net.minecraftforge.client.ForgeHooksClient.renderBlockOverlay(player, p_110720_, net.minecraftforge.client.event.RenderBlockScreenEffectEvent.OverlayType.BLOCK, overlay.getLeft(), overlay.getRight())) {
|
||||
+ renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getParticleIcon(overlay.getLeft(), p_110719_.level, overlay.getRight()), p_110720_, p_378238_);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
if (!p_110719_.player.isSpectator()) {
|
||||
if (p_110719_.player.isEyeInFluid(FluidTags.WATER)) {
|
||||
+ if (!net.minecraftforge.client.ForgeHooksClient.renderWaterOverlay(player, p_110720_))
|
||||
renderWater(p_110719_, p_110720_, p_378238_);
|
||||
+ } else if (!player.getEyeInFluidType().isAir()) {
|
||||
+ net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions.of(player.getEyeInFluidType()).renderOverlay(p_110719_, p_110720_, p_378238_);
|
||||
@@ -55,18 +_,24 @@
|
||||
Player player = this.minecraft.player;
|
||||
if (this.minecraft.options.getCameraType().isFirstPerson() && !p_409640_) {
|
||||
if (!player.noPhysics) {
|
||||
- BlockState blockstate = getViewBlockingState(player);
|
||||
+ var overlay = getOverlayBlock(player);
|
||||
+ BlockState blockstate = overlay == null ? null : overlay.getLeft();
|
||||
if (blockstate != null) {
|
||||
+ if (!net.minecraftforge.client.ForgeHooksClient.renderBlockOverlay(player, posestack, net.minecraftforge.client.event.RenderBlockScreenEffectEvent.OverlayType.BLOCK, overlay.getLeft(), overlay.getRight()))
|
||||
renderTex(this.minecraft.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockstate), posestack, this.bufferSource);
|
||||
}
|
||||
}
|
||||
|
||||
if (p_110719_.player.isOnFire()) {
|
||||
+ if (!net.minecraftforge.client.ForgeHooksClient.renderFireOverlay(player, p_110720_))
|
||||
renderFire(p_110720_, p_378238_);
|
||||
if (!this.minecraft.player.isSpectator()) {
|
||||
if (this.minecraft.player.isEyeInFluid(FluidTags.WATER)) {
|
||||
+ if (!net.minecraftforge.client.ForgeHooksClient.renderWaterOverlay(player, posestack))
|
||||
renderWater(this.minecraft, posestack, this.bufferSource);
|
||||
+ } else if (!player.getEyeInFluidType().isAir()) {
|
||||
+ net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions.of(player.getEyeInFluidType()).renderOverlay(this.minecraft, posestack, this.bufferSource);
|
||||
}
|
||||
|
||||
if (this.minecraft.player.isOnFire()) {
|
||||
+ if (!net.minecraftforge.client.ForgeHooksClient.renderFireOverlay(player, posestack))
|
||||
renderFire(posestack, this.bufferSource);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,6 +_,12 @@
|
||||
@@ -116,6 +_,12 @@
|
||||
|
||||
@Nullable
|
||||
private static BlockState getViewBlockingState(Player p_110717_) {
|
||||
@@ -40,7 +39,7 @@
|
||||
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
@@ -54,7 +_,7 @@
|
||||
@@ -125,7 +_,7 @@
|
||||
blockpos$mutableblockpos.set(d0, d1, d2);
|
||||
BlockState blockstate = p_110717_.level().getBlockState(blockpos$mutableblockpos);
|
||||
if (blockstate.getRenderShape() != RenderShape.INVISIBLE && blockstate.isViewBlocking(p_110717_.level(), blockpos$mutableblockpos)) {
|
||||
@@ -49,7 +48,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,6 +_,10 @@
|
||||
@@ -153,6 +_,10 @@
|
||||
}
|
||||
|
||||
private static void renderWater(Minecraft p_110726_, PoseStack p_110727_, MultiBufferSource p_376402_) {
|
||||
@@ -60,7 +59,7 @@
|
||||
BlockPos blockpos = BlockPos.containing(p_110726_.player.getX(), p_110726_.player.getEyeY(), p_110726_.player.getZ());
|
||||
float f = LightTexture.getBrightness(p_110726_.player.level().dimensionType(), p_110726_.player.level().getMaxLocalRawBrightness(blockpos));
|
||||
int i = ARGB.colorFromFloat(0.1F, f, f, f);
|
||||
@@ -94,7 +_,7 @@
|
||||
@@ -165,7 +_,7 @@
|
||||
float f7 = -p_110726_.player.getYRot() / 64.0F;
|
||||
float f8 = p_110726_.player.getXRot() / 64.0F;
|
||||
Matrix4f matrix4f = p_110727_.last().pose();
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
- int p_111076_
|
||||
+ int p_111076_,
|
||||
+ net.minecraftforge.client.model.data.ModelData modelData,
|
||||
+ @org.jetbrains.annotations.Nullable net.minecraft.client.renderer.RenderType renderType
|
||||
+ @org.jetbrains.annotations.Nullable net.minecraft.client.renderer.chunk.ChunkSectionLayer renderType
|
||||
) {
|
||||
- for (BlockModelPart blockmodelpart : p_397754_.collectParts(RandomSource.create(42L))) {
|
||||
+ for (BlockModelPart blockmodelpart : p_397754_.collectParts(RandomSource.create(42L), modelData, renderType)) {
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/net/minecraft/client/renderer/block/model/BlockModelPart.java
|
||||
+++ b/net/minecraft/client/renderer/block/model/BlockModelPart.java
|
||||
@@ -10,7 +_,7 @@
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
-public interface BlockModelPart {
|
||||
+public interface BlockModelPart extends net.minecraftforge.client.extensions.IForgeBlockModelPart {
|
||||
List<BakedQuad> getQuads(@Nullable Direction p_395320_);
|
||||
|
||||
boolean useAmbientOcclusion();
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/client/renderer/block/model/FaceBakery.java
|
||||
+++ b/net/minecraft/client/renderer/block/model/FaceBakery.java
|
||||
@@ -67,7 +_,14 @@
|
||||
@@ -65,7 +_,14 @@
|
||||
recalculateWinding(aint, direction);
|
||||
}
|
||||
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
--- a/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java
|
||||
+++ b/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java
|
||||
@@ -13,14 +_,19 @@
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
-public record SimpleModelWrapper(QuadCollection quads, boolean useAmbientOcclusion, TextureAtlasSprite particleIcon) implements BlockModelPart {
|
||||
+public record SimpleModelWrapper(QuadCollection quads, boolean useAmbientOcclusion, TextureAtlasSprite particleIcon, net.minecraft.client.renderer.chunk.ChunkSectionLayer layer, net.minecraft.client.renderer.chunk.ChunkSectionLayer layerFast) implements BlockModelPart {
|
||||
public static SimpleModelWrapper bake(ModelBaker p_395631_, ResourceLocation p_396950_, ModelState p_396899_) {
|
||||
ResolvedModel resolvedmodel = p_395631_.getModel(p_396950_);
|
||||
TextureSlots textureslots = resolvedmodel.getTopTextureSlots();
|
||||
boolean flag = resolvedmodel.getTopAmbientOcclusion();
|
||||
TextureAtlasSprite textureatlassprite = resolvedmodel.resolveParticleSprite(textureslots, p_395631_);
|
||||
QuadCollection quadcollection = resolvedmodel.bakeTopGeometry(textureslots, p_395631_, p_396899_);
|
||||
- return new SimpleModelWrapper(quadcollection, flag, textureatlassprite);
|
||||
+ var ctx = resolvedmodel.getContext();
|
||||
+ return new SimpleModelWrapper(quadcollection, flag, textureatlassprite, ctx.getRenderType().block(), ctx.getRenderTypeFast().block());
|
||||
+ }
|
||||
+
|
||||
+ public SimpleModelWrapper(QuadCollection quads, boolean useAmbientOcclusion, TextureAtlasSprite particleIcon) {
|
||||
+ this(quads, useAmbientOcclusion, particleIcon, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -0,0 +1,29 @@
|
||||
--- a/net/minecraft/client/renderer/block/model/SingleVariant.java
|
||||
+++ b/net/minecraft/client/renderer/block/model/SingleVariant.java
|
||||
@@ -12,9 +_,13 @@
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public class SingleVariant implements BlockStateModel {
|
||||
private final BlockModelPart model;
|
||||
+ private final java.util.Collection<net.minecraft.client.renderer.chunk.ChunkSectionLayer> layer;
|
||||
+ private final java.util.Collection<net.minecraft.client.renderer.chunk.ChunkSectionLayer> layerFast;
|
||||
|
||||
public SingleVariant(BlockModelPart p_394592_) {
|
||||
this.model = p_394592_;
|
||||
+ this.layer = this.model.layer() == null ? null : java.util.EnumSet.of(this.model.layer());
|
||||
+ this.layerFast = this.model.layerFast() == null ? null : java.util.EnumSet.of(this.model.layerFast());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -25,6 +_,12 @@
|
||||
@Override
|
||||
public TextureAtlasSprite particleIcon() {
|
||||
return this.model.particleIcon();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public java.util.Collection<net.minecraft.client.renderer.chunk.ChunkSectionLayer> getRenderTypes(net.minecraft.world.level.block.state.BlockState state, RandomSource rand, net.minecraftforge.client.model.data.ModelData data) {
|
||||
+ var type = net.minecraft.client.renderer.ItemBlockRenderTypes.isFancy() ? layer : layerFast;
|
||||
+ return type != null ? type : BlockStateModel.super.getRenderTypes(state, rand, data);
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
+25
-2
@@ -1,5 +1,15 @@
|
||||
--- a/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java
|
||||
+++ b/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java
|
||||
@@ -26,6 +_,9 @@
|
||||
private final BlockState blockState;
|
||||
@Nullable
|
||||
private List<BlockStateModel> models;
|
||||
+ private boolean cacheKey = false;
|
||||
+ @Nullable
|
||||
+ private java.util.Collection<net.minecraft.client.renderer.chunk.ChunkSectionLayer> cache;
|
||||
|
||||
MultiPartModel(MultiPartModel.SharedBakedState p_391554_, BlockState p_397918_) {
|
||||
this.shared = p_391554_;
|
||||
@@ -38,6 +_,11 @@
|
||||
}
|
||||
|
||||
@@ -12,12 +22,12 @@
|
||||
public void collectParts(RandomSource p_391247_, List<BlockModelPart> p_397207_) {
|
||||
if (this.models == null) {
|
||||
this.models = this.shared.selectModels(this.blockState);
|
||||
@@ -51,6 +_,20 @@
|
||||
@@ -51,6 +_,33 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public void collectParts(RandomSource rand, List<BlockModelPart> dest, net.minecraftforge.client.model.data.ModelData extraData, net.minecraft.client.renderer.RenderType renderType) {
|
||||
+ public void collectParts(RandomSource rand, List<BlockModelPart> dest, net.minecraftforge.client.model.data.ModelData extraData, net.minecraft.client.renderer.chunk.ChunkSectionLayer renderType) {
|
||||
+ if (this.models == null) {
|
||||
+ this.models = this.shared.selectModels(this.blockState);
|
||||
+ }
|
||||
@@ -29,6 +39,19 @@
|
||||
+ blockstatemodel.collectParts(rand, dest, extraData, renderType);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public java.util.Collection<net.minecraft.client.renderer.chunk.ChunkSectionLayer> getRenderTypes(BlockState state, RandomSource rand, net.minecraftforge.client.model.data.ModelData data) {
|
||||
+ if (this.models == null)
|
||||
+ this.models = this.shared.selectModels(this.blockState);
|
||||
+ if (this.cache == null || this.cacheKey != net.minecraft.client.renderer.ItemBlockRenderTypes.isFancy()) {
|
||||
+ var tmp = java.util.EnumSet.noneOf(net.minecraft.client.renderer.chunk.ChunkSectionLayer.class);
|
||||
+ for (var model : this.models)
|
||||
+ tmp.addAll(model.getRenderTypes(state, rand, data));
|
||||
+ this.cache = tmp;
|
||||
+ }
|
||||
+ return !this.cache.isEmpty() ? this.cache : BlockStateModel.super.getRenderTypes(state, rand, data);
|
||||
+ }
|
||||
+
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public record Selector<T>(Predicate<BlockState> condition, T model) {
|
||||
|
||||
+4
-3
@@ -5,14 +5,15 @@
|
||||
BlockPos p_112459_, BlockState p_112460_, PoseStack p_112461_, MultiBufferSource p_112462_, Level p_112463_, boolean p_112464_, int p_112465_
|
||||
) {
|
||||
- RenderType rendertype = ItemBlockRenderTypes.getMovingBlockRenderType(p_112460_);
|
||||
- VertexConsumer vertexconsumer = p_112462_.getBuffer(rendertype);
|
||||
- List<BlockModelPart> list = this.blockRenderer.getBlockModel(p_112460_).collectParts(RandomSource.create(p_112460_.getSeed(p_112459_)));
|
||||
+ var model = this.blockRenderer.getBlockModel(p_112460_);
|
||||
+ var rand = RandomSource.create(p_112460_.getSeed(p_112459_));
|
||||
+ var data = net.minecraftforge.client.model.data.ModelData.EMPTY;
|
||||
+ for (var rendertype : model.getRenderTypes(p_112460_, rand, data)) {
|
||||
+ rand = RandomSource.create(p_112460_.getSeed(p_112459_)); // Reset rand to keep
|
||||
VertexConsumer vertexconsumer = p_112462_.getBuffer(rendertype);
|
||||
- List<BlockModelPart> list = this.blockRenderer.getBlockModel(p_112460_).collectParts(RandomSource.create(p_112460_.getSeed(p_112459_)));
|
||||
+ List<BlockModelPart> list = model.collectParts(rand, data, net.minecraftforge.client.RenderTypeHelper.getMovingBlockRenderType(rendertype));
|
||||
+ VertexConsumer vertexconsumer = p_112462_.getBuffer(net.minecraftforge.client.RenderTypeHelper.getMovingBlockRenderType(rendertype));
|
||||
+ List<BlockModelPart> list = model.collectParts(rand, data, rendertype);
|
||||
this.blockRenderer.getModelRenderer().tesselateBlock(p_112463_, list, p_112460_, p_112459_, p_112461_, vertexconsumer, p_112464_, p_112465_);
|
||||
+ }
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
--- a/net/minecraft/client/renderer/chunk/RenderChunkRegion.java
|
||||
+++ b/net/minecraft/client/renderer/chunk/RenderChunkRegion.java
|
||||
@@ -78,4 +_,9 @@
|
||||
public static int index(int p_345383_, int p_342744_, int p_343921_, int p_343462_) {
|
||||
return p_343921_ - p_345383_ + (p_343462_ - p_342744_) * 3;
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public net.minecraftforge.client.model.data.ModelDataManager getModelDataManager() {
|
||||
+ return level.getModelDataManager();
|
||||
+ }
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
--- a/net/minecraft/client/renderer/chunk/RenderSectionRegion.java
|
||||
+++ b/net/minecraft/client/renderer/chunk/RenderSectionRegion.java
|
||||
@@ -90,4 +_,9 @@
|
||||
public static int index(int p_409495_, int p_409337_, int p_407713_, int p_409077_, int p_406510_, int p_408332_) {
|
||||
return p_409077_ - p_409495_ + (p_406510_ - p_409337_) * 3 + (p_408332_ - p_407713_) * 3 * 3;
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public net.minecraftforge.client.model.data.ModelDataManager getModelDataManager() {
|
||||
+ return level.getModelDataManager();
|
||||
+ }
|
||||
}
|
||||
@@ -1,47 +1,35 @@
|
||||
--- a/net/minecraft/client/renderer/chunk/SectionCompiler.java
|
||||
+++ b/net/minecraft/client/renderer/chunk/SectionCompiler.java
|
||||
@@ -43,6 +_,7 @@
|
||||
@@ -42,6 +_,7 @@
|
||||
}
|
||||
|
||||
public SectionCompiler.Results compile(SectionPos p_344383_, RenderChunkRegion p_342669_, VertexSorting p_342522_, SectionBufferBuilderPack p_343546_) {
|
||||
public SectionCompiler.Results compile(SectionPos p_344383_, RenderSectionRegion p_409909_, VertexSorting p_342522_, SectionBufferBuilderPack p_343546_) {
|
||||
+ var modelDataMap = net.minecraft.client.Minecraft.getInstance().level.getModelDataManager().getAt(p_344383_);
|
||||
SectionCompiler.Results sectioncompiler$results = new SectionCompiler.Results();
|
||||
BlockPos blockpos = p_344383_.origin();
|
||||
BlockPos blockpos1 = blockpos.offset(15, 15, 15);
|
||||
@@ -74,10 +_,14 @@
|
||||
@@ -73,10 +_,14 @@
|
||||
}
|
||||
|
||||
if (blockstate.getRenderShape() == RenderShape.MODEL) {
|
||||
- RenderType rendertype2 = ItemBlockRenderTypes.getChunkRenderType(blockstate);
|
||||
- ChunkSectionLayer chunksectionlayer2 = ItemBlockRenderTypes.getChunkRenderType(blockstate);
|
||||
+ var model = this.blockRenderer.getBlockModel(blockstate);
|
||||
+ var data = modelDataMap.getOrDefault(blockpos2, net.minecraftforge.client.model.data.ModelData.EMPTY);
|
||||
+ data = model.getModelData(p_342669_, blockpos2, blockstate, data);
|
||||
+ data = model.getModelData(p_409909_, blockpos2, blockstate, data);
|
||||
+ randomsource.setSeed(blockstate.getSeed(blockpos2)); // Forge: We set this on purpose twice so that getRenderTypes can have the same RNG as collectParts
|
||||
+ for (RenderType rendertype2 : model.getRenderTypes(blockstate, randomsource, data)) {
|
||||
BufferBuilder bufferbuilder1 = this.getOrBeginLayer(map, p_343546_, rendertype2);
|
||||
+ for (ChunkSectionLayer chunksectionlayer2 : model.getRenderTypes(blockstate, randomsource, data)) {
|
||||
BufferBuilder bufferbuilder1 = this.getOrBeginLayer(map, p_343546_, chunksectionlayer2);
|
||||
randomsource.setSeed(blockstate.getSeed(blockpos2));
|
||||
- this.blockRenderer.getBlockModel(blockstate).collectParts(randomsource, list);
|
||||
+ model.collectParts(randomsource, list, data, rendertype2);
|
||||
+ model.collectParts(randomsource, list, data, chunksectionlayer2);
|
||||
posestack.pushPose();
|
||||
posestack.translate(
|
||||
SectionPos.sectionRelative(blockpos2.getX()), SectionPos.sectionRelative(blockpos2.getY()), SectionPos.sectionRelative(blockpos2.getZ())
|
||||
@@ -85,6 +_,7 @@
|
||||
this.blockRenderer.renderBatched(blockstate, blockpos2, p_342669_, posestack, bufferbuilder1, true, list);
|
||||
@@ -84,6 +_,7 @@
|
||||
this.blockRenderer.renderBatched(blockstate, blockpos2, p_409909_, posestack, bufferbuilder1, true, list);
|
||||
posestack.popPose();
|
||||
list.clear();
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,9 +_,10 @@
|
||||
private <E extends BlockEntity> void handleBlockEntity(SectionCompiler.Results p_343713_, E p_343478_) {
|
||||
BlockEntityRenderer<E> blockentityrenderer = this.blockEntityRenderer.getRenderer(p_343478_);
|
||||
if (blockentityrenderer != null) {
|
||||
- p_343713_.blockEntities.add(p_343478_);
|
||||
if (blockentityrenderer.shouldRenderOffScreen(p_343478_)) {
|
||||
p_343713_.globalBlockEntities.add(p_343478_);
|
||||
+ } else {
|
||||
+ p_343713_.blockEntities.add(p_343478_); //FORGE: Fix MC-112730
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
--- a/net/minecraft/client/renderer/entity/EntityRenderer.java
|
||||
+++ b/net/minecraft/client/renderer/entity/EntityRenderer.java
|
||||
@@ -109,8 +_,9 @@
|
||||
renderLeash(p_114488_, p_114489_, entityrenderstate$leashstate);
|
||||
@@ -113,8 +_,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (p_370221_.nameTag != null) {
|
||||
@@ -12,16 +12,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,7 +_,7 @@
|
||||
@@ -252,7 +_,7 @@
|
||||
}
|
||||
|
||||
p_367427_.distanceToCameraSq = this.entityRenderDispatcher.distanceToSqr(p_367571_);
|
||||
- boolean flag = p_367427_.distanceToCameraSq < 4096.0 && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq);
|
||||
+ boolean flag = net.minecraftforge.client.ForgeHooksClient.isNameplateInRenderDistance(p_367571_, p_367427_.distanceToCameraSq) && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq);
|
||||
if (flag) {
|
||||
- boolean flag1 = p_367427_.distanceToCameraSq < 4096.0 && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq);
|
||||
+ boolean flag1 = net.minecraftforge.client.ForgeHooksClient.isNameplateInRenderDistance(p_367571_, p_367427_.distanceToCameraSq) && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq);
|
||||
if (flag1) {
|
||||
p_367427_.nameTag = this.getNameTag(p_367571_);
|
||||
p_367427_.nameTagAttachment = p_367571_.getAttachments().getNullable(EntityAttachment.NAME_TAG, 0, p_367571_.getYRot(p_363243_));
|
||||
@@ -372,6 +_,7 @@
|
||||
@@ -387,6 +_,7 @@
|
||||
}
|
||||
|
||||
protected void extractAdditionalHitboxes(T p_392955_, Builder<HitboxRenderState> p_395671_, float p_395030_) {
|
||||
|
||||
Loaded 100 of 642 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user