From 74bf5d12ca30b36bf116223116a0e035af90d634 Mon Sep 17 00:00:00 2001 From: Evil Factory <36804725+evilfactory@users.noreply.github.com> Date: Tue, 17 May 2022 19:15:44 -0300 Subject: [PATCH] added Steam.DownloadWorkshopItem and Steam.GetWorkshopItem --- .../Lua/DefaultRegister/RegisterShared.lua | 18 +++- .../LuaCs/Lua/LuaCustomConverters.cs | 5 ++ .../SharedSource/LuaCs/LuaCsSetup.cs | 7 ++ .../SharedSource/LuaCs/LuaCsSteam.cs | 90 +++++++++++++++++++ 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSteam.cs diff --git a/Barotrauma/BarotraumaShared/Lua/DefaultRegister/RegisterShared.lua b/Barotrauma/BarotraumaShared/Lua/DefaultRegister/RegisterShared.lua index f1558582b..d080f66d0 100644 --- a/Barotrauma/BarotraumaShared/Lua/DefaultRegister/RegisterShared.lua +++ b/Barotrauma/BarotraumaShared/Lua/DefaultRegister/RegisterShared.lua @@ -232,4 +232,20 @@ Register("Microsoft.Xna.Framework.Vector4") Register("Microsoft.Xna.Framework.Color") Register("Microsoft.Xna.Framework.Point") Register("Microsoft.Xna.Framework.Rectangle") -Register("Microsoft.Xna.Framework.Matrix") \ No newline at end of file +Register("Microsoft.Xna.Framework.Matrix") + +local friend = Register("Steamworks.Friend") + +LuaUserData.RemoveMember(friend, "InviteToGame") +LuaUserData.RemoveMember(friend, "SendMessage") + +local workshopItem = Register("Steamworks.Ugc.Item") + +LuaUserData.RemoveMember(workshopItem, "Subscribe") +LuaUserData.RemoveMember(workshopItem, "DownloadAsync") +LuaUserData.RemoveMember(workshopItem, "Unsubscribe") +LuaUserData.RemoveMember(workshopItem, "AddFavorite") +LuaUserData.RemoveMember(workshopItem, "RemoveFavorite") +LuaUserData.RemoveMember(workshopItem, "Vote") +LuaUserData.RemoveMember(workshopItem, "GetUserVote") +LuaUserData.RemoveMember(workshopItem, "Edit") \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs index 5bbf70773..357a52c59 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaCustomConverters.cs @@ -103,6 +103,11 @@ namespace Barotrauma return DynValue.NewString(v.ToString()); }); + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.String, typeof(UInt64), v => + { + return UInt64.Parse(v.String); + }); + Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion(DataType.UserData, typeof(object), v => { if (v.UserData.Object is LuaByte lbyte) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 3e1912b8d..e0bcdf466 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -60,6 +60,8 @@ namespace Barotrauma public LuaCsTimer Timer { get; private set; } public LuaCsNetworking Networking { get; private set; } + public LuaCsSteam Steam { get; private set; } + public LuaCsModStore ModStore { get; private set; } private LuaRequire require { get; set; } @@ -301,6 +303,7 @@ namespace Barotrauma { Hook?.Update(); Timer?.Update(); + Steam?.Update(); } public void Stop() @@ -325,6 +328,7 @@ namespace Barotrauma Game = new LuaGame(); Networking = new LuaCsNetworking(); Timer = new LuaCsTimer(); + Steam = new LuaCsSteam(); LuaScriptLoader = null; lua = null; Lua = null; @@ -371,6 +375,7 @@ namespace Barotrauma Game = new LuaGame(); Networking = new LuaCsNetworking(); Timer = new LuaCsTimer(); + Steam = new LuaCsSteam(); Hook.Initialize(); ModStore.Initialize(); @@ -384,6 +389,7 @@ namespace Barotrauma UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); + UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); @@ -406,6 +412,7 @@ namespace Barotrauma lua.Globals["Timer"] = Timer; lua.Globals["File"] = UserData.CreateStatic(); lua.Globals["Networking"] = Networking; + lua.Globals["Steam"] = Steam; lua.Globals["SERVER"] = IsServer; lua.Globals["CLIENT"] = IsClient; diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSteam.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSteam.cs new file mode 100644 index 000000000..bb68f90a5 --- /dev/null +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSteam.cs @@ -0,0 +1,90 @@ +using Steamworks; +using Steamworks.Data; +using Barotrauma.Steam; +using System.Threading; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Threading.Tasks; +using System; + +namespace Barotrauma +{ + partial class LuaCsSteam + { + private struct WorkshopItemDownload + { + public ulong ID; + public string Destination; + public LuaCsAction Callback; + } + + List itemsBeingDownloaded = new List(); + + public LuaCsSteam() + { + + } + + private async void DownloadWorkshopItemAsync(WorkshopItemDownload download) + { + Steamworks.Ugc.Item? item = await SteamManager.Workshop.GetItem(download.ID); + + if (!item.HasValue) { return; } + + if (item.Value.IsInstalled) + { + if (download.Callback != null) + { + Directory.Move(item.Value.Directory, download.Destination); + download.Callback(item); + } + + itemsBeingDownloaded.Remove(download); + return; + } + + SteamUGC.Download(item.Value.Id, true); + + if (!itemsBeingDownloaded.Contains(download)) + { + itemsBeingDownloaded.Add(download); + } + } + + + public void DownloadWorkshopItem(ulong id, string destination, LuaCsAction callback) + { + if (!LuaCsFile.IsPathAllowedException(destination)) { return; } + + DownloadWorkshopItemAsync(new WorkshopItemDownload() + { + ID = id, + Destination = destination, + Callback = callback + }); + } + + public void DownloadWorkshopItem(Steamworks.Ugc.Item item, string destination, LuaCsAction callback) + { + DownloadWorkshopItem(item.Id.Value, destination, callback); + } + + public async void GetWorkshopItem(UInt64 id, LuaCsAction callback) + { + Steamworks.Ugc.Item? item = await SteamManager.Workshop.GetItem(id); + callback(item); + } + + public void Update() + { + if (itemsBeingDownloaded.Count > 0) // SteamUGC.OnDownloadItemResult for some reason doesn't work, so i need to do this stupid thing. + { + foreach (var item in itemsBeingDownloaded) + { + DownloadWorkshopItemAsync(item); + } + } + } + } +} \ No newline at end of file