From 2a521a1c777841a8fad10f55b2718fc697a6b04b Mon Sep 17 00:00:00 2001 From: Angel Pons <22937129+Th3Fanbus@users.noreply.github.com> Date: Wed, 8 May 2024 19:07:17 +0000 Subject: [PATCH 1/6] fix: Make Panini projection usable (#262) The main problem with the Panini projection material function is that the two inputs to a Lerp node were swapped. Besides fixing that, also set the default value for Scale to 1 (which matches the default value in-game) and add a comment to the MPC_Panini parameters about crashes and a possible (even if miserable) workaround: use the cooked asset. Tested using a custom material with a Xeno-Basher skeletal mesh and a custom mesh (red solo cup), equipment appears in the Pioneer's hand. Signed-off-by: Angel Pons --- .../MF_ApplyPaniniProjection.uasset | Bin 22907 -> 23487 bytes .../PostProcess/MF_PaniniProjection.uasset | Bin 30244 -> 30577 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Content/FactoryGame/PostProcess/MF_ApplyPaniniProjection.uasset b/Content/FactoryGame/PostProcess/MF_ApplyPaniniProjection.uasset index cd2106e069e046cb2e13b3a5d78eb913510612a7..54a930171b2a6acb88e261183200beb421d20da7 100644 GIT binary patch delta 6071 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 A2LJ#7 delta 5770 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 diff --git a/Content/FactoryGame/PostProcess/MF_PaniniProjection.uasset b/Content/FactoryGame/PostProcess/MF_PaniniProjection.uasset index 125097234223e3f986b1d9c30ad032e94419e72e..2c2a32da0316f26c0510604155ff244311589d0d 100644 GIT binary patch literal 30577 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 Date: Sat, 22 Jun 2024 08:44:18 -0400 Subject: [PATCH 2/6] Fix for Session Settings not syncing (#266) --- .../SessionSettingsSubsystem.cpp | 42 +++++++++++++++++++ .../SessionSettings/SessionSettingsManager.h | 2 + .../SessionSettingsSubsystem.h | 9 +++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/Mods/SML/Source/SML/Private/SessionSettings/SessionSettingsSubsystem.cpp b/Mods/SML/Source/SML/Private/SessionSettings/SessionSettingsSubsystem.cpp index 82dec8b6ff..dc70d9f21a 100644 --- a/Mods/SML/Source/SML/Private/SessionSettings/SessionSettingsSubsystem.cpp +++ b/Mods/SML/Source/SML/Private/SessionSettings/SessionSettingsSubsystem.cpp @@ -2,6 +2,8 @@ #include "FGGameMode.h" #include "FGPlayerController.h" #include "Subsystem/SubsystemActorManager.h" +#include "Settings/FGUserSettingApplyType.h" +#include "Net/UnrealNetwork.h" ASessionSettingsSubsystem::ASessionSettingsSubsystem() { ReplicationPolicy = ESubsystemReplicationPolicy::SpawnOnServer_Replicate; @@ -11,6 +13,14 @@ void ASessionSettingsSubsystem::Init() { USessionSettingsManager* SessionSettingsManager = GetWorld()->GetSubsystem(); check(SessionSettingsManager); + if (!HasAuthority()) + { + // We're a client, so we only have our own player controller + AFGPlayerController* PlayerController = Cast(GetWorld()->GetFirstPlayerController()); + USMLSessionSettingsRemoteCallObject* RCO = PlayerController->GetRemoteCallObjectOfClass(); + RCO->Server_RequestAllSessionSettings(); + } + OnOptionUpdatedDelegate = FOnOptionUpdated::CreateUObject(this, &ASessionSettingsSubsystem::OnSessionSettingUpdated); SessionSettingsManager->SubscribeToAllOptionUpdates(OnOptionUpdatedDelegate); } @@ -65,3 +75,35 @@ bool USMLSessionSettingsRemoteCallObject::Server_RequestSessionSettingUpdate_Val return SessionSettingsManager != NULL && SessionSettingsManager->FindSessionSetting(SessionSettingName) != NULL; } + +void USMLSessionSettingsRemoteCallObject::Server_RequestAllSessionSettings_Implementation() +{ + USessionSettingsManager* SessionSettingsManager = GetWorld()->GetSubsystem(); + TMap Settings = SessionSettingsManager->GetAllSessionSettings(); + for (TPair Setting : Settings) + { + FVariant AppliedValue = Setting.Value->GetAppliedValue(); + FString ValueString = USessionSettingsManager::VariantToString(AppliedValue); + Client_SendSessionSetting(Setting.Key, ValueString); + } +} + +bool USMLSessionSettingsRemoteCallObject::Server_RequestAllSessionSettings_Validate() +{ + USessionSettingsManager* SessionSettingsManager = GetWorld()->GetSubsystem(); + return SessionSettingsManager != NULL; +} + +void USMLSessionSettingsRemoteCallObject::Client_SendSessionSetting_Implementation(const FString& SessionSettingName, const FString& ValueString) +{ + ASessionSettingsSubsystem* SessionSettingsSubsystem = ASessionSettingsSubsystem::Get(GetWorld()); + check(SessionSettingsSubsystem); + + SessionSettingsSubsystem->PushSettingToSessionSettings(SessionSettingName, USessionSettingsManager::StringToVariant(ValueString)); +} + +bool USMLSessionSettingsRemoteCallObject::Client_SendSessionSetting_Validate(const FString& SessionSettingName, const FString& ValueString) +{ + const USessionSettingsManager* SessionSettingsManager = GetWorld()->GetSubsystem(); + return SessionSettingsManager != NULL && !SessionSettingName.IsEmpty() && !ValueString.IsEmpty(); +} \ No newline at end of file diff --git a/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsManager.h b/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsManager.h index 0e3b8537e0..3162cae73b 100644 --- a/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsManager.h +++ b/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsManager.h @@ -56,6 +56,8 @@ class SML_API USessionSettingsManager : public UWorldSubsystem, public IFGOption void SubscribeToAllOptionUpdates(const FOnOptionUpdated& onOptionUpdatedDelegate); void UnsubscribeToAllOptionUpdates(const FOnOptionUpdated& onOptionUpdatedDelegate); + TMap GetAllSessionSettings() { return SessionSettings; }; + UFUNCTION(BlueprintCallable, Category = "Session Settings Manager") void InitializeForMap(const TSoftObjectPtr& World, bool bAttemptPreserveValues); diff --git a/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsSubsystem.h b/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsSubsystem.h index 50b300d85f..fc2f52d2b3 100644 --- a/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsSubsystem.h +++ b/Mods/SML/Source/SML/Public/SessionSettings/SessionSettingsSubsystem.h @@ -13,8 +13,6 @@ class SML_API ASessionSettingsSubsystem : public AModSubsystem { virtual void Init() override; - // TODO: Use this to sync the settings to the client on join - static ASessionSettingsSubsystem* Get(UWorld* World); void OnSessionSettingUpdated(const FString StrID, FVariant value); @@ -36,6 +34,13 @@ class SML_API USMLSessionSettingsRemoteCallObject : public UFGRemoteCallObject { UFUNCTION(Server, Reliable, WithValidation) void Server_RequestSessionSettingUpdate(const FString& SessionSettingName, const FString& ValueString); + + UFUNCTION(Server, Reliable, WithValidation) + void Server_RequestAllSessionSettings(); + + UFUNCTION(Client, Reliable, WithValidation) + void Client_SendSessionSetting(const FString& SessionSettingName, const FString& ValueString); + private: UPROPERTY(Replicated) bool mForceNetField_USMLSessionSettingsRemoteCallObject; From f829d6aba87934999d84cc48c7b4917841a8d049 Mon Sep 17 00:00:00 2001 From: mircearoata Date: Thu, 27 Jun 2024 13:09:53 +0200 Subject: [PATCH 3/6] Use custom funchook build with global pages --- Mods/SML/Source/SML/SML.Build.cs | 13 +++++++------ Mods/SML/ThirdParty/Linux/libfunchook.a | Bin 148070 -> 150582 bytes Mods/SML/ThirdParty/Win64/distorm.lib | Bin 0 -> 84204 bytes Mods/SML/ThirdParty/Win64/funchook.lib | Bin 158066 -> 84266 bytes 4 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 Mods/SML/ThirdParty/Win64/distorm.lib diff --git a/Mods/SML/Source/SML/SML.Build.cs b/Mods/SML/Source/SML/SML.Build.cs index 0e3087e5b6..491835e05d 100644 --- a/Mods/SML/Source/SML/SML.Build.cs +++ b/Mods/SML/Source/SML/SML.Build.cs @@ -50,18 +50,19 @@ public SML(ReadOnlyTargetRules Target) : base(Target) if (Target.Platform == UnrealTargetPlatform.Win64) { - // https://github.com/kubo/funchook/tree/7cb8819594f0d586454011ab691fab4edb625068 - // Built using Visual Studio project generated by cmake - // funchook will additionally build distorm, which is added to the Visual Studio project - // as a dependency, along with psapi, so that they don't need to be included here separately + // https://github.com/satisfactorymodding/funchook/tree/7ccd6b8087f1a587af80de1a3dea405798989225 PublicAdditionalLibraries.Add(Path.Combine(LibraryFolder, "funchook.lib")); - + // funchook will additionally build distorm + PublicAdditionalLibraries.Add(Path.Combine(LibraryFolder, "distorm.lib")); + // funchook uses GetMappedFileNameA from psapi + PublicSystemLibraries.Add("psapi.lib"); + // https://github.com/satisfactorymodding/AssemblyAnalyzer/tree/e08ec4402b6e016a9b7aa59ab8c82dd0840e8f98 PublicAdditionalLibraries.Add(Path.Combine(LibraryFolder, "AssemblyAnalyzer.lib")); PublicAdditionalLibraries.Add(Path.Combine(LibraryFolder, "Zydis.lib")); PublicAdditionalLibraries.Add(Path.Combine(LibraryFolder, "Zycore.lib")); } else if (Target.Platform == UnrealTargetPlatform.Linux) { - // https://github.com/kubo/funchook/tree/7cb8819594f0d586454011ab691fab4edb625068 + // https://github.com/satisfactorymodding/funchook/tree/7ccd6b8087f1a587af80de1a3dea405798989225 // Built on windows using the Unreal Engine cross-compile clang toolchain PublicAdditionalLibraries.Add(Path.Combine(LibraryFolder, "libfunchook.a")); // funchook will additionally build distorm diff --git a/Mods/SML/ThirdParty/Linux/libfunchook.a b/Mods/SML/ThirdParty/Linux/libfunchook.a index 66fe0dba79adb296e5ab487397be4e3a8a381c20..a5398bfd9b84fb25281eb2d1aee261e2adf556c2 100644 GIT binary patch delta 24863 zcmbV!2Y6If`u8n!CzDB;6qpne2oQQm1Ed8^C^~_FK>{Kjfe45+qrg%ol&r=OK+n1Z z7C`iG*+oTBQEUh*Dx&D_-!8H)O;J%qMP11EzURL0+?%8OJ>T=4=b5?h`MveLr`&VP z%!#$JPj8CdxO)5}M>OpZKDxiF_W%6ZxJA>Ik8$}|kAJ$`^z`Ua+~WT&l3gYKY$H6+VOG?C#eB>Y1S*B?D0}{=sVRhNp~jlrB+01Tdt*n;|B?#$O2XVG zh3e1P4(iWT)PGA-HOHi)&474()lGwaBkDW8q-$D{_F_6jOiJmY`dPm6hAVub`cP7N z{pCJax{E&fa^G)FP1WMv_>so4Uq#!5Ok?YLF(9F1_#(9-RR1eApzI|`fL6970$B`p+q@iI}VjNgyTpfwcyRh8nt6)c+icHYHGZ z9_)r12Ez!--CO?hF%PiAmo?OMs2bK#)u9j?T~Yr%wL4JvE(*iA^p!Ve<%QPlFAO#G zFK_Ib7h3gN9k43u&q~pXhMu`#$H`cr?si~Ddvhv`kP7{HXw9ot7>zxSqFt4m+%Q60 z^Rg9coS54g+EY>glh~7(6^I9|>gwuz8kFL*#Ma@@FE%xm9q>ZSw4p^!r{l}&51fvH zFN`2M5Plva^Z3J0O-)1U&xcmMGOM)NECQpBS#3<&Rb^w##*|f!4z2k*z5e_1`v3gC zJJyus!l=A841P!82pCcKO-)S&3@2ap#`1Vqdg&`Cp?21Dtcfxdq6f%R@7e% z)yL;jMsFNFtkKgWv}P|Pvd^%_o``H1>+ z1viSa1D;%nLM!^_bnFX$AWj?guX0M8;-4YSPYvUDC4QCSS0R4o;8#+0({R=56QDYxAq-7!y788Zh7M5G zM${dvS%}@85@=H^f%=o>^`GK0I=;LiE4R9A4RnNd<0&}?Psr3^v2oK1Q|PZG~3_kdH%cgbzzY;T|3n0

XdM$2#VK#; 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%0D(&C<5mts;$sN!;4*|=GmQGar-JkBC{^s> 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 JoPRy%{|83Zs*(Tz literal 0 HcmV?d00001 diff --git a/Mods/SML/ThirdParty/Win64/funchook.lib b/Mods/SML/ThirdParty/Win64/funchook.lib index 390ba72e3c6d634cd1d751ccad2a0599e7f662b7..2098b1a4e5fdee6c0bc1b5f77031bb2418921fc6 100644 GIT binary patch literal 84266 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 literal 158066 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 Date: Thu, 27 Jun 2024 21:24:09 +0200 Subject: [PATCH 4/6] Fix delegate handle not being invalidated after unhooking --- Mods/SML/Source/SML/Public/Patching/NativeHookManager.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mods/SML/Source/SML/Public/Patching/NativeHookManager.h b/Mods/SML/Source/SML/Public/Patching/NativeHookManager.h index 8d04084162..cb76d2ff7f 100644 --- a/Mods/SML/Source/SML/Public/Patching/NativeHookManager.h +++ b/Mods/SML/Source/SML/Public/Patching/NativeHookManager.h @@ -373,6 +373,8 @@ struct HookInvokerExecutorGlobalFunction { { UninstallHook(DebugSymbolName); } + + InHandlerHandle.Reset(); } }; @@ -547,6 +549,8 @@ struct HookInvokerExecutorMemberFunction { { UninstallHook(DebugSymbolName); } + + InHandlerHandle.Reset(); } }; From 79e689210ed0dfe171acc71f06860e90fc254dc7 Mon Sep 17 00:00:00 2001 From: mircearoata Date: Sat, 29 Jun 2024 00:59:48 +0200 Subject: [PATCH 5/6] Use GameVersion as version range --- Mods/Alpakit/Alpakit.uplugin | 6 +- Mods/Alpakit/Source/Alpakit/Alpakit.Build.cs | 6 +- .../Alpakit/Private/AlpakitEditModDialog.cpp | 43 ++- .../Alpakit/Private/AlpakitReleaseWidget.cpp | 61 +++- .../Alpakit/Private/ModMetadataObject.cpp | 2 +- .../Alpakit/Public/AlpakitEditModDialog.h | 9 +- .../Alpakit/Public/AlpakitReleaseWidget.h | 4 + .../Private/ModLoading/ModLoadingLibrary.cpp | 20 +- .../Source/SML/Private/Util/SemVersion.cpp | 289 ++++++++++++++---- .../SML/Public/ModLoading/ModLoadingLibrary.h | 4 +- Mods/SML/Source/SML/Public/Util/SemVersion.h | 2 - 11 files changed, 345 insertions(+), 101 deletions(-) diff --git a/Mods/Alpakit/Alpakit.uplugin b/Mods/Alpakit/Alpakit.uplugin index 9587ef72ee..663d587dd9 100644 --- a/Mods/Alpakit/Alpakit.uplugin +++ b/Mods/Alpakit/Alpakit.uplugin @@ -25,6 +25,10 @@ { "Name": "PluginBrowser", "Enabled": true + }, + { + "Name": "SML", + "Enabled": true } ] -} \ No newline at end of file +} diff --git a/Mods/Alpakit/Source/Alpakit/Alpakit.Build.cs b/Mods/Alpakit/Source/Alpakit/Alpakit.Build.cs index 6e8ad1eb9f..e24b37e35a 100644 --- a/Mods/Alpakit/Source/Alpakit/Alpakit.Build.cs +++ b/Mods/Alpakit/Source/Alpakit/Alpakit.Build.cs @@ -14,6 +14,10 @@ public Alpakit(ReadOnlyTargetRules Target) : base(Target) "DesktopPlatform", }); + PublicDependencyModuleNames.AddRange(new[] { + "SML", + }); + PrivateDependencyModuleNames.AddRange(new[] { "ApplicationCore", "Json", @@ -29,7 +33,7 @@ public Alpakit(ReadOnlyTargetRules Target) : base(Target) "EditorStyle", "PluginBrowser", "LauncherServices", - "TargetDeviceServices" + "TargetDeviceServices", }); } } diff --git a/Mods/Alpakit/Source/Alpakit/Private/AlpakitEditModDialog.cpp b/Mods/Alpakit/Source/Alpakit/Private/AlpakitEditModDialog.cpp index eef9676b98..b7ea60390c 100644 --- a/Mods/Alpakit/Source/Alpakit/Private/AlpakitEditModDialog.cpp +++ b/Mods/Alpakit/Source/Alpakit/Private/AlpakitEditModDialog.cpp @@ -7,6 +7,7 @@ #include "ISourceControlState.h" #include "ModMetadataObject.h" #include "SourceControlOperations.h" +#include "Util/SemVersion.h" #define LOCTEXT_NAMESPACE "AlpakitEditMod" @@ -24,9 +25,13 @@ void SAlpakitEditModDialog::Construct(const FArguments& InArgs, TSharedRefGetFName(), FOnGetDetailCustomizationInstance::CreateStatic(&FModMetadataCustomization::MakeInstance)); TSharedRef PropertyView = EditModule.CreateDetailView(FDetailsViewArgs(false, false, false, FDetailsViewArgs::ActorsUseNameArea, true)); PropertyView->SetObject(MetadataObject, true); + PropertyView->OnFinishedChangingProperties().AddLambda([this](const FPropertyChangedEvent&){ + UpdateGameVersionTarget(); + }); FString TargetSMLVersion = TEXT("^") + FAlpakitModule::GetCurrentSMLVersion(); - FString TargetGameVersion = FAlpakitModule::GetCurrentGameVersion(); + + UpdateGameVersionTarget(); SWindow::Construct(SWindow::FArguments() .ClientSize(FVector2D(800.0f, 700.0f)) @@ -65,9 +70,9 @@ void SAlpakitEditModDialog::Construct(const FArguments& InArgs, TSharedRefGameVersion == TargetGameVersion) + if (FormatGameVersionRange(ModGameVersionRange) == FormatGameVersionRange(TargetGameVersionRange)) return EVisibility::Collapsed; return EVisibility::Visible; }) @@ -75,11 +80,12 @@ void SAlpakitEditModDialog::Construct(const FArguments& InArgs, TSharedRefGameVersion = TargetGameVersion; + MetadataObject->GameVersion = FormatGameVersionRange(TargetGameVersionRange); + UpdateGameVersionTarget(); return FReply::Handled(); }) ] @@ -129,9 +135,28 @@ void SAlpakitEditModDialog::SetSMLDependencyVersion(FString Version) const SMLDependency->SemVersion = Version; } -FString SAlpakitEditModDialog::GetGameVersion() const -{ - return MetadataObject->GameVersion; +void SAlpakitEditModDialog::UpdateGameVersionTarget() { + FString _; + GameVersion.ParseVersion(FString::Printf(TEXT("%s.0.0"), *FAlpakitModule::GetCurrentGameVersion()), _); + if (!MetadataObject->GameVersion.IsEmpty()) { + ModGameVersionRange.ParseVersionRange(MetadataObject->GameVersion, _); + + TargetGameVersionRange.ParseVersionRange(MetadataObject->GameVersion, _); + for (FVersionComparatorCollection& ComparatorCollection : TargetGameVersionRange.Collections) { + ComparatorCollection.Comparators.Add(FVersionComparator(EVersionComparisonOp::GREATER_EQUALS, GameVersion)); + } + + if (!TargetGameVersionRange.Matches(GameVersion)) { + TargetGameVersionRange = FVersionRange::CreateRangeWithMinVersion(GameVersion); + } + } else { + ModGameVersionRange = FVersionRange(); + TargetGameVersionRange = FVersionRange::CreateRangeWithMinVersion(GameVersion); + } +} + +FString SAlpakitEditModDialog::FormatGameVersionRange(const FVersionRange& Range) { + return Range.ToString().Replace(TEXT(".0.0"), TEXT("")); } FReply SAlpakitEditModDialog::OnOkClicked() { diff --git a/Mods/Alpakit/Source/Alpakit/Private/AlpakitReleaseWidget.cpp b/Mods/Alpakit/Source/Alpakit/Private/AlpakitReleaseWidget.cpp index 1d96e79715..1a92a6eba3 100644 --- a/Mods/Alpakit/Source/Alpakit/Private/AlpakitReleaseWidget.cpp +++ b/Mods/Alpakit/Source/Alpakit/Private/AlpakitReleaseWidget.cpp @@ -4,6 +4,7 @@ #include "AlpakitSettings.h" #include "AlpakitStyle.h" #include "ModTargetsConfig.h" +#include "Util/SemVersion.h" #define LOCTEXT_NAMESPACE "AlpakitWidget" @@ -11,7 +12,6 @@ void SAlpakitReleaseWidget::Construct(const FArguments& InArgs) { const float TargetColumnWidth = 90; FString TargetSMLVersion = TEXT("^") + FAlpakitModule::GetCurrentSMLVersion(); - FString TargetGameVersion = FAlpakitModule::GetCurrentGameVersion(); ChildSlot[ SNew(SVerticalBox) @@ -84,7 +84,7 @@ void SAlpakitReleaseWidget::Construct(const FArguments& InArgs) { return !FAlpakitModule::Get().IsPackaging(); }); }) - .ModEntryTrail_Lambda([this, TargetColumnWidth, TargetSMLVersion, TargetGameVersion] (const TSharedRef& Mod) { + .ModEntryTrail_Lambda([this, TargetColumnWidth, TargetSMLVersion] (const TSharedRef& Mod) { TSharedRef ModTargetsConfig = ModTargetsConfigs.FindOrAdd(Mod->GetName(), MakeShared(Mod)); return SNew(SBox) @@ -122,10 +122,12 @@ void SAlpakitReleaseWidget::Construct(const FArguments& InArgs) { + SHorizontalBox::Slot().AutoWidth().Padding(5,0)[ SNew(SBox) .HAlign(HAlign_Center) - .Visibility_Lambda([this, Mod, TargetGameVersion] + .Visibility_Lambda([this, Mod] { - FString GameVersion = GetModGameVersion(Mod); - if (GameVersion == TargetGameVersion) + FVersion GameVersion; + FVersionRange ModGameVersionRange, TargetGameVersionRange; + GetModGameVersionFields(Mod, GameVersion, ModGameVersionRange, TargetGameVersionRange); + if (FormatGameVersionRange(ModGameVersionRange) == FormatGameVersionRange(TargetGameVersionRange)) return EVisibility::Hidden; return EVisibility::Visible; }) @@ -136,17 +138,25 @@ void SAlpakitReleaseWidget::Construct(const FArguments& InArgs) { SNew(SImage) .Image(FAlpakitStyle::Get().GetBrush("Alpakit.Warning")) ] - .ToolTipText_Lambda([Mod, TargetGameVersion] + .ToolTipText_Lambda([Mod] { - FString CurrentGameVersion = GetModGameVersion(Mod); - if (CurrentGameVersion.IsEmpty()) { - CurrentGameVersion = "(unspecified)"; + FString GameVersionRaw = GetModGameVersion(Mod); + FVersion GameVersion; + FVersionRange ModGameVersionRange, TargetGameVersionRange; + GetModGameVersionFields(Mod, GameVersion, ModGameVersionRange, TargetGameVersionRange); + if (GameVersionRaw.IsEmpty()) { + GameVersionRaw = "(unspecified)"; + } else { + GameVersionRaw = FormatGameVersionRange(ModGameVersionRange); } - return FText::Format(LOCTEXT("UpdateGameVersionTooltip", "This mod uses game version {0}, but the project is {1}. Click to update"), FText::FromString(CurrentGameVersion), FText::FromString(TargetGameVersion)); + return FText::Format(LOCTEXT("UpdateGameVersionTooltip", "This mod uses game version {0}, but the project is {1}. Click to update"), FText::FromString(GameVersionRaw), FText::FromString(FormatGameVersionRange(TargetGameVersionRange))); }) - .OnClicked_Lambda([this, Mod, TargetGameVersion] + .OnClicked_Lambda([this, Mod] { - SetModGameVersion(Mod, TargetGameVersion); + FVersion GameVersion; + FVersionRange ModGameVersionRange, TargetGameVersionRange; + GetModGameVersionFields(Mod, GameVersion, ModGameVersionRange, TargetGameVersionRange); + SetModGameVersion(Mod, FormatGameVersionRange(TargetGameVersionRange)); return FReply::Handled(); }) ] @@ -241,6 +251,33 @@ FString SAlpakitReleaseWidget::GetModGameVersion(TSharedRef Mod) return GameVersion; } +void SAlpakitReleaseWidget::GetModGameVersionFields(TSharedRef Mod, FVersion& GameVersion, FVersionRange& ModGameVersionRange, FVersionRange& TargetGameVersionRange) { + FString ModGameVersion = GetModGameVersion(Mod); + + FString _; + GameVersion.ParseVersion(FString::Printf(TEXT("%s.0.0"), *FAlpakitModule::GetCurrentGameVersion()), _); + if (!ModGameVersion.IsEmpty()) { + ModGameVersionRange.ParseVersionRange(ModGameVersion, _); + + TargetGameVersionRange.ParseVersionRange(ModGameVersion, _); + for (FVersionComparatorCollection& ComparatorCollection : TargetGameVersionRange.Collections) { + ComparatorCollection.Comparators.Add(FVersionComparator(EVersionComparisonOp::GREATER_EQUALS, GameVersion)); + } + + if (!TargetGameVersionRange.Matches(GameVersion)) { + TargetGameVersionRange = FVersionRange::CreateRangeWithMinVersion(GameVersion); + } + } else { + ModGameVersionRange = FVersionRange(); + TargetGameVersionRange = FVersionRange::CreateRangeWithMinVersion(GameVersion); + } +} + +FString SAlpakitReleaseWidget::FormatGameVersionRange(const FVersionRange& TargetGameVersionRange) { + return TargetGameVersionRange.ToString().Replace(TEXT(".0.0"), TEXT("")); +} + + void SAlpakitReleaseWidget::SetModGameVersion(TSharedRef Mod, FString Version) { FPluginDescriptor Descriptor = Mod->GetDescriptor(); diff --git a/Mods/Alpakit/Source/Alpakit/Private/ModMetadataObject.cpp b/Mods/Alpakit/Source/Alpakit/Private/ModMetadataObject.cpp index f4e4b9c10f..5dadf645ae 100644 --- a/Mods/Alpakit/Source/Alpakit/Private/ModMetadataObject.cpp +++ b/Mods/Alpakit/Source/Alpakit/Private/ModMetadataObject.cpp @@ -19,7 +19,7 @@ UModMetadataObject::UModMetadataObject(const FObjectInitializer& ObjectInitializer) { Category = TEXT("Modding"); // Group all mods in this category - GameVersion = FAlpakitModule::GetCurrentGameVersion(); + GameVersion = FString::Printf(TEXT(">=%s"), *FAlpakitModule::GetCurrentGameVersion()); } void UModMetadataObject::PopulateFromDescriptor(const FPluginDescriptor& InDescriptor) diff --git a/Mods/Alpakit/Source/Alpakit/Public/AlpakitEditModDialog.h b/Mods/Alpakit/Source/Alpakit/Public/AlpakitEditModDialog.h index 2fc9362411..35a66d10a7 100644 --- a/Mods/Alpakit/Source/Alpakit/Public/AlpakitEditModDialog.h +++ b/Mods/Alpakit/Source/Alpakit/Public/AlpakitEditModDialog.h @@ -3,6 +3,7 @@ #include "ModMetadataObject.h" #include "Slate.h" #include "Interfaces/IPluginManager.h" +#include "Util/SemVersion.h" class SAlpakitEditModDialog : public SWindow { @@ -14,10 +15,16 @@ class SAlpakitEditModDialog : public SWindow FString GetSMLDependencyVersion() const; void SetSMLDependencyVersion(FString Version) const; - FString GetGameVersion() const; + void UpdateGameVersionTarget(); + + static FString FormatGameVersionRange(const FVersionRange& Range); + private: TSharedPtr Mod; UModMetadataObject* MetadataObject = nullptr; + FVersion GameVersion; + FVersionRange ModGameVersionRange; + FVersionRange TargetGameVersionRange; FReply OnOkClicked(); }; diff --git a/Mods/Alpakit/Source/Alpakit/Public/AlpakitReleaseWidget.h b/Mods/Alpakit/Source/Alpakit/Public/AlpakitReleaseWidget.h index dac0e8e39f..bbf47373e6 100644 --- a/Mods/Alpakit/Source/Alpakit/Public/AlpakitReleaseWidget.h +++ b/Mods/Alpakit/Source/Alpakit/Public/AlpakitReleaseWidget.h @@ -3,6 +3,7 @@ #include "AlpakitModEntryList.h" #include "ModTargetsConfig.h" #include "Slate.h" +#include "Util/SemVersion.h" class SAlpakitReleaseWidget : public SCompoundWidget { public: @@ -15,6 +16,9 @@ class SAlpakitReleaseWidget : public SCompoundWidget { static void SetModSMLDependencyVersion(TSharedRef Mod, FString Version); static FString GetModGameVersion(TSharedRef Mod); static void SetModGameVersion(TSharedRef Mod, FString Version); + static void GetModGameVersionFields(TSharedRef Mod, FVersion& GameVersion, FVersionRange& ModGameVersionRange, FVersionRange& TargetGameVersionRange); + static FString FormatGameVersionRange(const FVersionRange& TargetGameVersionRange); + private: TSharedPtr ModList; TMap> ModTargetsConfigs; diff --git a/Mods/SML/Source/SML/Private/ModLoading/ModLoadingLibrary.cpp b/Mods/SML/Source/SML/Private/ModLoading/ModLoadingLibrary.cpp index 7a5f35e2c0..53a9690eb6 100644 --- a/Mods/SML/Source/SML/Private/ModLoading/ModLoadingLibrary.cpp +++ b/Mods/SML/Source/SML/Private/ModLoading/ModLoadingLibrary.cpp @@ -14,7 +14,7 @@ void FSMLPluginDescriptorMetadata::SetupDefaults(const FPluginDescriptor& Plugin this->Version = FVersion(PluginDescriptor.Version, 0, 0); this->bAcceptsAnyRemoteVersion = false; this->RemoteVersionRange = FVersionRange::CreateRangeWithMinVersion(Version); - this->GameVersion = 0; + this->GameVersion = FVersionRange::CreateAnyVersionRange(); } void FSMLPluginDescriptorMetadata::Load(const FString& PluginName, const TSharedPtr Source) { @@ -59,7 +59,17 @@ void FSMLPluginDescriptorMetadata::Load(const FString& PluginName, const TShared } } - if (!Source->TryGetNumberField(TEXT("GameVersion"), GameVersion)) { + FString GameVersionRangeString; + if (Source->TryGetStringField(TEXT("GameVersion"), GameVersionRangeString)) { + FVersionRange GameVersionRange; + FString GameVersionRangeError; + + if (GameVersionRange.ParseVersionRange(GameVersionRangeString, GameVersionRangeError)) { + this->GameVersion = GameVersionRange; + } else { + UE_LOG(LogSatisfactoryModLoader, Error, TEXT("Plugin %s has invalid Game Version value: %s: %s"), *PluginName, *GameVersionRangeString, *GameVersionRangeError); + } + } else { UE_LOG(LogSatisfactoryModLoader, Warning, TEXT("Plugin %s does not specify 'GameVersion' field, unable to check for game compatibility"), *PluginName); } @@ -242,9 +252,9 @@ void UModLoadingLibrary::VerifyPluginDependencies(IPlugin& Plugin, TArray CurrentChangelist) { - const FString Message = FString::Printf(TEXT("Plugin %s requires game version %d or higher (current: %d)"), - *Plugin.GetName(), PluginDescriptorMetadata.GameVersion, CurrentChangelist); + if (!PluginDescriptorMetadata.GameVersion.Matches(FVersion(CurrentChangelist, 0, 0))) { + const FString Message = FString::Printf(TEXT("Plugin %s requires game version %s (current: %d)"), + *Plugin.GetName(), *PluginDescriptorMetadata.GameVersion.ToString().Replace(TEXT(".0.0"), TEXT("")), CurrentChangelist); MismatchedDependencies.Add(Message); } } diff --git a/Mods/SML/Source/SML/Private/Util/SemVersion.cpp b/Mods/SML/Source/SML/Private/Util/SemVersion.cpp index 2e0368bcdc..ebb05b02db 100644 --- a/Mods/SML/Source/SML/Private/Util/SemVersion.cpp +++ b/Mods/SML/Source/SML/Private/Util/SemVersion.cpp @@ -131,6 +131,88 @@ bool FVersionComparator::ParseVersionComparator(const FString& String, FString& return false; } +bool CaretMaxVersion(FVersion Lower, FVersion& MaxVersion) { + MaxVersion = FVersion{}; + //Check if we have any wildcards we need to handle + if (Lower.ContainsSpecialVersionNumbers()) { + //If major version is wildcard, there is no upper bound set + //Although i'm not sure if ^X is even legal semver comparator + if (Lower.Major == SEMVER_VERSION_NUMBER_WILDCARD) { + return false; + } + //If minor version is wildcard, upper bound is major + 1 + if (Lower.Minor == SEMVER_VERSION_NUMBER_WILDCARD) { + MaxVersion.Major = Lower.Major + 1; + } + //If patch version is wildcard, upper bound is either major or minor, but patch can be any + if (Lower.Patch == SEMVER_VERSION_NUMBER_WILDCARD) { + if (Lower.Major == 0) { + MaxVersion.Minor = Lower.Minor + 1; + } else { + MaxVersion.Major = Lower.Major + 1; + } + } + } else { + //No special version numbers, fallback to normal first-non-zero handling + if (Lower.Major == 0) { + if(Lower.Minor == 0) { + //Minor is zero, allow up to next patch version + MaxVersion.Patch = Lower.Patch + 1; + } else { + //Major is zero, allow up to next minor version update + MaxVersion.Minor = Lower.Minor + 1; + } + } else { + //Major is not zero, allow up to next major version update + MaxVersion.Major = Lower.Major + 1; + } + } + return true; +} + +bool TildeMaxVersion(FVersion Lower, FVersion& MaxVersion) { + MaxVersion = FVersion{}; + //Major version number is not specified, no upper bounds + //Although it's impossible to encounter under normal conditions, let's handle it for sake of completeness + if (Lower.Major == SEMVER_VERSION_NUMBER_UNSPECIFIED) { + return false; + } + //Minor is unspecified, maximum version is Major + 1 + if (Lower.Minor == SEMVER_VERSION_NUMBER_UNSPECIFIED) { + MaxVersion.Major = Lower.Major + 1; + //Patch version is unspecified, maximum version is Minor + 1 while keeping normal Major + } else if (Lower.Patch == SEMVER_VERSION_NUMBER_UNSPECIFIED) { + MaxVersion.Major = Lower.Major; + MaxVersion.Minor = Lower.Minor + 1; + //Version contains no unspecified numbers, so maximum version is Patch + 1 while keeping Major and Minor + } else { + MaxVersion.Major = Lower.Major; + MaxVersion.Minor = Lower.Minor; + MaxVersion.Patch = Lower.Patch + 1; + } + return true; +} + +bool XRangeMaxVersion(FVersion Lower, FVersion& MaxVersion) { + MaxVersion = Lower; + //We have wildcards, so go from Major to Patch to compare them + //Major is wildcard, we accept any versions + if (Lower.Major == SEMVER_VERSION_NUMBER_WILDCARD) { + return false; + } + //Minor is wildcard, we accept everything as long as Major matches + if (Lower.Minor == SEMVER_VERSION_NUMBER_WILDCARD || Lower.Minor == SEMVER_VERSION_NUMBER_UNSPECIFIED) { + MaxVersion = FVersion(Lower.Major + 1, 0, 0); + return true; + } + //Patch is wildcard, we accept everything as long as Major and Minor match + if (Lower.Patch == SEMVER_VERSION_NUMBER_WILDCARD || Lower.Patch == SEMVER_VERSION_NUMBER_UNSPECIFIED) { + MaxVersion = FVersion(Lower.Major, Lower.Minor + 1, 0); + return true; + } + return true; +} + bool FVersionComparator::Matches(const FVersion& version) const { //Clear version used for comparison purposes const FVersion CleanVersion = MyVersion.RemoveSpecialNumbers(); @@ -149,39 +231,8 @@ bool FVersionComparator::Matches(const FVersion& version) const { return false; } FVersion MaxVersion{}; - //Check if we have any wildcards we need to handle - if (MyVersion.ContainsSpecialVersionNumbers()) { - //If major version is wildcard, there is no upper bound set - //Although i'm not sure if ^X is even legal semver comparator - if (MyVersion.Major == SEMVER_VERSION_NUMBER_WILDCARD) { - return true; - } - //If minor version is wildcard, upper bound is major + 1 - if (MyVersion.Minor == SEMVER_VERSION_NUMBER_WILDCARD) { - MaxVersion.Major = MyVersion.Major + 1; - } - //If patch version is wildcard, upper bound is either major or minor, but patch can be any - if (MyVersion.Patch == SEMVER_VERSION_NUMBER_WILDCARD) { - if (MyVersion.Major == 0) { - MaxVersion.Minor = MyVersion.Minor + 1; - } else { - MaxVersion.Major = MyVersion.Major + 1; - } - } - } else { - //No special version numbers, fallback to normal first-non-zero handling - if (MyVersion.Major == 0) { - if(MyVersion.Minor == 0) { - //Minor is zero, allow up to next patch version - MaxVersion.Patch = MyVersion.Patch + 1; - } else { - //Major is zero, allow up to next minor version update - MaxVersion.Minor = MyVersion.Minor + 1; - } - } else { - //Major is not zero, allow up to next major version update - MaxVersion.Major = MyVersion.Major + 1; - } + if(!CaretMaxVersion(MyVersion, MaxVersion)) { + return true; } //We pass if we are below max version required, exclusive return version.Compare(MaxVersion) < 0; @@ -194,22 +245,8 @@ bool FVersionComparator::Matches(const FVersion& version) const { return false; } FVersion MaxVersion{}; - //Major version number is not specified, no upper bounds - //Although it's impossible to encounter under normal conditions, let's handle it for sake of completeness - if (MyVersion.Major == SEMVER_VERSION_NUMBER_UNSPECIFIED) { + if (!TildeMaxVersion(MyVersion, MaxVersion)) { return true; - //Minor is unspecified, maximum version is Major + 1 - } else if (MyVersion.Minor == SEMVER_VERSION_NUMBER_UNSPECIFIED) { - MaxVersion.Major = MyVersion.Major + 1; - //Patch version is unspecified, maximum version is Minor + 1 while keeping normal Major - } else if (MyVersion.Patch == SEMVER_VERSION_NUMBER_UNSPECIFIED) { - MaxVersion.Major = MyVersion.Major; - MaxVersion.Minor = MyVersion.Minor + 1; - //Version contains no unspecified numbers, so maximum version is Patch + 1 while keeping Major and Minor - } else { - MaxVersion.Major = MyVersion.Major; - MaxVersion.Minor = MyVersion.Minor; - MaxVersion.Patch = MyVersion.Patch + 1; } //We pass if we are below max version required, exclusive return version.Compare(MaxVersion) < 0; @@ -217,21 +254,21 @@ bool FVersionComparator::Matches(const FVersion& version) const { //Equals versions can represent X-Ranges, so we need to handle wildcards inside them case EVersionComparisonOp::EQUALS: { - //We have wildcards, so go from Major to Patch to compare them - //Major is wildcard, we accept any versions - if (MyVersion.Major == SEMVER_VERSION_NUMBER_WILDCARD) { - return true; + if (!MyVersion.ContainsSpecialVersionNumbers()) { + return Result == 0; } - //Minor is wildcard, we accept everything as long as Major matches - if (MyVersion.Minor == SEMVER_VERSION_NUMBER_WILDCARD) { - return MyVersion.Major == version.Major; + + // Lower bound is zeroed version + if (Result < 0) { + return false; } - //Patch is wildcard, we accept everything as long as Major and Minor match - if (MyVersion.Patch == SEMVER_VERSION_NUMBER_WILDCARD) { - return MyVersion.Major == version.Major && MyVersion.Minor == version.Minor; + FVersion MaxVersion{}; + if (!XRangeMaxVersion(MyVersion, MaxVersion)) { + return true; } - //We represent fixed version number comparator, so just return true if versions are equal - return Result == 0; + + // We pass if we are below max version required, exclusive + return version.Compare(MaxVersion) < 0; } //Fallback default case to equals @@ -290,11 +327,13 @@ bool ParseHyphenVersionRange(const FString& LeftSideString, const FString& Right } else if (RightSideVersion.Minor == SEMVER_VERSION_NUMBER_UNSPECIFIED) { //Minor in right side version is not specified, allow everything up to next major ResultUpperBoundVersion.Major = RightSideVersion.Major + 1; + ResultUpperBoundVersion.PreRelease = TEXT("0"); bIncludeUpperBound = false; } else if (RightSideVersion.Patch == SEMVER_VERSION_NUMBER_UNSPECIFIED) { //Patch in right side version is not specified, allow everything up to next minor ResultUpperBoundVersion.Major = RightSideVersion.Major; ResultUpperBoundVersion.Minor = RightSideVersion.Minor + 1; + ResultUpperBoundVersion.PreRelease = TEXT("0"); bIncludeUpperBound = false; } else { //No unspecified version numbers, upper bound is inclusive @@ -325,9 +364,8 @@ bool FVersionComparatorCollection::ParseVersionCollection(const FString& String, if (CurrentChar == TEXT(' ')) { //Current character is space. If we're inside string, reset flag bIsCurrentlyInString = false; - } else if (CurrentChar == TEXT('-')) { - //Current character is hyphen. We are no longer inside string, but we have hyphen after last string - bIsCurrentlyInString = false; + } else if (CurrentChar == TEXT('-') && !bIsCurrentlyInString) { + // Hyphen ranges are only valid with spaces around the - (otherwise it's a prerelease marker) //We shouldn't have hyphen at this point, only previous string if (bHaveHyphenAfterLastString) { OutErrorMessage = TEXT("Unexpected hyphen"); @@ -408,9 +446,128 @@ bool FVersionComparatorCollection::ParseVersionCollection(const FString& String, FString FVersionComparatorCollection::ToString() const { TArray ResultString; + // Any and-range can be represented by a lower and upper bound + FVersionComparator Lower(EVersionComparisonOp::GREATER_EQUALS, FVersion(0, 0, 0)); + FVersionComparator Upper(EVersionComparisonOp::LESS_EQUALS, FVersion(INT64_MAX, INT64_MAX, INT64_MAX)); + for (const FVersionComparator& Comparator : Comparators) { - ResultString.Add(Comparator.ToString()); + switch (Comparator.Op) + { + case EVersionComparisonOp::EQUALS: { + if(!Comparator.MyVersion.ContainsSpecialVersionNumbers()) { + if (Lower.Matches(Comparator.MyVersion)) { + Lower = FVersionComparator(EVersionComparisonOp::GREATER_EQUALS, Comparator.MyVersion); + } + if (Upper.Matches(Comparator.MyVersion)) { + Lower = FVersionComparator(EVersionComparisonOp::LESS_EQUALS, Comparator.MyVersion); + } + } else { + FVersion CleanVersion = Comparator.MyVersion.RemoveSpecialNumbers(); + if (Lower.Matches(CleanVersion)) { + Lower = FVersionComparator(EVersionComparisonOp::GREATER_EQUALS, CleanVersion); + } + FVersion MaxVersion{}; + if (XRangeMaxVersion(Comparator.MyVersion, MaxVersion)) { + if (Upper.Matches(MaxVersion)) { + Upper = FVersionComparator(EVersionComparisonOp::LESS, MaxVersion); + } + } + } + break; + } + case EVersionComparisonOp::GREATER: + case EVersionComparisonOp::GREATER_EQUALS: { + if (Lower.Matches(Comparator.MyVersion)) { + Lower = Comparator; + } + break; + } + case EVersionComparisonOp::LESS: + case EVersionComparisonOp::LESS_EQUALS: { + if (Upper.Matches(Comparator.MyVersion)) { + Upper = Comparator; + } + break; + } + case EVersionComparisonOp::CARET: { + if (Lower.Matches(Comparator.MyVersion)) { + Lower = Comparator; + } + FVersion MaxVersion{}; + if (CaretMaxVersion(Comparator.MyVersion, MaxVersion)) { + if (Upper.Matches(MaxVersion)) { + Upper = FVersionComparator(EVersionComparisonOp::LESS, MaxVersion); + } + } + break; + } + case EVersionComparisonOp::TILDE: { + if (Lower.Matches(Comparator.MyVersion)) { + Lower = Comparator; + } + FVersion MaxVersion{}; + if (TildeMaxVersion(Comparator.MyVersion, MaxVersion)) { + if (Upper.Matches(MaxVersion)) { + Upper = FVersionComparator(EVersionComparisonOp::LESS, MaxVersion); + } + } + break; + } + default: + break; + } } + + bool bLowerIsSet = !Lower.Matches(FVersion(0, 0, 0)); + bool bUpperIsSet = !Upper.Matches(FVersion(INT64_MAX, INT64_MAX, INT64_MAX)); + + if (bLowerIsSet && bUpperIsSet) { + FVersion CaretMax, TildeMax; + CaretMaxVersion(Lower.MyVersion, CaretMax); + TildeMaxVersion(Lower.MyVersion, TildeMax); + if (Upper.MyVersion.Compare(CaretMax) == 0) { + ResultString.Add(FString::Printf(TEXT("^%s"), *Lower.MyVersion.RemoveSpecialNumbers().ToString())); + } else if (Upper.MyVersion.Compare(TildeMax) == 0) { + ResultString.Add(FString::Printf(TEXT("~%s"), *Lower.MyVersion.RemoveSpecialNumbers().ToString())); + } else if (Upper.MyVersion.Major == Lower.MyVersion.Major + 1 + && Lower.MyVersion.Minor <= 0 && Lower.MyVersion.Patch <= 0 + && Upper.MyVersion.Minor <= 0 && Upper.MyVersion.Patch <= 0 + && Lower.MyVersion.PreRelease.IsEmpty() && Upper.MyVersion.PreRelease.IsEmpty()) { + // x-range with major version only + ResultString.Add(FString::Printf(TEXT("%lld"), Lower.MyVersion.Major)); + } else if (Upper.MyVersion.Major == Lower.MyVersion.Major && Upper.MyVersion.Minor == Lower.MyVersion.Minor + 1 + && Lower.MyVersion.Patch <= 0 && Upper.MyVersion.Patch <= 0 + && Lower.MyVersion.PreRelease.IsEmpty() && Upper.MyVersion.PreRelease.IsEmpty()) { + // x-range with major and minor version + ResultString.Add(FString::Printf(TEXT("%lld.%lld"), Lower.MyVersion.Major, Lower.MyVersion.Minor)); + } else if (Upper.MyVersion.Compare(Lower.MyVersion) == 0) { + // Single version + ResultString.Add(Lower.ToString()); + } else if (Upper.Op == EVersionComparisonOp::LESS && Upper.MyVersion.PreRelease == TEXT("0") && (Upper.MyVersion.Minor <= 0 || Upper.MyVersion.Patch <= 0)) { + // Hyphen range with unspecified parts + FString UpperString; + if (Upper.MyVersion.Minor <= 0) { + UpperString = FString::Printf(TEXT("%lld"), Upper.MyVersion.Major - 1); + } else { + UpperString = FString::Printf(TEXT("%lld.%lld"), Upper.MyVersion.Major, Upper.MyVersion.Minor - 1); + } + ResultString.Add(FString::Printf(TEXT("%s - %s"), *Lower.MyVersion.ToString(), *UpperString)); + } else if (Upper.Op == EVersionComparisonOp::LESS_EQUALS && Upper.MyVersion.PreRelease.IsEmpty()) { + // Hyphen range + ResultString.Add(FString::Printf(TEXT("%s - %s"), *Lower.MyVersion.ToString(), *Upper.MyVersion.ToString())); + } else { + // Default case + ResultString.Add(Lower.ToString()); + ResultString.Add(Upper.ToString()); + } + } else if (bLowerIsSet) { + ResultString.Add(Lower.ToString()); + } else if (bUpperIsSet) { + ResultString.Add(Upper.ToString()); + } else { + ResultString.Add(TEXT("*")); + } + return FString::Join(ResultString, TEXT(" ")); } @@ -497,11 +654,9 @@ bool IsWildcardVersionNumber(const std::wstring& Number) { //Parses version number, taking care of wildcard characters and empty string int64 ParseVersionNumber(const std::wstring& Number) { if (IsWildcardVersionNumber(Number)) { - UE_LOG(LogSatisfactoryModLoader, Warning, TEXT("Version number %s is wildcard"), Number.c_str()); return SEMVER_VERSION_NUMBER_WILDCARD; } if (Number.length() == 0) { - UE_LOG(LogSatisfactoryModLoader, Warning, TEXT("Version number %s is empty"), Number.c_str()); return SEMVER_VERSION_NUMBER_UNSPECIFIED; } return std::stoul(Number); @@ -631,4 +786,4 @@ int FVersion::Compare(const FVersion& other) const { return Patch > other.Patch ? 1 : -1; return ComparePreRelease(*this, other); -} \ No newline at end of file +} diff --git a/Mods/SML/Source/SML/Public/ModLoading/ModLoadingLibrary.h b/Mods/SML/Source/SML/Public/ModLoading/ModLoadingLibrary.h index c0f814fac1..fb7dde52bb 100644 --- a/Mods/SML/Source/SML/Public/ModLoading/ModLoadingLibrary.h +++ b/Mods/SML/Source/SML/Public/ModLoading/ModLoadingLibrary.h @@ -77,8 +77,8 @@ struct SML_API FSMLPluginDescriptorMetadata { /** Range of the accepted remote versions, by default >=Version */ FVersionRange RemoteVersionRange; - /** Game version this mod was built against */ - uint32 GameVersion; + /** Game version this mod is compatible with */ + FVersionRange GameVersion; /** Version constraints for dependencies as specified in plugin refs */ TMap DependenciesVersions; diff --git a/Mods/SML/Source/SML/Public/Util/SemVersion.h b/Mods/SML/Source/SML/Public/Util/SemVersion.h index 86cd286b0a..033e714364 100644 --- a/Mods/SML/Source/SML/Public/Util/SemVersion.h +++ b/Mods/SML/Source/SML/Public/Util/SemVersion.h @@ -147,8 +147,6 @@ struct SML_API FVersionRange { * Converts this version range to string. * It can be parsed back into range matching same versions, * but it will not always equal to string used to initialize this version range - * For example, output string will never contain hyphen version ranges */ FString ToString() const; }; - From 5d08f7933045d573b9c13e17b5354a2353384ea7 Mon Sep 17 00:00:00 2001 From: mircearoata Date: Fri, 28 Jun 2024 12:34:49 +0200 Subject: [PATCH 6/6] Add handshake that confirms whether ModMessages can be sent over the control channel --- .../SML/Private/Network/NetworkHandler.cpp | 100 +++++++++++++++++- .../SML/Public/Network/NetworkHandler.h | 5 + 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/Mods/SML/Source/SML/Private/Network/NetworkHandler.cpp b/Mods/SML/Source/SML/Private/Network/NetworkHandler.cpp index af44c9c621..0b105fd307 100644 --- a/Mods/SML/Source/SML/Private/Network/NetworkHandler.cpp +++ b/Mods/SML/Source/SML/Private/Network/NetworkHandler.cpp @@ -10,6 +10,17 @@ DEFINE_LOG_CATEGORY(LogModNetworkHandler); DEFINE_CONTROL_CHANNEL_MESSAGE_THREEPARAM(ModMessage, 40, FString, int32, FString); IMPLEMENT_CONTROL_CHANNEL_MESSAGE(ModMessage); +struct FConnectionSMLSupport { + bool bSupportsModMessageType{false}; + TArray> PendingMessages; + + FORCEINLINE bool IsDefault() const { return !bSupportsModMessageType && PendingMessages.IsEmpty(); } +}; + +static FUObjectAnnotationSparse GConnectionMetadata; + +static FString GSML_HELLO = TEXT("SML_HELLO"); + FMessageEntry& UModNetworkHandler::RegisterMessageType(const FMessageType& MessageType) { UE_LOG(LogModNetworkHandler, Display, TEXT("Registering message type %s:%d"), *MessageType.ModReference, MessageType.MessageId); TMap& ModEntries = MessageHandlers.FindOrAdd(MessageType.ModReference); @@ -27,8 +38,40 @@ void UModNetworkHandler::CloseWithFailureMessage(UNetConnection* Connection, con } void UModNetworkHandler::SendMessage(UNetConnection* Connection, FMessageType MessageType, FString Data) { - FNetControlMessage::Send(Connection, MessageType.ModReference, MessageType.MessageId, Data); + FConnectionSMLSupport ConnectionMetadata = GConnectionMetadata.GetAnnotation(Connection); + if (ConnectionMetadata.bSupportsModMessageType) { + FNetControlMessage::Send(Connection, MessageType.ModReference, MessageType.MessageId, Data); + Connection->FlushNet(true); + } else { + ConnectionMetadata.PendingMessages.Add({MessageType, Data}); + GConnectionMetadata.AddAnnotation(Connection, ConnectionMetadata); + } +} + +void UModNetworkHandler::SetConnectionSupportsModMessages(UNetConnection* Connection) { + FConnectionSMLSupport ConnectionMetadata = GConnectionMetadata.GetAnnotation(Connection); + + if (ConnectionMetadata.bSupportsModMessageType) { + return; + } + + ConnectionMetadata.bSupportsModMessageType = true; + + // Let other side know we support mod messages + FNetControlMessage::Send(Connection, GSML_HELLO); + Connection->FlushNet(true); + + // Send all pending messages now that we know they are supported + for (const TTuple& Message : ConnectionMetadata.PendingMessages) { + FMessageType ModMessageType = Message.Get<0>(); + FString Data = Message.Get<1>(); + FNetControlMessage::Send(Connection, ModMessageType.ModReference, ModMessageType.MessageId, Data); + } + Connection->FlushNet(true); + + ConnectionMetadata.PendingMessages.Empty(); + GConnectionMetadata.AddAnnotation(Connection, ConnectionMetadata); } UGameInstance* UModNetworkHandler::GetGameInstanceFromNetDriver( const UNetDriver* NetDriver ) @@ -62,6 +105,35 @@ void UModNetworkHandler::ReceiveMessage(UNetConnection* Connection, const FStrin } } +/** + * SML handshake is done in the following way: + * + * Server Client + * | SML_HELLO | + * |------------------------->| + * | SML_HELLO | bSupportsModMessageType = true + * |<-------------------------| + * bSupportsModMessageType = true | | + * | any pending mod messages | + * |<-------------------------| + * | SML_HELLO | + * |------------------------->| + * | any pending mod messages | + * |------------------------->| + * + * If the client is not running SML, it will not respond to the SML_HELLO message, + * so the server will not mark the connection as supporting mod messages, and never send any mod messages. + * + * If the server is not running SML, it will not send the initial SML_HELLO message, + * so the client will not mark the connection as supporting mod messages, and never send any mod messages. + * + * We cannot simply send an SML_HELLO message from each side at the beginning of the connection, + * because the server expects a specific message order from the client, up until the NMT_Welcome message, + * and disconnects if that order is not followed. + * So if the server is not running SML, nothing will intercept the SML_HELLO message, and it will reach + * UWorld::NotifyControlMessage, which will disconnect the client. + * + */ void UModNetworkHandler::InitializePatches() { UWorld* WorldObjectInstance = GetMutableDefault(); @@ -81,6 +153,32 @@ void UModNetworkHandler::InitializePatches() { }); auto MessageHandler = [=](auto& Call, void*, UNetConnection* Connection, uint8 MessageType, class FInBunch& Bunch) { + if (MessageType == NMT_Hello) { + // NMT_Hello is only received on the server, sent by UPendingNetGame::SendInitialJoin + // Initiate the SML handshake + + FNetControlMessage::Send(Connection, GSML_HELLO); + Connection->FlushNet(true); + } + + if (MessageType == NMT_DebugText) { + const int64 Pos = Bunch.GetPosBits(); + + FString Text; + if (FNetControlMessage::Receive(Bunch, Text)) { + if(Text == GSML_HELLO) { + SetConnectionSupportsModMessages(Connection); + } + } + + // Only forward the message to the engine if it can be handled (see handshake explanation) + if (Connection->IsClientMsgTypeValid(NMT_DebugText)) { + Bunch.SetReadPosition(Pos); + } else { + Call.Cancel(); + } + } + if (MessageType == NMT_ModMessage) { FString ModId; int32 MessageId; FString Content; if (FNetControlMessage::Receive(Bunch, ModId, MessageId, Content)) { diff --git a/Mods/SML/Source/SML/Public/Network/NetworkHandler.h b/Mods/SML/Source/SML/Public/Network/NetworkHandler.h index 3ac73b7442..df577c96e0 100644 --- a/Mods/SML/Source/SML/Public/Network/NetworkHandler.h +++ b/Mods/SML/Source/SML/Public/Network/NetworkHandler.h @@ -72,6 +72,11 @@ class SML_API UModNetworkHandler : public UEngineSubsystem { */ static void SendMessage(class UNetConnection* Connection, FMessageType MessageType, FString Data); + /** + * Set the connection to support mod messages and send all pending messages + */ + static void SetConnectionSupportsModMessages(class UNetConnection* Connection); + /** * Retrieves the game instance owning the specified net driver */