Skip to content

Commit d8a17d8

Browse files
committed
Small improvements
- Check to avoid loading duplicate cloud saves - Load name, level and number of characters from cloud save - Load single cloud saves using ArkClusterData.LoadSingle
1 parent 1e0f882 commit d8a17d8

File tree

9 files changed

+162
-5
lines changed

9 files changed

+162
-5
lines changed

ArkSavegameToolkitNet.Domain/ArkCloudInventory.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class ArkCloudInventory : ArkClusterDataContainerBase
1515
{
1616
private static readonly ArkName _myArkData = ArkName.Create("MyArkData");
1717
private static readonly ArkName _arkItems = ArkName.Create("ArkItems");
18+
private static readonly ArkName _arkPlayerData = ArkName.Create("ArkPlayerData");
1819
private static readonly ArkName _arkTamedDinosData = ArkName.Create("ArkTamedDinosData");
1920

2021
internal static readonly ArkNameTree _dependencies = new ArkNameTree
@@ -24,6 +25,7 @@ public class ArkCloudInventory : ArkClusterDataContainerBase
2425
new ArkNameTree
2526
{
2627
{ _arkItems, null },
28+
{ _arkPlayerData, null },
2729
{ _arkTamedDinosData, null }
2830
}
2931
}
@@ -35,12 +37,14 @@ internal void Decouple()
3537
{
3638
_cloudinv = null;
3739
foreach (var item in Items) item.Decouple();
40+
foreach (var character in Characters) character.Decouple();
3841
foreach (var dino in Dinos) dino.Decouple();
3942
}
4043

4144
public ArkCloudInventory()
4245
{
4346
Items = new ArkCloudInventoryItem[] { };
47+
Characters = new ArkCloudInventoryCharacter[] { };
4448
Dinos = new ArkCloudInventoryDino[] { };
4549
}
4650

