Skip to content

Commit

Permalink
Change to Mixin.
Browse files Browse the repository at this point in the history
  • Loading branch information
Satxm committed Nov 18, 2024
1 parent 501c8d4 commit 1e5a334
Show file tree
Hide file tree
Showing 12 changed files with 85 additions and 138 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ Modified from [TheGlitch76/mcpnp](https://github.com/TheGlitch76/mcpnp) project

## What Can It Do - 它的作用

For the `Oline Mode` button, there are now three options:
For the `Online Mode` button, there are now three options:
- `Enable`: enable genuine verification, which will verify login information against the Mojang server database, only allowing players who login with a Microsoft account to join,
- `Disable`: not verify login information, allows offline players to join,
- `Disable + UUID Fixer`: Attempt to match the Mojang server user name with the player name for offline mode players to obtain a unique UUID, Meanwhile, UUIDs are retained for users logging in with Microsoft accounts, It can also prevent the loss of backpack and inventory items.
Expand Down
24 changes: 0 additions & 24 deletions fabric/src/main/java/io/github/satxm/mcwifipnp/MCWiFiPnP.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
package io.github.satxm.mcwifipnp;

import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.client.screen.v1.Screens;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.PauseScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.commands.BanIpCommands;
import net.minecraft.server.commands.BanListCommands;
Expand All @@ -29,7 +21,6 @@ public class MCWiFiPnP implements ModInitializer {
public void onInitialize() {
ServerLifecycleEvents.SERVER_STARTING.register(this::onServerLoad);
ServerLifecycleEvents.SERVER_STOPPING.register(this::onServerStop);
ScreenEvents.AFTER_INIT.register(MCWiFiPnP::afterScreenInit);

CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
DeOpCommands.register(dispatcher);
Expand All @@ -44,21 +35,6 @@ public void onInitialize() {
});
}

public static void afterScreenInit(Minecraft client, Screen screen, int i, int j) {
if (screen instanceof PauseScreen) {
for (AbstractWidget button : Screens.getButtons(screen)) {
if (button.getMessage().equals(Component.translatable("menu.shareToLan"))) {
Button newButton = Button.builder(Component.translatable("menu.shareToLan"), $ -> {
client.setScreen(new ShareToLanScreenNew(screen));
}).bounds(button.getX(), button.getY(), button.getWidth(), button.getHeight()).build();
newButton.active = button.active;
Screens.getButtons(screen).remove(button);
Screens.getButtons(screen).add(newButton);
}
}
}
}

private void onServerLoad(MinecraftServer server) {
MCWiFiPnPUnit.ReadingConfig(server);
}
Expand Down
40 changes: 0 additions & 40 deletions forge/src/main/java/io/github/satxm/mcwifipnp/MCWiFiPnP.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
package io.github.satxm.mcwifipnp;

import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.PauseScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.server.commands.BanIpCommands;
import net.minecraft.server.commands.BanListCommands;
import net.minecraft.server.commands.BanPlayerCommands;
Expand All @@ -18,7 +8,6 @@
import net.minecraft.server.commands.DeOpCommands;
import net.minecraft.server.commands.OpCommand;
import net.minecraft.server.commands.WhitelistCommand;
import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.server.ServerStartingEvent;
Expand All @@ -33,9 +22,6 @@ public class MCWiFiPnP {
public MCWiFiPnP() {
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.addListener(this::onRegisterCommands);
MinecraftForge.EVENT_BUS.addListener((final ScreenEvent.Init.Post evt) -> {
onAfterInitScreen(evt.getScreen().getMinecraft(), evt.getScreen(), evt.getListenersList(), evt::addListener, evt::removeListener);
});
}

@SubscribeEvent
Expand All @@ -61,30 +47,4 @@ public void onServerStopping(ServerStoppingEvent event) {
MCWiFiPnPUnit.CloseUPnPPort(event.getServer());
}

public static void onAfterInitScreen(Minecraft client, Screen screen, List<GuiEventListener> children,
Consumer<GuiEventListener> add, Consumer<GuiEventListener> remove) {
if (screen instanceof PauseScreen pauseScreen && screen.getClass() == PauseScreen.class) {
if (pauseScreen.showsPauseMenu()) {
findButton(children).ifPresent(button -> {
Button newButton = Button.builder(Component.translatable("menu.shareToLan"), $ -> {
client.setScreen(new ShareToLanScreenNew(screen));
}).bounds(button.getX(), button.getY(), button.getWidth(), button.getHeight()).build();
newButton.active = button.active;
remove.accept(button);
add.accept(newButton);
});
}
}
}

private static Optional<Button> findButton(List<GuiEventListener> widgets) {
for (GuiEventListener widget : widgets) {
if (widget instanceof Button button) {
if (button.getMessage().equals(Component.translatable("menu.shareToLan")))
return Optional.of(button);
}
}
return Optional.empty();
}

}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ org.gradle.debug = false

# Mod Properties
mod_id = mcwifipnp
mod_version = 1.7.3
mod_version = 1.7.4
mod_group_id = io.github.satxm.mcwifipnp

# Minecraft Properties
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
40 changes: 0 additions & 40 deletions neoforge/src/main/java/io/github/satxm/mcwifipnp/MCWiFiPnP.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
package io.github.satxm.mcwifipnp;

import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.PauseScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.server.commands.BanIpCommands;
import net.minecraft.server.commands.BanListCommands;
import net.minecraft.server.commands.BanPlayerCommands;
Expand All @@ -21,7 +11,6 @@
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.event.ScreenEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.server.ServerStartingEvent;
Expand All @@ -34,9 +23,6 @@ public class MCWiFiPnP {
public MCWiFiPnP(IEventBus modEventBus) {
NeoForge.EVENT_BUS.register(this);
NeoForge.EVENT_BUS.addListener(this::onRegisterCommands);
NeoForge.EVENT_BUS.addListener((final ScreenEvent.Init.Post evt) -> {
onAfterInitScreen(evt.getScreen().getMinecraft(), evt.getScreen(), evt.getListenersList(), evt::addListener, evt::removeListener);
});
}

@SubscribeEvent
Expand All @@ -62,30 +48,4 @@ public void onServerStopping(ServerStoppingEvent event) {
MCWiFiPnPUnit.CloseUPnPPort(event.getServer());
}

public static void onAfterInitScreen(Minecraft client, Screen screen, List<GuiEventListener> children,
Consumer<GuiEventListener> add, Consumer<GuiEventListener> remove) {
if (screen instanceof PauseScreen pauseScreen && screen.getClass() == PauseScreen.class) {
if (pauseScreen.showsPauseMenu()) {
findButton(children).ifPresent(button -> {
Button newButton = Button.builder(Component.translatable("menu.shareToLan"), $ -> {
client.setScreen(new ShareToLanScreenNew(screen));
}).bounds(button.getX(), button.getY(), button.getWidth(), button.getHeight()).build();
newButton.active = button.active;
remove.accept(button);
add.accept(newButton);
});
}
}
}

private static Optional<Button> findButton(List<GuiEventListener> widgets) {
for (GuiEventListener widget : widgets) {
if (widget instanceof Button button) {
if (button.getMessage().equals(Component.translatable("menu.shareToLan")))
return Optional.of(button);
}
}
return Optional.empty();
}

}
23 changes: 0 additions & 23 deletions quilt/src/main/java/io/github/satxm/mcwifipnp/MCWiFiPnP.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,7 @@
import org.quiltmc.qsl.base.api.entrypoint.ModInitializer;
import org.quiltmc.qsl.command.api.CommandRegistrationCallback;
import org.quiltmc.qsl.lifecycle.api.event.ServerLifecycleEvents;
import org.quiltmc.qsl.screen.api.client.ScreenEvents;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.PauseScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.commands.BanIpCommands;
import net.minecraft.server.commands.BanListCommands;
Expand All @@ -29,7 +22,6 @@ public class MCWiFiPnP implements ModInitializer {
public void onInitialize(ModContainer mod) {
ServerLifecycleEvents.STARTING.register(this::onServerLoad);
ServerLifecycleEvents.STOPPING.register(this::onServerStop);
ScreenEvents.AFTER_INIT.register(MCWiFiPnP::afterScreenInit);

CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
DeOpCommands.register(dispatcher);
Expand All @@ -44,21 +36,6 @@ public void onInitialize(ModContainer mod) {
});
}

public static void afterScreenInit(Screen screen, Minecraft client, boolean i) {
if (screen instanceof PauseScreen) {
for (AbstractWidget button : screen.getButtons()) {
if (button.getMessage().equals(Component.translatable("menu.shareToLan"))) {
Button newButton = Button.builder(Component.translatable("menu.shareToLan"), $ -> {
client.setScreen(new ShareToLanScreenNew(screen));
}).bounds(button.getX(), button.getY(), button.getWidth(), button.getHeight()).build();
newButton.active = button.active;
screen.getButtons().remove(button);
screen.getButtons().add(newButton);
}
}
}
}

private void onServerLoad(MinecraftServer server) {
MCWiFiPnPUnit.ReadingConfig(server);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/io/github/satxm/mcwifipnp/MCWiFiPnPUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public static void ReadingConfig(MinecraftServer server) {
Path location = server.getWorldPath(LevelResource.ROOT).resolve("mcwifipnp.json");
MCWiFiPnPUnit.Config cfg;
try {
cfg = gson.fromJson(new String(Files.readAllBytes(location),"utf-8"), MCWiFiPnPUnit.Config.class);
cfg = gson.fromJson(new String(Files.readAllBytes(location), "utf-8"), MCWiFiPnPUnit.Config.class);
cfg.location = location;
} catch (IOException | JsonParseException e) {
try {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.github.satxm.mcwifipnp.mixin;

import net.minecraft.client.gui.layouts.LayoutElement;
import net.minecraft.client.gui.layouts.GridLayout;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

import java.util.List;

@Mixin(GridLayout.class)
public interface AccessorGridLayout {
@Accessor
List<LayoutElement> getChildren();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package io.github.satxm.mcwifipnp.mixin;

import io.github.satxm.mcwifipnp.ShareToLanScreenNew;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.layouts.GridLayout;
import net.minecraft.client.gui.layouts.LayoutElement;
import net.minecraft.client.gui.screens.PauseScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentContents;
import net.minecraft.network.chat.contents.TranslatableContents;
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.Arrays;
import java.util.List;

@Mixin(PauseScreen.class)
public abstract class MixinPauseScreen extends Screen {
protected MixinPauseScreen(Component title) {
super(title);
}

@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/layouts/GridLayout;visitWidgets(Ljava/util/function/Consumer;)V"), method = "createPauseMenu", locals = LocalCapture.CAPTURE_FAILSOFT)
public void buttonOverride(CallbackInfo ci, GridLayout gridlayout, GridLayout.RowHelper helper) {
if (gridlayout != null) {
final List<LayoutElement> buttons = ((AccessorGridLayout) gridlayout).getChildren();
for (int i = 0; i < buttons.size(); i++) {
LayoutElement widget = buttons.get(i);
boolean isShareToLan = this.buttonHasText(widget, "menu.shareToLan");
if (widget instanceof Button button) {
if (isShareToLan) {
Button newButton = Button.builder(Component.translatable("menu.shareToLan"), b -> {
this.minecraft.setScreen(new ShareToLanScreenNew(this));
}).bounds(button.getX(), button.getY(), button.getWidth(), button.getHeight()).build();
newButton.active = this.minecraft.hasSingleplayerServer() && !this.minecraft.getSingleplayerServer().isPublished();
buttons.set(i,newButton);
}
}

}
}
}

private static boolean buttonHasText(LayoutElement element, String... translationKeys) {
if (element instanceof Button button) {
Component component = button.getMessage();
ComponentContents textContent = component.getContents();

return textContent instanceof TranslatableContents && Arrays.stream(translationKeys)
.anyMatch(s -> ((TranslatableContents) textContent).getKey().equals(s));
}
return false;
}
}
12 changes: 6 additions & 6 deletions src/main/resources/assets/mcwifipnp/lang/ru_ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@
"mcwifipnp.gui.motd": "Описание",
"mcwifipnp.gui.motd.info": "Информация о сервере, отображаемая под названием в списке сетевой игры.",
"mcwifipnp.gui.AllPlayersCheats": "Использование команд",
"mcwifipnp.gui.AllPlayersCheats.info": "Разрешать другим игрокам использовать команды.",
"mcwifipnp.gui.AllPlayersCheats.info": "Включите, чтобы автоматически назначать других игроков операторами, когда они присоединяются к серверу. Вы также можете использовать /op, чтобы назначить кого-то оператором.",
"mcwifipnp.gui.Whitelist": "Белый список",
"mcwifipnp.gui.Whitelist.info": "Принудительное включение белого списка. Если эта функция включена, только игроки, внесённые в этот список, смогут подключаться к серверу. Используйте /whitelist для добавления игроков в список.",
"mcwifipnp.gui.Whitelist.info": "Принудительный белый список. Если включено, только игроки, внесённые в этот список, смогут подключаться к серверу. Используйте /whitelist для добавления игроков в список.",
"mcwifipnp.gui.OnlineMode": "Проверка лицензии",
"mcwifipnp.gui.OnlineMode.info": "Подключается к базе данных учётных записей Minecraft для проверки логинов. Отключите, чтобы разрешить подключение учётных записей без лицензии.",
"mcwifipnp.gui.OnlineMode.online": "Включить",
"mcwifipnp.gui.OnlineMode.online.info": "Включение проверки лицензии позволит подключиться к этому серверу только игрокам, которые вошли в систему с учётной записью Microsoft.",
"mcwifipnp.gui.OnlineMode.offline": "Отключить",
"mcwifipnp.gui.OnlineMode.offline.info": "Отключение проверки лицензии позволит игрокам, которые войдут в систему в автономном режиме, присоединиться к этому серверу.",
"mcwifipnp.gui.OnlineMode.fixuuid": "Отключить с исправлением UUID",
"mcwifipnp.gui.OnlineMode.fixuuid.info": "Попытается сопоставить имя пользователя сервера Mojang с именем игрока для игроков в автономном режиме, чтобы получить уникальный UUID. \nМежду тем, UUID сохраняются для пользователей, входящих в систему с помощью учетных записей Майкрософт.\nЭто также может предотвратить потерю предметов рюкзака и инвентаря.",
"mcwifipnp.gui.OnlineMode.offline.info": "Отключение проверки лицензии позволит игрокам, вошедшим в систему в автономном режиме, присоединиться к этому серверу.",
"mcwifipnp.gui.OnlineMode.fixuuid": "Отключить + исправление UUID",
"mcwifipnp.gui.OnlineMode.fixuuid.info": "Попытается сопоставить имя пользователя сервера Mojang с именем игрока для игроков в автономном режиме, чтобы получить уникальный UUID. \nМежду тем, UUID сохраняются для пользователей, входящих в систему с помощью учётных записей Microsoft.\nЭто также может предотвратить потерю рюкзака и предметов инвентаря.",
"mcwifipnp.gui.PvP": "PvP",
"mcwifipnp.gui.PvP.info": "Переключает возможность игроков наносить прямой урон друг другу. Отключение режима PvP также не позволит вам получать урон от ваших собственных снарядов.",
"mcwifipnp.gui.PvP.info": "Переключаетель урона между игроки, а также возможности вам получать урон от ваших собственных снарядов.",
"mcwifipnp.gui.UseUPnP": "Переадресация порта",
"mcwifipnp.gui.UseUPnP.info": "Следует ли использовать функцию UPnP для сопоставления номера игрового порта локальной сети.",
"mcwifipnp.gui.Local": "Локальный",
Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/mcwifipnp.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
"refmap": "mcwifipnp-refmap.json",
"client": [
"PlayerListAccessor",
"MixinUUIDUtil"
"MixinUUIDUtil",
"AccessorGridLayout",
"MixinPauseScreen"
],
"injectors": {
"defaultRequire": 1
Expand Down

0 comments on commit 1e5a334

Please sign in to comment.