Skip to content

Commit

Permalink
Mode Validation Checks Between Client and Server
Browse files Browse the repository at this point in the history
  • Loading branch information
IntegerLimit committed Feb 22, 2025
1 parent 11b9eff commit 26fd909
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -717,6 +717,11 @@ public static class Advanced {
@Config.LangKey("config.nomilabs.advanced.server_welcome_name")
public String serverWelcomeName = "Minecraft";

@Config.Comment({ "Whether mode check fail message should link to the Nomi-CEu GitHub page.",
"[default: false]" })
@Config.LangKey("config.nomilabs.advanced.mode_check_nomi_ceu")
public boolean modeCheckNomiCeuLink = false;

public static class WindowOverrides {

@Config.Comment({ "Override for the Minecraft Window Title.",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.nomiceu.nomilabs.mixin.vanilla;

import java.util.List;
import java.util.Map;

import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import com.nomiceu.nomilabs.NomiLabs;
import com.nomiceu.nomilabs.mixinhelper.AccessibleModListMessage;
import com.nomiceu.nomilabs.util.LabsModeHelper;

import io.netty.buffer.ByteBuf;

/**
* Sends Labs Mode Data in Mod List Handshake.
*/
@Mixin(value = FMLHandshakeMessage.ModList.class, remap = false)
public class FMLHandshakeMessageModListMixin implements AccessibleModListMessage {

@Shadow
private Map<String, String> modTags;
@Unique
private static final String labs$modeId = "\0LABS_MODE_DATA\0";

@Unique
private String labs$mode = "";

@Inject(method = "<init>(Ljava/util/List;)V", at = @At("TAIL"))
private void initModeData(List<ModContainer> modList, CallbackInfo ci) {
NomiLabs.LOGGER.info("[Labs Mode Validation] Injecting Mode Data into Mod List Handshake...");
labs$mode = LabsModeHelper.getMode();

modTags.put(labs$modeId, labs$mode);
}

@Inject(method = "fromBytes", at = @At("TAIL"))
private void initModeFromBytes(ByteBuf buffer, CallbackInfo ci) {
NomiLabs.LOGGER.info("[Labs Mode Validation] Reading Mode Data from Mod List Handshake...");
labs$mode = modTags.get(labs$modeId);

if (labs$mode == null) {
NomiLabs.LOGGER.error("[Labs Mode Validation] No Mode Data in Mod List Handshake!");
labs$mode = "";
}
}

@Unique
@Override
public String labs$getMode() {
return labs$mode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.nomiceu.nomilabs.mixin.vanilla;

import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage;
import net.minecraftforge.fml.common.network.internal.FMLNetworkHandler;
import net.minecraftforge.fml.relauncher.Side;

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.CallbackInfoReturnable;

import com.nomiceu.nomilabs.NomiLabs;
import com.nomiceu.nomilabs.config.LabsConfig;
import com.nomiceu.nomilabs.mixinhelper.AccessibleModListMessage;
import com.nomiceu.nomilabs.util.LabsModeHelper;

/**
* Checks Mode Data in Mod List Handshake.
*/
@Mixin(value = FMLNetworkHandler.class, remap = false)
public class FMLNetworkHandlerMixin {

@Inject(method = "checkModList(Lnet/minecraftforge/fml/common/network/handshake/FMLHandshakeMessage$ModList;Lnet/minecraftforge/fml/relauncher/Side;)Ljava/lang/String;",
at = @At("RETURN"),
cancellable = true)
private static void checkModeInfo(FMLHandshakeMessage.ModList modListPacket, Side side,
CallbackInfoReturnable<String> cir) {
if (cir.getReturnValue() != null) {
NomiLabs.LOGGER.error("[Labs Mode Validation] Ignoring Mode Checks due to Invalid Mod List!");
return;
}

String mode = ((AccessibleModListMessage) modListPacket).labs$getMode();
if (mode.isEmpty()) {
NomiLabs.LOGGER.error("[Labs Mode Validation] No Mode Data!");
cir.setReturnValue(
"§cMode Validation Failed!§r\n\nCheck your client and server, and make sure they are on the same version!");
return;
}

if (mode.equals(LabsModeHelper.getMode())) {
NomiLabs.LOGGER.info("[Labs Mode Validation] Mode Match.");
return;
}

NomiLabs.LOGGER.error("[Labs Mode Validation] Mode Mismatch! Received: {}, Expected: {}", mode,
LabsModeHelper.getMode());

String modeMismatchText;
// Data coming from server
if (side.isServer())
modeMismatchText = String.format("Server expects mode §a%s§r, but you are on mode §e%s§r!",
LabsModeHelper.formatMode(mode),
LabsModeHelper.getFormattedMode());
else
modeMismatchText = String.format("Server expects mode §a%s§r, but you are on mode §e%s§r!",
LabsModeHelper.getFormattedMode(), LabsModeHelper.formatMode(mode));

String linkText = "";
if (LabsConfig.advanced.modeCheckNomiCeuLink)
linkText = "\n\nSee §bhttps://github.com/Nomi-CEu/Nomi-CEu/blob/main/overrides/README.md§r for information on switching modes!";

cir.setReturnValue("§cServer Mode Rejection:§r" + "\n\n" + modeMismatchText + linkText);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.nomiceu.nomilabs.mixinhelper;

public interface AccessibleModListMessage {

String labs$getMode();
}
6 changes: 5 additions & 1 deletion src/main/java/com/nomiceu/nomilabs/util/LabsModeHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,11 @@ public static boolean isExpert() {
}

public static String getFormattedMode() {
return StringUtils.capitalize(getMode());
return formatMode(getMode());
}

public static String formatMode(String mode) {
return StringUtils.capitalize(mode);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/assets/nomilabs/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ config.nomilabs.advanced.client_side_methods=Client Side ONLY Methods
config.nomilabs.advanced.server_side_fields=Server Side ONLY Fields
config.nomilabs.advanced.server_side_methods=Server Side ONLY Methods
config.nomilabs.advanced.server_welcome_name=Server Welcome Name
config.nomilabs.advanced.mode_check_nomi_ceu=Mode Check Nomi-CEu Link

config.nomilabs.advanced.tiers=Quest Tier Detector Settings
config.nomilabs.advanced.tiers.normal_qb_ids=Normal Mode Quest IDs
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/mixins.nomilabs.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
"AccessibleFluidRegistry",
"CommandDifficultyMixin",
"FluidRegistryMixin",
"FMLHandshakeMessageModListMixin",
"FMLNetworkHandlerMixin",
"ForgeRegistryMixin",
"GameDataMixin",
"ItemStackMixin",
Expand Down

0 comments on commit 26fd909

Please sign in to comment.