incompatible mods stuff

This commit is contained in:
Mister_Nebula 2022-05-11 00:04:53 +01:00
parent c2703f3014
commit 9b0791bc4a
3 changed files with 40 additions and 2 deletions

View File

@ -13,6 +13,8 @@ public class PlayerJoinMessage : QSBMessage
private string QSBVersion;
private string GameVersion;
private bool DlcInstalled;
// empty if no incompatible mods
private string FirstIncompatibleMod;
private int[] AddonHashes;
@ -23,6 +25,17 @@ public class PlayerJoinMessage : QSBMessage
GameVersion = QSBCore.GameVersion;
DlcInstalled = QSBCore.DLCInstalled;
var allEnabledMods = QSBCore.Helper.Interaction.GetMods();
FirstIncompatibleMod = "";
foreach (var mod in allEnabledMods)
{
if (QSBCore.IncompatibleMods.Contains(mod.ModHelper.Manifest.UniqueName))
{
FirstIncompatibleMod = mod.ModHelper.Manifest.UniqueName;
}
}
AddonHashes = QSBCore.Addons.Keys
.Select(x => x.GetStableHashCode())
.ToArray();
@ -35,6 +48,7 @@ public class PlayerJoinMessage : QSBMessage
writer.Write(QSBVersion);
writer.Write(GameVersion);
writer.Write(DlcInstalled);
writer.Write(FirstIncompatibleMod);
writer.Write(AddonHashes);
}
@ -46,6 +60,7 @@ public class PlayerJoinMessage : QSBMessage
QSBVersion = reader.ReadString();
GameVersion = reader.ReadString();
DlcInstalled = reader.Read<bool>();
FirstIncompatibleMod = reader.ReadString();
AddonHashes = reader.Read<int[]>();
}
@ -91,6 +106,12 @@ public class PlayerJoinMessage : QSBMessage
new PlayerKickMessage(From, $"Addon mismatch. (Client:{AddonHashes.Length} addons, Server:{addonHashes.Length} addons)").Send();
return;
}
if (FirstIncompatibleMod != "" && !QSBCore.IncompatibleModsAllowed)
{
DebugLog.ToConsole($"Error - Client {PlayerName} connecting with incompatible mod. (First mod found was {FirstIncompatibleMod})");
new PlayerKickMessage(From, $"Using an incompatible/disallowed mod. First mod found was {FirstIncompatibleMod}").Send();
}
}
var player = QSBPlayerManager.GetPlayer(From);

View File

@ -51,10 +51,22 @@ public class QSBCore : ModBehaviour
// ignore the last patch numbers like the title screen does
Application.version.Split('.').Take(3).Join(delimiter: ".");
public static bool DLCInstalled => EntitlementsManager.IsDlcOwned() == EntitlementsManager.AsyncOwnershipStatus.Owned;
public static bool IncompatibleModsAllowed { get; private set; }
public static IMenuAPI MenuApi { get; private set; }
public static DebugSettings DebugSettings { get; private set; } = new();
public static Storage Storage { get; private set; } = new();
public static readonly string[] IncompatibleMods = new[]
{
// cheats mods
"Glitch.AltDebugMenu",
"PacificEngine.CheatsMod",
// incompatible mods
"Raicuparta.NomaiVR",
"xen.NewHorizons",
"Vesper.AutoResume"
};
public void Awake()
{
EpicRerouter.ModSide.Interop.Go();
@ -174,7 +186,11 @@ public class QSBCore : ModBehaviour
DebugLog.DebugWrite("Assemblies initialized", MessageType.Success);
}
public override void Configure(IModConfig config) => DefaultServerIP = config.GetSettingsValue<string>("defaultServerIP");
public override void Configure(IModConfig config)
{
DefaultServerIP = config.GetSettingsValue<string>("defaultServerIP");
IncompatibleModsAllowed = config.GetSettingsValue<bool>("incompatibleModsAllowed");
}
#if DEBUG
private void Update()

View File

@ -1,6 +1,7 @@
{
"enabled": true,
"settings": {
"defaultServerIP": "localhost"
"defaultServerIP": "localhost",
"incompatibleModsAllowed": false
}
}