@@ -53,8 +57,10 @@ public ArkCloudInventory(string steamId, IGameObject cloudinv, ISaveState saveSt
5357
SteamId = steamId;
5458
var mydata = cloudinv.GetPropertyValue<StructPropertyList>(_myArkData);
5559
var items = mydata.GetPropertyValue<ArkArrayStruct>(_arkItems);
60+
var characters = mydata.GetPropertyValue<ArkArrayStruct>(_arkPlayerData);
5661
var dinos = mydata.GetPropertyValue<ArkArrayStruct>(_arkTamedDinosData);
5762
if (items != null) Items = items.OfType<StructPropertyList>().Select(x => new ArkCloudInventoryItem(x)).ToArray();
63+
if (characters != null) Characters = characters.OfType<StructPropertyList>().Select(x => new ArkCloudInventoryCharacter(x)).ToArray();
5864
if (dinos != null) Dinos = dinos.OfType<StructPropertyList>().Select((x, i) => new ArkCloudInventoryDino(x,
5965
dinoData?.ElementAtOrDefault(i)?.Creature,
6066
dinoData?.ElementAtOrDefault(i)?.Status,
@@ -66,6 +72,7 @@ public ArkCloudInventory(string steamId, IGameObject cloudinv, ISaveState saveSt
6672

6773
public string SteamId { get; set; }
6874
public ArkCloudInventoryItem[] Items { get; set; }
75+
public ArkCloudInventoryCharacter[] Characters { get; set; }
6976
public ArkCloudInventoryDino[] Dinos { get; set; }
7077
public DateTime SavedAt { get; set; }
7178
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using ArkSavegameToolkitNet.Arrays;
2+
using ArkSavegameToolkitNet.Property;
3+
using ArkSavegameToolkitNet.Structs;
4+
using ArkSavegameToolkitNet.Types;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Converters;
7+
using System;
8+
using System.Collections.Generic;
9+
using System.Linq;
10+
using System.Text;
11+
using System.Text.RegularExpressions;
12+
using System.Threading.Tasks;
13+
14+
namespace ArkSavegameToolkitNet.Domain
15+
{
16+
public class ArkCloudInventoryCharacter : ArkClusterDataContainerBase
17+
{
18+
private static readonly ArkName _myArkData = ArkName.Create("MyArkData");
19+
private static readonly ArkName _arkPlayerData = ArkName.Create("ArkPlayerData");
20+
21+
private static readonly ArkName _playerName = ArkName.Create("PlayerName");
22+
23+
private Regex _r_nameLevel = new Regex(@"^(?<name>.+) - Lvl (?<level>\d+)$", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
24+
25+
internal IPropertyContainer _character;
26+
27+
internal void Decouple()
28+
{
29+
_character = null;
30+
}
31+
32+
public ArkCloudInventoryCharacter()
33+
{
34+
}
35+
36+
internal static readonly ArkNameTree _dependencies = new ArkNameTree
37+
{
38+
{
39+
_myArkData,
40+
new ArkNameTree
41+
{
42+
{
43+
_arkPlayerData,
44+
new ArkNameTree
45+
{
46+
{ _playerName, null }
47+
}
48+
}
49+
}
50+
}
51+
};
52+
53+
public ArkCloudInventoryCharacter(IPropertyContainer character) : this()
54+
{
55+
_character = character;
56+
57+
//todo: add more properties for cloud characters
58+
//todo: read the player data from byte array
59+
var playerName = _character.GetPropertyValue<string>(_playerName);
60+
if (playerName != null)
61+
{
62+
var m = _r_nameLevel.Match(playerName);
63+
if (m.Success)
64+
{
65+
Name = m.Groups["name"].Value;
66+
Level = int.Parse(m.Groups["level"].Value);
67+
}
68+
}
69+
}
70+
71+
public string Name { get; set; }
72+
public int? Level { get; set; }
73+
}
74+
}
75+
76+
//"MyArkData->ArkPlayerData->bForServerTransfer (Boolean)",
77+
//"MyArkData->ArkPlayerData->bWithItems (Boolean)",
78+
//"MyArkData->ArkPlayerData->ItemCount (Int32)",
79+
//"MyArkData->ArkPlayerData->PlayerDataBytes (ArkArrayByte)",
80+
//"MyArkData->ArkPlayerData->PlayerDataID (Int64)",
81+
//"MyArkData->ArkPlayerData->PlayerName (String)",
82+
//"MyArkData->ArkPlayerData->PlayerStats (String)",
83+
//"MyArkData->ArkPlayerData->PlayerStats_1 (String)",
84+
//"MyArkData->ArkPlayerData->PlayerStats_10 (String)",
85+
//"MyArkData->ArkPlayerData->PlayerStats_11 (String)",
86+
//"MyArkData->ArkPlayerData->PlayerStats_2 (String)",
87+
//"MyArkData->ArkPlayerData->PlayerStats_3 (String)",
88+
//"MyArkData->ArkPlayerData->PlayerStats_4 (String)",
89+
//"MyArkData->ArkPlayerData->PlayerStats_5 (String)",
90+
//"MyArkData->ArkPlayerData->PlayerStats_6 (String)",
91+
//"MyArkData->ArkPlayerData->PlayerStats_7 (String)",
92+
//"MyArkData->ArkPlayerData->PlayerStats_8 (String)",
93+
//"MyArkData->ArkPlayerData->PlayerStats_9 (String)",
94+
//"MyArkData->ArkPlayerData->UploadingServerMapName (String)",
95+
//"MyArkData->ArkPlayerData->UploadTime (Int32)",
96+
//"MyArkData->ArkPlayerData->Version (Single)",

ArkSavegameToolkitNet.Domain/ArkClusterData.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.IO;
55
using System.Linq;
66
using System.Text;
7+
using System.Text.RegularExpressions;
78
using System.Threading;
89
using System.Threading.Tasks;
910
using ArkName = ArkSavegameToolkitNet.Types.ArkName;
@@ -14,6 +15,7 @@ namespace ArkSavegameToolkitNet.Domain
1415
{
1516
public class ArkClusterData : ArkClusterDataBase
1617
{
18+
private readonly Regex r_clusterFiles = new Regex(@"\d+$", RegexOptions.Singleline | RegexOptions.IgnoreCase);
1719
private readonly string _savePath;
1820
private readonly bool _loadOnlyPropertiesInDomain;
1921
private dynamic[] _newData;
@@ -24,6 +26,37 @@ public ArkClusterData(string savePath, bool loadOnlyPropertiesInDomain = false)
2426
_loadOnlyPropertiesInDomain = loadOnlyPropertiesInDomain;
2527
}
2628

29+
public static ArkClusterDataResult<ArkCloudInventory> LoadSingle(string savePath, CancellationToken ct, bool loadOnlyPropertiesInDomain = false, bool decouple = true)
30+
{
31+
var success = false;
32+
var cancelled = false;
33+
var st = Stopwatch.StartNew();
34+
ArkCloudInventory data = null;
35+
36+
try
37+
{
38+
var exclusivePropertyNameTree = loadOnlyPropertiesInDomain ? ArkClusterDataContainerBase._alldependencies : null;
39+
var arkcloudInventories = new ArkSavegameToolkitNet.ArkCloudInventory(savePath, exclusivePropertyNameTree: exclusivePropertyNameTree);
40+
41+
data = arkcloudInventories.InventoryData?.AsCloudInventory(arkcloudInventories.SteamId, SaveState.FromSaveTime(arkcloudInventories.SaveTime), arkcloudInventories.InventoryDinoData);
42+
if (decouple) data?.Decouple();
43+
success = true;
44+
}
45+
catch (OperationCanceledException)
46+
{
47+
cancelled = true;
48+
}
49+
50+
return new ArkClusterDataResult<ArkCloudInventory>
51+
{
52+
Success = success,
53+
Cancelled = cancelled,
54+
Elapsed = st.Elapsed,
55+
FilePath = savePath,
56+
Data = data
57+
};
58+
}
59+
2760
public ArkClusterDataUpdateResult Update(CancellationToken ct, bool deferApplyNewData = false)
2861
{
2962
var success = false;
@@ -36,7 +69,7 @@ public ArkClusterDataUpdateResult Update(CancellationToken ct, bool deferApplyNe
3669
var exclusivePropertyNameTree = _loadOnlyPropertiesInDomain ? ArkClusterDataContainerBase._alldependencies : null;
3770

3871
// Extract all cluster data
39-
var arkcloudInventories = Directory.GetFiles(_savePath, "*", SearchOption.TopDirectoryOnly).Select(x => new ArkSavegameToolkitNet.ArkCloudInventory(x, exclusivePropertyNameTree: exclusivePropertyNameTree)).ToArray();
72+
var arkcloudInventories = Directory.GetFiles(_savePath, "*", SearchOption.TopDirectoryOnly).Where(x => /*avoid loading duplicate cluster files*/ r_clusterFiles.IsMatch(Path.GetFileName(x))).Select(x => new ArkSavegameToolkitNet.ArkCloudInventory(x, exclusivePropertyNameTree: exclusivePropertyNameTree)).ToArray();
4073

4174
var cloudInventories = arkcloudInventories.Where(x => x.InventoryData != null).Select(x => x.InventoryData.AsCloudInventory(x.SteamId, SaveState.FromSaveTime(x.SaveTime), x.InventoryDinoData)).ToArray();
4275

ArkSavegameToolkitNet.Domain/ArkClusterDataBase.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public ArkClusterDataBase(
1919

2020
internal Dictionary<string, ArkCloudInventory> _playerCloudInventories;
2121
internal Dictionary<string, ArkCloudInventoryDino[]> _playerCloudCreatures;
22+
internal Dictionary<string, ArkCloudInventoryCharacter[]> _playerCloudCharacters;
2223
internal Dictionary<string, ArkCloudInventoryItem[]> _playerCloudItems;
2324
internal ArkCloudInventoryDino[] _cloudCreatures;
2425

@@ -28,6 +29,7 @@ internal void CopyTo(ArkClusterDataBase other)
2829
other._cloudCreatures = _cloudCreatures;
2930
other._playerCloudInventories = _playerCloudInventories;
3031
other._playerCloudCreatures = _playerCloudCreatures;
32+
other._playerCloudCharacters = _playerCloudCharacters;
3133
other._playerCloudItems = _playerCloudItems;
3234
}
3335

@@ -39,6 +41,8 @@ internal void Initialize()
3941

4042
_playerCloudCreatures = Inventories.ToDictionary(x => x.SteamId, x => x.Dinos);
4143

44+
_playerCloudCharacters = Inventories.ToDictionary(x => x.SteamId, x => x.Characters);
45+
4246
_playerCloudItems = Inventories.ToDictionary(x => x.SteamId, x => x.Items);
4347

4448
//_playerCloudCreatures = Inventories.SelectMany(x => x.Dinos.Select(y => new { s = x.SteamId, d = y }))

ArkSavegameToolkitNet.Domain/ArkClusterDataContainerBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public abstract class ArkClusterDataContainerBase
1313
internal static readonly ArkNameTree _alldependencies = ArkNameTree.Merge(
1414
ArkCloudInventory._dependencies,
1515
ArkCloudInventoryItem._dependencies,
16+
ArkCloudInventoryCharacter._dependencies,
1617
ArkCloudInventoryDino._dependencies,
1718
ArkCreature._dependencies,
1819
ArkTamedCreatureAncestor._dependencies,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace ArkSavegameToolkitNet.Domain
8+
{
9+
public class ArkClusterDataResult<TData> : ArkClusterDataUpdateResult
10+
{
11+
public string FilePath { get; set; }
12+
public TData Data { get; set; }
13+
}
14+
}

ArkSavegameToolkitNet.Domain/ArkSavegameToolkitNet.Domain.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@
5050
</ItemGroup>
5151
<ItemGroup>
5252
<Compile Include="ArkCloudInventoryDino.cs" />
53+
<Compile Include="ArkCloudInventoryCharacter.cs" />
5354
<Compile Include="ArkCloudInventoryItem.cs" />
5455
<Compile Include="ArkClusterData.cs" />
56+
<Compile Include="ArkClusterDataResult.cs" />
5557
<Compile Include="ArkGameData.cs" />
5658
<Compile Include="ArkClusterDataBase.cs" />
5759
<Compile Include="ArkGameDataBase.cs" />

ArkSavegameToolkitNet.Domain/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("1.3.0.0")]
36-
[assembly: AssemblyFileVersion("1.3.0.0")]
35+
[assembly: AssemblyVersion("1.4.0.0")]
36+
[assembly: AssemblyFileVersion("1.4.0.0")]
3737

3838
//todo: temp for dev purposes
3939
[assembly: InternalsVisibleTo("ArkSavegameToolkitNet.TestConsoleApp")]

ArkSavegameToolkitNet/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("1.3.0.0")]
36-
[assembly: AssemblyFileVersion("1.3.0.0")]
35+
[assembly: AssemblyVersion("1.4.0.0")]
36+
[assembly: AssemblyFileVersion("1.4.0.0")]
3737

3838
[assembly: InternalsVisibleTo("ArkSavegameToolkitNet.Domain")]

0 commit comments

Comments
 (0)