diff --git a/CUE4Parse b/CUE4Parse
index d2d8fe2e..0a98d821 160000
--- a/CUE4Parse
+++ b/CUE4Parse
@@ -1 +1 @@
-Subproject commit d2d8fe2e3e9575fea5f18ce8e317ff62acaa66c7
+Subproject commit 0a98d821d8d0c93ead31bec576e27313efb2f9a5
diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj
index 927b871a..0896e87d 100644
--- a/FModel/FModel.csproj
+++ b/FModel/FModel.csproj
@@ -107,21 +107,21 @@
-
-
+
+
-
+
-
-
-
+
+
+
-
+
diff --git a/FModel/Framework/JsonNetSerializer.cs b/FModel/Framework/JsonNetSerializer.cs
index 6bc2ee4d..68daf367 100644
--- a/FModel/Framework/JsonNetSerializer.cs
+++ b/FModel/Framework/JsonNetSerializer.cs
@@ -2,11 +2,11 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using RestSharp;
-using RestSharp.Serialization;
+using RestSharp.Serializers;
namespace FModel.Framework;
-public class JsonNetSerializer : IRestSerializer
+public class JsonNetSerializer : IRestSerializer, ISerializer, IDeserializer
{
public static readonly JsonSerializerSettings SerializerSettings = new()
{
@@ -15,28 +15,16 @@ public class JsonNetSerializer : IRestSerializer
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
- public string Serialize(object obj)
- {
- return JsonConvert.SerializeObject(obj);
- }
+ public string Serialize(Parameter parameter) => JsonConvert.SerializeObject(parameter.Value);
+ public string Serialize(object obj) => JsonConvert.SerializeObject(obj);
+ public T Deserialize(RestResponse response) => JsonConvert.DeserializeObject(response.Content!, SerializerSettings);
- [Obsolete]
- public string Serialize(Parameter parameter)
- {
- return JsonConvert.SerializeObject(parameter.Value);
- }
+ public ISerializer Serializer => this;
+ public IDeserializer Deserializer => this;
- public T Deserialize(IRestResponse response)
- {
- return JsonConvert.DeserializeObject(response.Content, SerializerSettings);
- }
-
- public string[] SupportedContentTypes { get; } =
- {
- "application/json", "application/json; charset=UTF-8"
- };
-
- public string ContentType { get; set; } = "application/json; charset=UTF-8";
+ public string ContentType { get; set; } = "application/json";
+ public string[] AcceptedContentTypes => RestSharp.Serializers.ContentType.JsonAccept;
+ public SupportsContentType SupportsContentType => contentType => contentType.EndsWith("json", StringComparison.InvariantCultureIgnoreCase);
public DataFormat DataFormat => DataFormat.Json;
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpointViewModel.cs b/FModel/ViewModels/ApiEndpointViewModel.cs
index 94b66268..55d5d6af 100644
--- a/FModel/ViewModels/ApiEndpointViewModel.cs
+++ b/FModel/ViewModels/ApiEndpointViewModel.cs
@@ -6,10 +6,13 @@ namespace FModel.ViewModels;
public class ApiEndpointViewModel
{
- private readonly IRestClient _client = new RestClient
+ private readonly RestClient _client = new RestClient
{
- UserAgent = $"FModel/{Constants.APP_VERSION}",
- Timeout = 3 * 1000
+ Options =
+ {
+ UserAgent = $"FModel/{Constants.APP_VERSION}",
+ MaxTimeout = 3 * 1000
+ }
}.UseSerializer();
public FortniteApiEndpoint FortniteApi { get; }
@@ -26,4 +29,4 @@ public class ApiEndpointViewModel
EpicApi = new EpicApiEndpoint(_client);
FModelApi = new FModelApi(_client);
}
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs b/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs
index c66aa0f7..ea0f4c04 100644
--- a/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs
+++ b/FModel/ViewModels/ApiEndpoints/AbstractApiProvider.cs
@@ -4,10 +4,10 @@ namespace FModel.ViewModels.ApiEndpoints;
public abstract class AbstractApiProvider
{
- protected readonly IRestClient _client;
+ protected readonly RestClient _client;
- protected AbstractApiProvider(IRestClient client)
+ protected AbstractApiProvider(RestClient client)
{
_client = client;
}
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs
index 8dc631f0..5bd477ff 100644
--- a/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs
+++ b/FModel/ViewModels/ApiEndpoints/BenbotApiEndpoint.cs
@@ -10,13 +10,13 @@ namespace FModel.ViewModels.ApiEndpoints;
public class BenbotApiEndpoint : AbstractApiProvider
{
- public BenbotApiEndpoint(IRestClient client) : base(client)
+ public BenbotApiEndpoint(RestClient client) : base(client)
{
}
public async Task GetAesKeysAsync(CancellationToken token)
{
- var request = new RestRequest("https://benbot.app/api/v2/aes", Method.GET)
+ var request = new RestRequest("https://benbot.app/api/v2/aes")
{
OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; }
};
@@ -32,7 +32,7 @@ public class BenbotApiEndpoint : AbstractApiProvider
public async Task GetMappingsAsync(CancellationToken token)
{
- var request = new RestRequest("https://benbot.app/api/v1/mappings", Method.GET)
+ var request = new RestRequest("https://benbot.app/api/v1/mappings")
{
OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; }
};
@@ -48,7 +48,7 @@ public class BenbotApiEndpoint : AbstractApiProvider
public async Task>> GetHotfixesAsync(CancellationToken token, string language = "en-US")
{
- var request = new RestRequest("https://benbot.app/api/v1/hotfixes", Method.GET)
+ var request = new RestRequest("https://benbot.app/api/v1/hotfixes")
{
OnBeforeDeserialization = resp => { resp.ContentType = "application/json; charset=utf-8"; }
};
@@ -65,7 +65,7 @@ public class BenbotApiEndpoint : AbstractApiProvider
public async Task DownloadFileAsync(string fileLink, string installationPath)
{
- var request = new RestRequest(fileLink, Method.GET);
+ var request = new RestRequest(fileLink);
var data = _client.DownloadData(request);
await File.WriteAllBytesAsync(installationPath, data);
}
@@ -74,4 +74,4 @@ public class BenbotApiEndpoint : AbstractApiProvider
{
DownloadFileAsync(fileLink, installationPath).GetAwaiter().GetResult();
}
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs
index 95e0bf8f..57b1e9c7 100644
--- a/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs
+++ b/FModel/ViewModels/ApiEndpoints/EpicApiEndpoint.cs
@@ -15,7 +15,7 @@ public class EpicApiEndpoint : AbstractApiProvider
private const string _BASIC_TOKEN = "basic MzQ0NmNkNzI2OTRjNGE0NDg1ZDgxYjc3YWRiYjIxNDE6OTIwOWQ0YTVlMjVhNDU3ZmI5YjA3NDg5ZDMxM2I0MWE=";
private const string _LAUNCHER_ASSETS = "https://launcher-public-service-prod06.ol.epicgames.com/launcher/api/public/assets/v2/platform/Windows/namespace/fn/catalogItem/4fe75bbc5a674f4f9b356b5c90567da5/app/Fortnite/label/Live";
- public EpicApiEndpoint(IRestClient client) : base(client)
+ public EpicApiEndpoint(RestClient client) : base(client)
{
}
@@ -30,7 +30,7 @@ public class EpicApiEndpoint : AbstractApiProvider
}
}
- var request = new RestRequest(_LAUNCHER_ASSETS, Method.GET);
+ var request = new RestRequest(_LAUNCHER_ASSETS);
request.AddHeader("Authorization", $"bearer {UserSettings.Default.LastAuthResponse.AccessToken}");
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource);
@@ -44,7 +44,7 @@ public class EpicApiEndpoint : AbstractApiProvider
private async Task GetAuthAsync(CancellationToken token)
{
- var request = new RestRequest(_OAUTH_URL, Method.POST);
+ var request = new RestRequest(_OAUTH_URL, Method.Post);
request.AddHeader("Authorization", _BASIC_TOKEN);
request.AddParameter("grant_type", "client_credentials");
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
@@ -57,4 +57,4 @@ public class EpicApiEndpoint : AbstractApiProvider
if (string.IsNullOrEmpty(UserSettings.Default.LastAuthResponse.AccessToken)) return true;
return DateTime.Now.Subtract(TimeSpan.FromHours(1)) >= UserSettings.Default.LastAuthResponse.ExpiresAt;
}
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpoints/FModelApi.cs b/FModel/ViewModels/ApiEndpoints/FModelApi.cs
index 003adf65..aa763d32 100644
--- a/FModel/ViewModels/ApiEndpoints/FModelApi.cs
+++ b/FModel/ViewModels/ApiEndpoints/FModelApi.cs
@@ -28,13 +28,13 @@ public class FModelApi : AbstractApiProvider
private readonly IDictionary _communityDesigns = new Dictionary();
private ApplicationViewModel _applicationView => ApplicationService.ApplicationView;
- public FModelApi(IRestClient client) : base(client)
+ public FModelApi(RestClient client) : base(client)
{
}
public async Task GetNewsAsync(CancellationToken token)
{
- var request = new RestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}", Method.GET);
+ var request = new RestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}");
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource);
return response.Data;
@@ -47,7 +47,7 @@ public class FModelApi : AbstractApiProvider
public async Task GetInfosAsync(CancellationToken token, EUpdateMode updateMode)
{
- var request = new RestRequest($"https://api.fmodel.app/v1/infos/{updateMode}", Method.GET);
+ var request = new RestRequest($"https://api.fmodel.app/v1/infos/{updateMode}");
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource);
return response.Data;
@@ -60,7 +60,7 @@ public class FModelApi : AbstractApiProvider
public async Task GetBackupsAsync(CancellationToken token, string gameName)
{
- var request = new RestRequest($"https://api.fmodel.app/v1/backups/{gameName}", Method.GET);
+ var request = new RestRequest($"https://api.fmodel.app/v1/backups/{gameName}");
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource);
return response.Data;
@@ -73,7 +73,7 @@ public class FModelApi : AbstractApiProvider
public async Task GetGamesAsync(CancellationToken token, string gameName)
{
- var request = new RestRequest($"https://api.fmodel.app/v1/games/{gameName}", Method.GET);
+ var request = new RestRequest($"https://api.fmodel.app/v1/games/{gameName}");
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource);
return response.Data;
@@ -86,7 +86,7 @@ public class FModelApi : AbstractApiProvider
public async Task GetDesignAsync(string designName)
{
- var request = new RestRequest($"https://api.fmodel.app/v1/designs/{designName}", Method.GET);
+ var request = new RestRequest($"https://api.fmodel.app/v1/designs/{designName}");
var response = await _client.ExecuteAsync(request).ConfigureAwait(false);
Log.Information("[{Method}] [{Status}({StatusCode})] '{Resource}'", request.Method, response.StatusDescription, (int) response.StatusCode, request.Resource);
return response.Data != null ? new CommunityDesign(response.Data) : null;
@@ -172,7 +172,7 @@ public class FModelApi : AbstractApiProvider
private void ShowChangelog(UpdateInfoEventArgs args)
{
- var request = new RestRequest(args.ChangelogURL, Method.GET);
+ var request = new RestRequest(args.ChangelogURL);
var response = _client.Execute(request);
if (string.IsNullOrEmpty(response.Content)) return;
@@ -181,4 +181,4 @@ public class FModelApi : AbstractApiProvider
_applicationView.CUE4Parse.TabControl.SelectedTab.SetDocumentText(response.Content, false);
UserSettings.Default.ShowChangelog = false;
}
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs
index ced45e01..6878e553 100644
--- a/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs
+++ b/FModel/ViewModels/ApiEndpoints/FortniteApiEndpoint.cs
@@ -7,13 +7,13 @@ namespace FModel.ViewModels.ApiEndpoints;
public class FortniteApiEndpoint : AbstractApiProvider
{
- public FortniteApiEndpoint(IRestClient client) : base(client)
+ public FortniteApiEndpoint(RestClient client) : base(client)
{
}
public async Task GetPlaylistAsync(string playlistId)
{
- var request = new RestRequest($"https://fortnite-api.com/v1/playlists/{playlistId}", Method.GET);
+ var request = new RestRequest($"https://fortnite-api.com/v1/playlists/{playlistId}");
var response = await _client.ExecuteAsync(request).ConfigureAwait(false);
return response.Data;
}
@@ -25,8 +25,8 @@ public class FortniteApiEndpoint : AbstractApiProvider
public bool TryGetBytes(Uri link, out byte[] data)
{
- var request = new RestRequest(link, Method.GET);
+ var request = new RestRequest(link);
data = _client.DownloadData(request);
return data != null;
}
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs
index 3a836d2c..29e23594 100644
--- a/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs
+++ b/FModel/ViewModels/ApiEndpoints/ValorantApiEndpoint.cs
@@ -20,13 +20,13 @@ public class ValorantApiEndpoint : AbstractApiProvider
{
private const string _URL = "https://fmodel.fortnite-api.com/valorant/v2/manifest";
- public ValorantApiEndpoint(IRestClient client) : base(client)
+ public ValorantApiEndpoint(RestClient client) : base(client)
{
}
public async Task GetManifestAsync(CancellationToken token)
{
- var request = new RestRequest(_URL, Method.GET);
+ var request = new RestRequest(_URL);
var response = await _client.ExecuteAsync(request, token).ConfigureAwait(false);
return new VManifest(response.RawBytes);
}
@@ -310,4 +310,4 @@ public class VPakStream : Stream, ICloneable
public override void Flush() => throw new NotSupportedException();
public override void SetLength(long value) => throw new NotSupportedException();
public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
-}
\ No newline at end of file
+}
diff --git a/FModel/ViewModels/MapViewerViewModel.cs b/FModel/ViewModels/MapViewerViewModel.cs
index e179ec3e..1026d68d 100644
--- a/FModel/ViewModels/MapViewerViewModel.cs
+++ b/FModel/ViewModels/MapViewerViewModel.cs
@@ -214,7 +214,7 @@ public class MapViewerViewModel : ViewModel
}
public BitmapImage GetImageToSave() => GetImageSource(GetLayerBitmap(true));
-
+
private SKBitmap GetLayerBitmap(bool withMap)
{
var ret = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
@@ -471,7 +471,7 @@ public class MapViewerViewModel : ViewModel
var patrolsPathBitmap = new SKBitmap(_widthHeight, _widthHeight, SKColorType.Rgba8888, SKAlphaType.Premul);
using var c = new SKCanvas(patrolsPathBitmap);
- var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Artemis_Overlay_S20_NPCLibrary");
+ var exports = Utils.LoadExports("/NPCLibrary/LevelOverlays/Artemis_Overlay_S21_NPCLibrary");
foreach (var export in exports)
{
if (!export.ExportType.Equals("FortAthenaPatrolPath", StringComparison.OrdinalIgnoreCase) ||
@@ -874,4 +874,4 @@ public class MapViewerViewModel : ViewModel
_bitmaps[0]["ApolloGameplay_TagsLocation"] = new MapLayer { Layer = tagsLocationBitmap, IsEnabled = false };
});
}
-}
\ No newline at end of file
+}