From f57e40b873558f5fa44d744575d8e49303249676 Mon Sep 17 00:00:00 2001 From: ppd-hirano-kodai Date: Thu, 18 Dec 2025 17:07:39 +0900 Subject: [PATCH 1/4] Track ownership of subscribed workshop items --- PalworldModUploader/MainWindow.xaml | 4 ++-- PalworldModUploader/MainWindow.xaml.cs | 23 +++++++++++-------- .../ViewModels/ModDirectoryEntry.cs | 16 +++++++++++++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/PalworldModUploader/MainWindow.xaml b/PalworldModUploader/MainWindow.xaml index 85320d1..e9bbeef 100644 --- a/PalworldModUploader/MainWindow.xaml +++ b/PalworldModUploader/MainWindow.xaml @@ -170,8 +170,8 @@ - diff --git a/PalworldModUploader/MainWindow.xaml.cs b/PalworldModUploader/MainWindow.xaml.cs index 8d15be7..960d6e4 100644 --- a/PalworldModUploader/MainWindow.xaml.cs +++ b/PalworldModUploader/MainWindow.xaml.cs @@ -48,7 +48,7 @@ public partial class MainWindow : Window private const string WorkshopAgreementUrl = "https://steamcommunity.com/sharedfiles/workshoplegalagreement"; private readonly ObservableCollection _modEntries = new(); - private ulong[] _subscribedItemIds = Array.Empty(); + private Dictionary _subscribedItemIds = new(); private readonly JsonSerializerOptions _jsonOptions = new() { AllowTrailingCommas = true, @@ -116,7 +116,7 @@ private async void OnLoaded(object? sender, RoutedEventArgs e) WorkshopDirTextBox.Text = _workshopContentDirectory; LoadModsFromDirectory(_workshopContentDirectory); - if (!foundSubscribed && _subscribedItemIds.Length == 0) + if (!foundSubscribed && _subscribedItemIds.Count == 0) { StatusTextBlock.Text = "No workshop subscriptions were detected via Steam. Using the configured directory."; } @@ -156,9 +156,9 @@ private async Task DiscoverWorkshopContentDirectoryAsync() private async Task RefreshSubscribedItemsAsync() { - _subscribedItemIds = Array.Empty(); + _subscribedItemIds = new Dictionary(); - var subscribedItemIds = new List(); + var subscribedItemIds = new Dictionary(); uint pageNumber = 1; uint processedResults = 0; @@ -207,9 +207,9 @@ private async Task RefreshSubscribedItemsAsync() } } - _subscribedItemIds = subscribedItemIds.ToArray(); + _subscribedItemIds = subscribedItemIds; - return receivedAnyResult && _subscribedItemIds.Length > 0; + return receivedAnyResult && _subscribedItemIds.Count > 0; } private async Task<(SteamUGCQueryCompleted_t Data, bool IoFailure)?> SendSubscribedItemsQueryAsync(uint pageNumber) @@ -255,7 +255,7 @@ private async Task RefreshSubscribedItemsAsync() } } - private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, ICollection subscribedItemIds) + private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, IDictionary subscribedItemIds) { for (uint i = 0; i < data.m_unNumResultsReturned; i++) { @@ -265,7 +265,8 @@ private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, ICollecti } var publishedFileId = details.m_nPublishedFileId; - subscribedItemIds.Add(publishedFileId.m_PublishedFileId); + var isOwnedByUser = details.m_ulSteamIDOwner == SteamUser.GetSteamID().GetAccountID(); + subscribedItemIds[publishedFileId.m_PublishedFileId] = isOwnedByUser; } } @@ -364,14 +365,16 @@ private void LoadModsFromDirectory(string baseDirectory) var dirInfo = new DirectoryInfo(directory); var entry = new ModDirectoryEntry(dirInfo.Name, dirInfo.FullName); - if (ulong.TryParse(dirInfo.Name, out var directoryId) && _subscribedItemIds.Contains(directoryId)) + if (ulong.TryParse(dirInfo.Name, out var directoryId) && _subscribedItemIds.TryGetValue(directoryId, out var isOwnedByUser)) { entry.IsSubscribed = true; entry.SubscribedPublishedFileId = directoryId; + entry.IsOwnedByUser = isOwnedByUser; } else { entry.Metadata = LoadMetadata(dirInfo.FullName); + entry.IsOwnedByUser = false; } var infoPath = Path.Combine(dirInfo.FullName, "Info.json"); @@ -642,7 +645,7 @@ private async void ReloadButton_Click(object sender, RoutedEventArgs e) PersistWorkshopDirectory(_workshopContentDirectory); LoadModsFromDirectory(_workshopContentDirectory); - if (!foundSubscribed && _subscribedItemIds.Length == 0) + if (!foundSubscribed && _subscribedItemIds.Count == 0) { StatusTextBlock.Text = "No workshop subscriptions were detected via Steam. Loaded the configured directory."; } diff --git a/PalworldModUploader/ViewModels/ModDirectoryEntry.cs b/PalworldModUploader/ViewModels/ModDirectoryEntry.cs index 8b22e1d..1dec878 100644 --- a/PalworldModUploader/ViewModels/ModDirectoryEntry.cs +++ b/PalworldModUploader/ViewModels/ModDirectoryEntry.cs @@ -12,6 +12,7 @@ public sealed class ModDirectoryEntry : INotifyPropertyChanged private ModInfo? _info; private WorkshopMetadata? _metadata; private bool _isSubscribed; + private bool _isOwnedByUser; private string? _infoLoadError; private ulong? _subscribedPublishedFileId; @@ -93,6 +94,21 @@ public bool IsSubscribed } } + public bool IsOwnedByUser + { + get => _isOwnedByUser; + set + { + if (_isOwnedByUser == value) + { + return; + } + + _isOwnedByUser = value; + OnPropertyChanged(nameof(IsOwnedByUser)); + } + } + public string? InfoLoadError { get => _infoLoadError; From a7b2037c5e7c9c27cc9ad44f8003dbc24032a713 Mon Sep 17 00:00:00 2001 From: "kodai.hirano" Date: Thu, 18 Dec 2025 17:18:04 +0900 Subject: [PATCH 2/4] compare SteamId --- PalworldModUploader/MainWindow.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PalworldModUploader/MainWindow.xaml.cs b/PalworldModUploader/MainWindow.xaml.cs index 960d6e4..1a76fda 100644 --- a/PalworldModUploader/MainWindow.xaml.cs +++ b/PalworldModUploader/MainWindow.xaml.cs @@ -265,7 +265,7 @@ private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, IDictiona } var publishedFileId = details.m_nPublishedFileId; - var isOwnedByUser = details.m_ulSteamIDOwner == SteamUser.GetSteamID().GetAccountID(); + var isOwnedByUser = details.m_ulSteamIDOwner == SteamUser.GetSteamID().m_SteamID; subscribedItemIds[publishedFileId.m_PublishedFileId] = isOwnedByUser; } } From 5c2580e964c62673cc5af296d8944d8fb4d1fe57 Mon Sep 17 00:00:00 2001 From: "kodai.hirano" Date: Thu, 18 Dec 2025 17:18:59 +0900 Subject: [PATCH 3/4] can upload owned item --- PalworldModUploader/MainWindow.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PalworldModUploader/MainWindow.xaml.cs b/PalworldModUploader/MainWindow.xaml.cs index 1a76fda..7ace88c 100644 --- a/PalworldModUploader/MainWindow.xaml.cs +++ b/PalworldModUploader/MainWindow.xaml.cs @@ -535,7 +535,7 @@ private void UpdateModDetails() PalSchemaTypeCheckBox.IsEnabled = canEditInstallRules; InstallRuleManualWarning.Visibility = (canEdit && !isInstallRuleStandard) ? Visibility.Visible : Visibility.Collapsed; - UploadButton.IsEnabled = !_selectedEntry.IsSubscribed; + UploadButton.IsEnabled = _selectedEntry.IsOwnedByUser; OpenModDirectoryButton.IsEnabled = true; OpenInSteamButton.IsEnabled = true; SaveModInfoButton.IsEnabled = false; From d1f0fd275652e7bbb866be76b9bd325014c251ea Mon Sep 17 00:00:00 2001 From: "kodai.hirano" Date: Thu, 18 Dec 2025 17:35:43 +0900 Subject: [PATCH 4/4] hide Your Item column --- PalworldModUploader/MainWindow.xaml | 4 ++-- PalworldModUploader/MainWindow.xaml.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PalworldModUploader/MainWindow.xaml b/PalworldModUploader/MainWindow.xaml index e9bbeef..1e36232 100644 --- a/PalworldModUploader/MainWindow.xaml +++ b/PalworldModUploader/MainWindow.xaml @@ -170,9 +170,9 @@ - + Width="*" /> --> diff --git a/PalworldModUploader/MainWindow.xaml.cs b/PalworldModUploader/MainWindow.xaml.cs index 7ace88c..3ec7177 100644 --- a/PalworldModUploader/MainWindow.xaml.cs +++ b/PalworldModUploader/MainWindow.xaml.cs @@ -535,7 +535,7 @@ private void UpdateModDetails() PalSchemaTypeCheckBox.IsEnabled = canEditInstallRules; InstallRuleManualWarning.Visibility = (canEdit && !isInstallRuleStandard) ? Visibility.Visible : Visibility.Collapsed; - UploadButton.IsEnabled = _selectedEntry.IsOwnedByUser; + //UploadButton.IsEnabled = _selectedEntry.IsOwnedByUser; OpenModDirectoryButton.IsEnabled = true; OpenInSteamButton.IsEnabled = true; SaveModInfoButton.IsEnabled = false;