Skip to content

Commit

Permalink
added close server button
Browse files Browse the repository at this point in the history
also made windowtitlemixin actually do its job
  • Loading branch information
Flooflez committed Jun 16, 2023
1 parent 8dea0ad commit 3f05e37
Show file tree
Hide file tree
Showing 7 changed files with 126 additions and 12 deletions.
6 changes: 2 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,11 @@ dependencies {

modImplementation(include("org.yaml:snakeyaml:1.8"))

modApi("me.shedaniel.cloth:cloth-config-fabric:7.0.72") {
exclude(group: "net.fabricmc.fabric-api")
}
modApi("me.shedaniel.cloth:cloth-config-fabric:11.0.99")

modImplementation(include("blue.endless:jankson:1.2.1"))

modImplementation(include("com.terraformersmc:modmenu:4.0.0"))
modApi("com.terraformersmc:modmenu:7.0.1")
}

processResources {
Expand Down
96 changes: 96 additions & 0 deletions src/main/java/alujjdnd/ngrok/lan/mixin/GameMenuScreenMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package alujjdnd.ngrok.lan.mixin;


import alujjdnd.ngrok.lan.NgrokLan;
import alujjdnd.ngrok.lan.config.NLanConfig;
import com.google.common.collect.Lists;
import com.mojang.authlib.GameProfile;
import com.terraformersmc.modmenu.mixin.AccessorGridWidget;
import me.shedaniel.autoconfig.AutoConfig;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.GameMenuScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.GridWidget;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.server.PlayerManager;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.text.TextContent;
import net.minecraft.text.TranslatableTextContent;
import net.minecraft.util.Formatting;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import java.util.List;

@Mixin(GameMenuScreen.class)
public class GameMenuScreenMixin extends Screen {

NLanConfig config = AutoConfig.getConfigHolder(NLanConfig.class).getConfig();
MinecraftClient mc = MinecraftClient.getInstance();

protected GameMenuScreenMixin(Text title) {
super(title);
}


@Inject(method = "initWidgets", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;forEachChild(Ljava/util/function/Consumer;)V"), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
private void onInitWidgets(CallbackInfo ci, GridWidget gridWidget, GridWidget.Adder adder, Text text) {

if (config.enabledCheckBox) { //if ngrok server open
if (gridWidget != null) {
final List<Widget> buttons = ((AccessorGridWidget) gridWidget).getChildren();

for (Widget widget : buttons) {
if (buttonHasText(widget, "menu.playerReporting")) { //find player report button
this.addDrawableChild(ButtonWidget.builder(Text.translatable("text.UI.ngroklan.closeServerButton"), (button) -> {
this.client.setScreen(null);
closeServer();
}).dimensions(widget.getX() + 100, widget.getY(), 80, widget.getHeight()).build());
}
}
}
}
}

private boolean buttonHasText(Widget widget, String translationKey) {
if (widget instanceof ButtonWidget button) {
Text text = button.getMessage();
TextContent textContent = text.getContent();
return textContent instanceof TranslatableTextContent && ((TranslatableTextContent) textContent).getKey().equals(translationKey);
}
return false;
}

private void closeServer(){
NgrokLan.LOGGER.info("Closing LAN server...");
PlayerManager playerManager = mc.getServer().getPlayerManager();
List<ServerPlayerEntity> list = Lists.newArrayList(playerManager.getPlayerList());

for (ServerPlayerEntity serverPlayerEntity : list) {
GameProfile profile = serverPlayerEntity.getGameProfile();
if(!mc.getServer().isHost(profile)){
serverPlayerEntity.networkHandler.disconnect(Text.translatable("multiplayer.disconnect.server_shutdown"));
}
}

mc.getServer().getNetworkIo().stop(); //stop listening to port
((IntegratedServerAccessor) mc.getServer()).setLanPort(-1);
((IntegratedServerAccessor) mc.getServer()).getLanPinger().interrupt();

//fix the window title
MinecraftClient.getInstance().updateWindowTitle();

if(NgrokLan.serverOpen){ //kill ngrok tunnel
NgrokLan.LOGGER.info("Closing Ngrok LAN, but world is open");
NgrokLan.ngrokClient.kill();
NgrokLan.serverOpen = false;
}
mc.inGameHud.getChatHud().addMessage(Text.translatable("text.info.ngroklan.closeMessage").formatted(Formatting.YELLOW));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package alujjdnd.ngrok.lan.mixin;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.client.network.LanServerPinger;
import net.minecraft.server.integrated.IntegratedServer;

@Mixin(IntegratedServer.class)
public interface IntegratedServerAccessor {
@Accessor
public void setLanPort(int lanPort);

@Accessor
public LanServerPinger getLanPinger();
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ private void initWidgets(CallbackInfo info) {

private void ngrokInit(int port, Region region) {

//Defines a new threaded function to oepn the Ngrok tunnel, so that the "Open to LAN" button does not hitch - this thread runs in a seperate process from the main game loop
//Defines a new threaded function to open the Ngrok tunnel, so that the "Open to LAN" button does not hitch - this thread runs in a seperate process from the main game loop
Thread thread = new Thread(() ->
{
if (config.authToken.equals("AuthToken")) {
Expand Down Expand Up @@ -117,14 +117,13 @@ private void ngrokInit(int port, Region region) {
MutableText textStart;

if (this.client.getServer().openToLan(this.gameMode, this.allowCommands, port)) {
mc.getServer().setOnlineMode(config.onlineCheckBox);
mc.getServer().setOnlineMode(config.onlineCheckBox); //online mode (player auth)
textStart = Text.translatable("commands.publish.started", port);
NgrokLan.serverOpen = true;

//I made a new thread that reads the json files to update the oplist and whitelist in the playermanager
//new thread that reads the json files to update the oplist and whitelist in the playermanager
Thread thread2 = new Thread(() -> {


boolean loaded = loadJson();
if(loaded){
MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.translatable("text.info.ngroklan.reload.success").styled(style -> style.withColor(Formatting.GREEN) ));
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/alujjdnd/ngrok/lan/mixin/WindowTitleMixin.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package alujjdnd.ngrok.lan.mixin;

import alujjdnd.ngrok.lan.NgrokLan;
import net.minecraft.SharedConstants;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.resource.language.I18n;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -12,9 +13,10 @@
public abstract class WindowTitleMixin {
@Inject(method = "getWindowTitle", at = @At("HEAD"), cancellable = true)
private void injected(CallbackInfoReturnable<String> cir) {
StringBuilder stringBuilder2 = new StringBuilder(I18n.translate("text.title.ngroklan.window"));

if(NgrokLan.serverOpen){
StringBuilder stringBuilder2 = new StringBuilder("Minecraft* ");
stringBuilder2.append(SharedConstants.getGameVersion().getName());
stringBuilder2.append(I18n.translate("text.title.ngroklan.window"));
cir.setReturnValue(stringBuilder2.toString());
}

Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/assets/ngroklan/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
"text.autoconfig.ngroklan.option.regionSelect": "Ngrok Region",
"text.UI.ngroklan.LanButton": "Open Public Server",
"text.UI.ngroklan.onlineButton": "Online Mode",
"text.UI.ngroklan.closeServerButton": "Close Server",
"text.info.ngroklan.joinMessage": "Server is Powered by Ngrok LAN",
"text.info.ngroklan.closeMessage": "Server now closed!",
"text.error.ngroklan.AuthTokenError" : "Please set your Ngrok AuthToken! Do this in your menu > Mods > Ngrok LAN > Sliders Icon > Auth Token",
"text.info.ngroklan.startMessage": "Starting Ngrok Service...",
"text.info.ngroklan.success" : "Ngrok Service Initiated Successfully!",
"text.info.ngroklan.ip" : "Your server IP is - %s - (Copied to Clipboard)",
"text.error.ngroklan.fail" : "Ngrok Service Initiation Failed!",
"text.title.ngroklan.window" : "Minecraft* 1.19.4 - Multiplayer (Ngrok-LAN)",
"text.title.ngroklan.window" : " - Multiplayer (Ngrok-LAN)",
"text.info.ngroklan.click.reload" : "Click to reload whitelist and op list",
"text.info.ngroklan.reload.prompt" : "Click here to reload",
"text.info.ngroklan.reload.message" : "An error occurred loading the whitelist and op list",
Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/ngroklan.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
],
"client": [
"CloseTunnelMixin",
"OpenToLanScreenMixin"
"OpenToLanScreenMixin",
"GameMenuScreenMixin",
"IntegratedServerAccessor"
],
"injectors": {
"defaultRequire": 1
Expand Down

0 comments on commit 3f05e37

Please sign in to comment.