Skip to content

Commit

Permalink
server compatibility
Browse files Browse the repository at this point in the history
Signed-off-by: Nekeras <git@nekeras.de>
  • Loading branch information
nimueller committed Apr 13, 2021
1 parent 7f7d120 commit dab285a
Show file tree
Hide file tree
Showing 12 changed files with 210 additions and 227 deletions.
31 changes: 17 additions & 14 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import java.time.format.DateTimeFormatter
val minecraftVersion: String by extra
val modVersion: String by extra
val forgeVersion: String by extra
val forgeMappings: String by extra

buildscript {
repositories {
Expand All @@ -28,11 +27,11 @@ apply(plugin = "net.minecraftforge.gradle")
val mainSourceSet: SourceSet = java.sourceSets.findByName("main")!!

fun DependencyHandlerScope.minecraft(): ExternalModuleDependency =
create(
group = "net.minecraftforge",
name = "forge",
version = "${minecraftVersion}-${forgeVersion}"
).apply { add("minecraft", this) }
create(
group = "net.minecraftforge",
name = "forge",
version = "${minecraftVersion}-${forgeVersion}"
).apply { add("minecraft", this) }

group = "de.nekeras"
version = "${minecraftVersion}-${modVersion}"
Expand All @@ -54,7 +53,7 @@ dependencies {
}

configure<MinecraftExtension> {
mappings("snapshot", forgeMappings)
mappings("official", minecraftVersion)

runs {
"client" {
Expand All @@ -74,18 +73,20 @@ configure<MinecraftExtension> {

tasks.withType<Jar> {
manifest {
attributes(mapOf(
attributes(
mapOf(
"Specification-Title" to project.name,
"Specification-Vendor" to "Nekeras",
"Specification-Version" to project.version,
"Implementation-Title" to project.name,
"Implementation-Version" to project.version,
"Implementation-Vendor" to "Nekeras",
"Implementation-Timestamp" to DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")
.withZone(ZoneId.systemDefault())
.format(Instant.now())
))
.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")
.withZone(ZoneId.systemDefault())
.format(Instant.now())
)
)
}
}

Expand All @@ -98,10 +99,12 @@ tasks.withType<ProcessResources> {

from(mainSourceSet.resources.srcDirs) {
include("META-INF/mods.toml")
expand(mapOf(
expand(
mapOf(
"version" to project.version,
"forge_version_major" to forgeVersion.split(".")[0]
))
)
)
}
}

Expand Down
12 changes: 5 additions & 7 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs = -Xmx3G
org.gradle.daemon = false

minecraftVersion = 1.16.4
modVersion = 1.1.0
forgeVersion = 35.0.0
forgeMappings = 20200514-1.16
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false
minecraftVersion=1.16.5
modVersion=1.1.1
forgeVersion=36.0.0
112 changes: 19 additions & 93 deletions src/main/java/de/nekeras/borderless/Borderless.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,8 @@
package de.nekeras.borderless;

import java.util.Objects;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.glfw.GLFW;

import de.nekeras.borderless.config.Config;
import de.nekeras.borderless.config.gui.ConfigScreen;
import de.nekeras.borderless.fullscreen.FullscreenMode;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DeferredWorkQueue;
import net.minecraftforge.fml.ExtensionPoint;
Expand All @@ -25,6 +12,11 @@
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.network.FMLNetworkConstants;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.annotation.Nullable;

/**
* The main Forge mod class.
Expand All @@ -39,103 +31,37 @@ public class Borderless {
public static final String MOD_ID = "borderless";

private static final Logger log = LogManager.getLogger();
private static FullscreenMode fullscreenMode;

public Borderless() {
ModLoadingContext context = ModLoadingContext.get();

// Client dist only, make sure server is always compatible with this mod
context.registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(
() -> FMLNetworkConstants.IGNORESERVERONLY,
(a, b) -> true));
() -> FMLNetworkConstants.IGNORESERVERONLY,
(a, b) -> true));

// Config registration
// Register the config
context.registerConfig(ModConfig.Type.CLIENT, Config.CONFIG_SPEC);
context.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY,
() -> (mc, modListScreen) -> new ConfigScreen(modListScreen));
}

@SuppressWarnings("deprecation")
@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public static void onClientSetup(@Nullable FMLClientSetupEvent event) {
fullscreenMode = FullscreenMode.fromConfig();

log.info("Enqueue WindowEventListener update to main thread");
ModLoadingContext context = ModLoadingContext.get();

DeferredWorkQueue.runLater(() -> {
log.info("Overwriting Minecraft WindowEventListener");
Minecraft minecraft = Minecraft.getInstance();
MainWindow window = minecraft.getMainWindow();
ReflectionUtil.updateWindowEventListener(window, FullscreenWindowEventListener::new);
log.info("Overwrite finished");
// Config registration
context.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY,
() -> (mc, modListScreen) -> new de.nekeras.borderless.config.gui.ConfigScreen(modListScreen));

forceFullscreenModeUpdate();
});
log.info("Enqueue initialization work to main thread");
DeferredWorkQueue.runLater(FullscreenModeHolder::initMinecraft);
}

@OnlyIn(Dist.CLIENT)
@SubscribeEvent
public void onConfigReload(ModConfig.Reloading event) {
setFullscreenMode(FullscreenMode.fromConfig());
de.nekeras.borderless.FullscreenModeHolder.setFullscreenMode(
de.nekeras.borderless.fullscreen.FullscreenMode.fromConfig());
}

/**
* Checks whether the {@link MainWindow} is currently in native fullscreen. This
* may return different results than {@link MainWindow#isFullscreen()}. The window is considered
* in native fullscreen if {@link GLFW#glfwGetWindowMonitor(long)} returns non-null and
* {@link MainWindow#isFullscreen()} returns <code>true</code>.
*
* @return <code>true</code> if the window is currently in native fullscreen, otherwise
* <code>false</code>
*/
public static boolean isInNativeFullscreen(@Nonnull MainWindow window) {
return window.isFullscreen() && GLFW.glfwGetWindowMonitor(window.getHandle()) != 0;
}

/**
* The fullscreen mode that is applied instead of the native fullscreen once the user hits
* F11 or switches to fullscreen in the video settings.
*
* @return The fullscreen mode
*/
public static FullscreenMode getFullscreenMode() {
return fullscreenMode;
}

/**
* The fullscreen mode that is applied instead of the native fullscreen once the user hits
* F11 or switches to fullscreen in the video settings.
*
* @param fullscreenMode
* The fullscreen mode
*/
public static void setFullscreenMode(@Nonnull FullscreenMode fullscreenMode) {
Objects.requireNonNull(fullscreenMode);

Minecraft minecraft = Minecraft.getInstance();
MainWindow window = minecraft.getMainWindow();
FullscreenMode currentFullscreenMode = Borderless.getFullscreenMode();

log.info("Resetting fullscreen mode '{}' - Window fullscreen: {}; Native fullscreen: {}",
currentFullscreenMode == null ? null : currentFullscreenMode.getClass().getName(),
window.isFullscreen(),
isInNativeFullscreen(window));

if (currentFullscreenMode != null) {
currentFullscreenMode.reset(window);
}

if (window.isFullscreen()) {
log.info("Applying fullscreen mode '{}'", fullscreenMode.getClass().getName());
Borderless.fullscreenMode = fullscreenMode;
fullscreenMode.apply(window);
}
}

/**
* Triggers an update for current {@link FullscreenMode}.
*/
public static void forceFullscreenModeUpdate() {
setFullscreenMode(getFullscreenMode());
}

}
90 changes: 90 additions & 0 deletions src/main/java/de/nekeras/borderless/FullscreenModeHolder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package de.nekeras.borderless;

import de.nekeras.borderless.fullscreen.FullscreenMode;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.glfw.GLFW;

import javax.annotation.Nonnull;
import java.util.Objects;

public class FullscreenModeHolder {

private static final Logger log = LogManager.getLogger();
private static FullscreenMode fullscreenMode;

/**
* Initializes the Minecraft environment to make it compatible with this mod.
*/
public static void initMinecraft() {
log.info("Reading fullscreen mode from config");
fullscreenMode = FullscreenMode.fromConfig();
log.info("Overwriting Minecraft WindowEventListener");
Minecraft minecraft = Minecraft.getInstance();
MainWindow window = minecraft.getWindow();
ReflectionUtil.updateWindowEventListener(window, FullscreenWindowEventListener::new);
log.info("Overwrite finished");
FullscreenModeHolder.forceFullscreenModeUpdate();
}

/**
* Checks whether the {@link MainWindow} is currently in native fullscreen. This
* may return different results than {@link MainWindow#isFullscreen()}. The window is considered
* in native fullscreen if {@link GLFW#glfwGetWindowMonitor(long)} returns non-null and
* {@link MainWindow#isFullscreen()} returns <code>true</code>.
*
* @return <code>true</code> if the window is currently in native fullscreen, otherwise
* <code>false</code>
*/
public static boolean isInNativeFullscreen(@Nonnull MainWindow window) {
return window.isFullscreen() && GLFW.glfwGetWindowMonitor(window.getWindow()) != 0;
}

/**
* The fullscreen mode that is applied instead of the native fullscreen once the user hits
* F11 or switches to fullscreen in the video settings.
*
* @return The fullscreen mode
*/
public static FullscreenMode getFullscreenMode() {
return fullscreenMode;
}

/**
* The fullscreen mode that is applied instead of the native fullscreen once the user hits
* F11 or switches to fullscreen in the video settings.
*
* @param fullscreenMode The fullscreen mode
*/
public static void setFullscreenMode(@Nonnull FullscreenMode fullscreenMode) {
Objects.requireNonNull(fullscreenMode);

Minecraft minecraft = Minecraft.getInstance();
MainWindow window = minecraft.getWindow();
FullscreenMode currentFullscreenMode = getFullscreenMode();

log.info("Resetting fullscreen mode '{}' - Window fullscreen: {}; Native fullscreen: {}",
currentFullscreenMode == null ? null : currentFullscreenMode.getClass().getName(),
window.isFullscreen(),
isInNativeFullscreen(window));

if (currentFullscreenMode != null) {
currentFullscreenMode.reset(window);
}

if (window.isFullscreen()) {
log.info("Applying fullscreen mode '{}'", fullscreenMode.getClass().getName());
FullscreenModeHolder.fullscreenMode = fullscreenMode;
fullscreenMode.apply(window);
}
}

/**
* Triggers an update for current {@link FullscreenMode}.
*/
public static void forceFullscreenModeUpdate() {
setFullscreenMode(getFullscreenMode());
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package de.nekeras.borderless;

import java.util.Objects;

import javax.annotation.Nonnull;

import de.nekeras.borderless.fullscreen.FullscreenMode;
import net.minecraft.client.MainWindow;
import net.minecraft.client.renderer.IWindowEventListener;

import javax.annotation.Nonnull;
import java.util.Objects;

/**
* A custom {@link IWindowEventListener} that will call all original methods of the supplied
* default event listener. In addition, this method will apply or reset the current fullscreen mode,
* once {@link MainWindow#isFullscreen()} returns <code>true</code> or <code>false</code>
* respectively.
*
* @see Borderless#getFullscreenMode()
* @see FullscreenModeHolder#getFullscreenMode()
* @see FullscreenMode#apply(MainWindow)
* @see FullscreenMode#reset(MainWindow)
*/
Expand All @@ -27,24 +26,23 @@ public FullscreenWindowEventListener(@Nonnull IWindowEventListener defaultWindow
}

@Override
public void setGameFocused(boolean focused) {
defaultWindowEventListener.setGameFocused(focused);
public void setWindowActive(boolean focused) {
defaultWindowEventListener.setWindowActive(focused);
}

@Override
public void updateWindowSize() {
defaultWindowEventListener.updateWindowSize();
public void resizeDisplay() {
defaultWindowEventListener.resizeDisplay();

if (ReflectionUtil.isCalledByGlfwCallback()) {
return;
}

Borderless.forceFullscreenModeUpdate();
FullscreenModeHolder.forceFullscreenModeUpdate();
}

@Override
public void func_241216_b_() {
defaultWindowEventListener.func_241216_b_();
public void cursorEntered() {
defaultWindowEventListener.cursorEntered();
}

}
Loading

0 comments on commit dab285a

Please sign in to comment.