diff --git a/README.md b/README.md index 639875f..682e5c6 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,8 @@ Use import with caution – in case of bug can broke your current account / viki * **Note:** import hideout from original dragonrescue dumps doesn't work and won't work, due to the lack of hideout in original data * farm * **Note:** due to the lack some data in original dragonrescue dumps, import farm (in some cases) can be limited only to main (default) farm - * inventory (**experimental** - can broke your account; blueprint not working, battle backpack not working correctly) + * inventory + * **Warning:** inventory contains many invisible items (for example affecting quests); inventory import can broke your account ### What doesn't work – TODO diff --git a/dragonrescue-import.csproj b/dragonrescue-import.csproj index bd168d0..780842f 100644 --- a/dragonrescue-import.csproj +++ b/dragonrescue-import.csproj @@ -6,7 +6,7 @@ enable true - 0.2.1 + 0.3.0 $(SourceRevisionId) $(MSBuildThisFileDirectory)bin diff --git a/src/Api/InventoryApi.cs b/src/Api/InventoryApi.cs index 6190b30..b7f1b97 100644 --- a/src/Api/InventoryApi.cs +++ b/src/Api/InventoryApi.cs @@ -37,6 +37,22 @@ public static async Task AddItems(HttpClient client, string apiToken, Di return bodyRaw; } + public static async Task AddBattleItems(HttpClient client, string apiToken, List itemsList) { + var request = new AddBattleItemsRequest { + BattleItemTierMaps = itemsList + }; + + var formContent = new FormUrlEncodedContent(new[] { + new KeyValuePair("apiKey", Config.APIKEY), + new KeyValuePair("apiToken", apiToken), + new KeyValuePair("request", XmlUtil.SerializeXml(request)), + }); + + var bodyRaw = await client.PostAndGetReplayOrThrow(Config.URL_CONT_API + "/V2/ContentWebService.asmx/AddBattleItems", formContent); + + return bodyRaw; + } + public static async Task GetCommonInventory(HttpClient client, string apiToken) { GetCommonInventoryRequest request = new GetCommonInventoryRequest { ContainerId = 1, diff --git a/src/Importers.cs b/src/Importers.cs index 239c7bc..2360857 100644 --- a/src/Importers.cs +++ b/src/Importers.cs @@ -118,16 +118,23 @@ public static async System.Threading.Tasks.Task ImportInventory(LoginApi.Data lo CommonInventoryData inventory = XmlUtil.DeserializeXml(System.IO.File.ReadAllText(path)); var inventoryChanges = new Dictionary(); + var battleInventoryChanges = new List(); foreach (UserItemData userItem in inventory.Item) { if (skipStables && userItem.Item.AssetName.Length >= 12 && userItem.Item.AssetName.Substring(0,12) == "DragonStable") continue; - //Console.WriteLine($"{userItem.ItemID} {userItem.Quantity} {userItem.ItemTier} {userItem.ItemStats}"); - // TODO support for DT items (items with non empty userItem.ItemTier and userItem.ItemStats) - - if (userItem.Item.BluePrint != null) continue; - - inventoryChanges[userItem.ItemID] = userItem.Quantity; + if (userItem.ItemTier != null && userItem.ItemStats != null) { + battleInventoryChanges.Add( + new BattleItemTierMap{ + ItemID = userItem.ItemID, + Quantity = userItem.Quantity, + Tier = userItem.ItemTier, + ItemStats = userItem.ItemStats + } + ); + } else { + inventoryChanges[userItem.ItemID] = userItem.Quantity; + } } // connect to server and login as viking @@ -139,8 +146,18 @@ public static async System.Threading.Tasks.Task ImportInventory(LoginApi.Data lo // send inventory to server Console.WriteLine("Importing inventory ... please be patient ... it may take a while ..."); - var res = await InventoryApi.AddItems(client2, apiToken, inventoryChanges); - Console.WriteLine(res); + var res1 = await InventoryApi.AddItems(client2, apiToken, inventoryChanges); + + XmlDocument res1Xml = new XmlDocument(); + res1Xml.LoadXml(res1); + Console.WriteLine(res1Xml["CIRS"]["s"].InnerText); + + Console.WriteLine("Importing battle inventory ... please be patient ... it may take a while ..."); + var res2 = await InventoryApi.AddBattleItems(client2, apiToken, battleInventoryChanges); + + XmlDocument res2Xml = new XmlDocument(); + res2Xml.LoadXml(res2); + Console.WriteLine(res2Xml["ABIRES"]["ST"].InnerText); } public static async System.Threading.Tasks.Task ImportHideout(LoginApi.Data loginData, string path, bool addToInventory = true) { diff --git a/src/Schema/AddBattleItemsRequest.cs b/src/Schema/AddBattleItemsRequest.cs new file mode 100644 index 0000000..4af6553 --- /dev/null +++ b/src/Schema/AddBattleItemsRequest.cs @@ -0,0 +1,10 @@ +using System.Xml.Serialization; + +namespace dragonrescue.Schema; + +[XmlRoot(ElementName = "ABIR", Namespace = "")] +[Serializable] +public class AddBattleItemsRequest { + [XmlElement(ElementName = "BITM", IsNullable = false)] + public List BattleItemTierMaps { get; set; } +} diff --git a/src/Schema/BattleItemTierMap.cs b/src/Schema/BattleItemTierMap.cs new file mode 100644 index 0000000..95e7f26 --- /dev/null +++ b/src/Schema/BattleItemTierMap.cs @@ -0,0 +1,19 @@ +using System.Xml.Serialization; + +namespace dragonrescue.Schema; + +[XmlRoot(ElementName = "BITM", Namespace = "")] +[Serializable] +public class BattleItemTierMap { + [XmlElement(ElementName = "IID", IsNullable = false)] + public int ItemID { get; set; } + + [XmlElement(ElementName = "T", IsNullable = true)] + public ItemTier? Tier { get; set; } + + [XmlElement(ElementName = "QTY", IsNullable = true)] + public int? Quantity { get; set; } + + [XmlElement(ElementName = "iss", IsNullable = true)] + public ItemStat[] ItemStats { get; set; } +}