diff --git a/src/CraftSharp/App.razor b/src/CraftSharp/App.razor index 0643159..64264c7 100644 --- a/src/CraftSharp/App.razor +++ b/src/CraftSharp/App.razor @@ -1,12 +1,14 @@ - - - - - - - Not found - -

Sorry, there's nothing at this address.

-
-
-
+ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
+
\ No newline at end of file diff --git a/src/CraftSharp/CraftSharp.csproj b/src/CraftSharp/CraftSharp.csproj index 8055e4b..85da056 100644 --- a/src/CraftSharp/CraftSharp.csproj +++ b/src/CraftSharp/CraftSharp.csproj @@ -25,7 +25,11 @@ + + + + diff --git a/src/CraftSharp/Factories/ItemFactory.cs b/src/CraftSharp/Factories/ItemFactory.cs index e0e91fd..a305db3 100644 --- a/src/CraftSharp/Factories/ItemFactory.cs +++ b/src/CraftSharp/Factories/ItemFactory.cs @@ -17,7 +17,7 @@ namespace CraftSharp.Factories StackSize = item.StackSize, ImageContent = imageContent, ImageBase64 = string.IsNullOrWhiteSpace(item.ImageBase64) ? Convert.ToBase64String(imageContent) : item.ImageBase64, - Rarity = item.Rarity + //Rarity = item.Rarity }; } @@ -34,7 +34,7 @@ namespace CraftSharp.Factories StackSize = model.StackSize, CreatedDate = DateTime.Now, ImageBase64 = Convert.ToBase64String(model.ImageContent), - Rarity = model.Rarity + //Rarity = model.Rarity }; } @@ -48,7 +48,7 @@ namespace CraftSharp.Factories item.StackSize = model.StackSize; item.UpdatedDate = DateTime.Now; item.ImageBase64 = Convert.ToBase64String(model.ImageContent); - item.Rarity = model.Rarity; + //item.Rarity = model.Rarity; } } diff --git a/src/CraftSharp/Modals/DeleteConfirmation.razor b/src/CraftSharp/Modals/DeleteConfirmation.razor new file mode 100644 index 0000000..b565665 --- /dev/null +++ b/src/CraftSharp/Modals/DeleteConfirmation.razor @@ -0,0 +1,10 @@ +
+ +

+ Are you sure you want to delete @item.DisplayName ? +

+ + + + +
\ No newline at end of file diff --git a/src/CraftSharp/Modals/DeleteConfirmation.razor.cs b/src/CraftSharp/Modals/DeleteConfirmation.razor.cs new file mode 100644 index 0000000..7775be9 --- /dev/null +++ b/src/CraftSharp/Modals/DeleteConfirmation.razor.cs @@ -0,0 +1,38 @@ +using Blazored.Modal; +using Blazored.Modal.Services; +using CraftSharp.Models; +using CraftSharp.Services; +using Microsoft.AspNetCore.Components; + +namespace CraftSharp.Modals +{ + public partial class DeleteConfirmation + { + [CascadingParameter] + public BlazoredModalInstance ModalInstance { get; set; } + + [Inject] + public IDataService DataService { get; set; } + + [Parameter] + public int Id { get; set; } + + private Item item = new Item(); + + protected override async Task OnInitializedAsync() + { + // Get the item + item = await DataService.GetById(Id); + } + + void ConfirmDelete() + { + ModalInstance.CloseAsync(ModalResult.Ok(true)); + } + + void Cancel() + { + ModalInstance.CancelAsync(); + } + } +} diff --git a/src/CraftSharp/Models/Item.cs b/src/CraftSharp/Models/Item.cs index eaf12d8..48f3be7 100644 --- a/src/CraftSharp/Models/Item.cs +++ b/src/CraftSharp/Models/Item.cs @@ -13,6 +13,6 @@ public DateTime? UpdatedDate { get; set; } public string ImageBase64 { get; set; } - public Rarities Rarity { get; set; } + //public Rarities Rarity { get; set; } } } diff --git a/src/CraftSharp/Models/ItemModel.cs b/src/CraftSharp/Models/ItemModel.cs index a778e4a..88f7b6a 100644 --- a/src/CraftSharp/Models/ItemModel.cs +++ b/src/CraftSharp/Models/ItemModel.cs @@ -36,7 +36,7 @@ namespace CraftSharp.Models public string ImageBase64 { get; set; } - [Required] - public Rarities Rarity { get; set; } + /*[Required] + public Rarities Rarity { get; set; }*/ } } diff --git a/src/CraftSharp/Pages/Add.razor b/src/CraftSharp/Pages/Add.razor new file mode 100644 index 0000000..0ed932c --- /dev/null +++ b/src/CraftSharp/Pages/Add.razor @@ -0,0 +1,69 @@ +@page "/add" + +

Add

+ + + + + +

+ +

+

+ +

+

+ +

+

+ +

+

+ Enchant categories: +

+ @foreach (var item in enchantCategories) + { + + } +
+

+

+ Repair with: +

+ @foreach (var item in repairWith) + { + + } +
+

+

+ +

+

+ +

+ + +
\ No newline at end of file diff --git a/src/CraftSharp/Pages/Add.razor.cs b/src/CraftSharp/Pages/Add.razor.cs new file mode 100644 index 0000000..28d5d8e --- /dev/null +++ b/src/CraftSharp/Pages/Add.razor.cs @@ -0,0 +1,89 @@ +using Blazored.LocalStorage; +using CraftSharp.Models; +using CraftSharp.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; + +namespace CraftSharp.Pages +{ + public partial class Add + { + /// + /// The default enchant categories. + /// + private List enchantCategories = new List() { "armor", "armor_head", "armor_chest", "weapon", "digger", "breakable", "vanishable" }; + + /// + /// The current item model + /// + private ItemModel itemModel = new() + { + EnchantCategories = new List(), + RepairWith = new List() + }; + + /// + /// The default repair with. + /// + private List repairWith = new List() { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks", "crimson_planks", "warped_planks" }; + + [Inject] + public IDataService DataService { get; set; } + + [Inject] + public NavigationManager NavigationManager { get; set; } + + private async void HandleValidSubmit() + { + await DataService.Add(itemModel); + + NavigationManager.NavigateTo("list"); + } + + private async Task LoadImage(InputFileChangeEventArgs e) + { + // Set the content of the image to the model + using (var memoryStream = new MemoryStream()) + { + await e.File.OpenReadStream().CopyToAsync(memoryStream); + itemModel.ImageContent = memoryStream.ToArray(); + } + } + + private void OnEnchantCategoriesChange(string item, object checkedValue) + { + if ((bool)checkedValue) + { + if (!itemModel.EnchantCategories.Contains(item)) + { + itemModel.EnchantCategories.Add(item); + } + + return; + } + + if (itemModel.EnchantCategories.Contains(item)) + { + itemModel.EnchantCategories.Remove(item); + } + } + + private void OnRepairWithChange(string item, object checkedValue) + { + if ((bool)checkedValue) + { + if (!itemModel.RepairWith.Contains(item)) + { + itemModel.RepairWith.Add(item); + } + + return; + } + + if (itemModel.RepairWith.Contains(item)) + { + itemModel.RepairWith.Remove(item); + } + } + } +} diff --git a/src/CraftSharp/Pages/Crafting.razor b/src/CraftSharp/Pages/Crafting.razor new file mode 100644 index 0000000..95529a1 --- /dev/null +++ b/src/CraftSharp/Pages/Crafting.razor @@ -0,0 +1,5 @@ +@page "/Crafting" + +
+ +
\ No newline at end of file diff --git a/src/CraftSharp/Pages/Crafting.razor.cs b/src/CraftSharp/Pages/Crafting.razor.cs new file mode 100644 index 0000000..0ce2f97 --- /dev/null +++ b/src/CraftSharp/Pages/Crafting.razor.cs @@ -0,0 +1,32 @@ +using CraftSharp.Components; +using CraftSharp.Models; +using CraftSharp.Services; +using Microsoft.AspNetCore.Components; + +namespace CraftSharp.Pages +{ + public partial class Crafting + { + [Inject] + public IDataService DataService { get; set; } + + public List Items { get; set; } = new List(); + + private List Recipes { get; set; } = new List(); + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + base.OnAfterRenderAsync(firstRender); + + if (!firstRender) + { + return; + } + + Items = await DataService.List(0, await DataService.Count()); + Recipes = await DataService.GetRecipes(); + + StateHasChanged(); + } + } +} diff --git a/src/CraftSharp/Pages/Edit.razor b/src/CraftSharp/Pages/Edit.razor new file mode 100644 index 0000000..029b141 --- /dev/null +++ b/src/CraftSharp/Pages/Edit.razor @@ -0,0 +1,88 @@ +@page "/edit/{Id:int}" + +

Edit

+ + + + + +

+ +

+

+ +

+

+ +

+

+ +

+

+ Enchant categories: +

+ @foreach (var item in enchantCategories) + { + + } +
+

+

+ Repair with: +

+ @foreach (var item in repairWith) + { + + } +
+

+

+ +

+

+ +

+

+ +

+

+ +

+ + +
\ No newline at end of file diff --git a/src/CraftSharp/Pages/Edit.razor.cs b/src/CraftSharp/Pages/Edit.razor.cs new file mode 100644 index 0000000..8ce6c2e --- /dev/null +++ b/src/CraftSharp/Pages/Edit.razor.cs @@ -0,0 +1,105 @@ +using CraftSharp.Factories; +using CraftSharp.Models; +using CraftSharp.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; + +namespace CraftSharp.Pages +{ + public partial class Edit + { + [Parameter] + public int Id { get; set; } + + /// + /// The default enchant categories. + /// + private List enchantCategories = new List() { "armor", "armor_head", "armor_chest", "weapon", "digger", "breakable", "vanishable" }; + + /// + /// The current item model + /// + private ItemModel itemModel = new() + { + EnchantCategories = new List(), + RepairWith = new List() + }; + + /// + /// The default repair with. + /// + private List repairWith = new List() { "oak_planks", "spruce_planks", "birch_planks", "jungle_planks", "acacia_planks", "dark_oak_planks", "crimson_planks", "warped_planks" }; + + [Inject] + public IDataService DataService { get; set; } + + [Inject] + public NavigationManager NavigationManager { get; set; } + + [Inject] + public IWebHostEnvironment WebHostEnvironment { get; set; } + + protected override async Task OnInitializedAsync() + { + var item = await DataService.GetById(Id); + + var fileContent = await File.ReadAllBytesAsync($"{WebHostEnvironment.WebRootPath}/images/default.png"); + + // Set the model with the item + itemModel = ItemFactory.ToModel(item, fileContent); + } + + private async void HandleValidSubmit() + { + await DataService.Update(Id, itemModel); + + NavigationManager.NavigateTo("list"); + } + + private async Task LoadImage(InputFileChangeEventArgs e) + { + // Set the content of the image to the model + using (var memoryStream = new MemoryStream()) + { + await e.File.OpenReadStream().CopyToAsync(memoryStream); + itemModel.ImageContent = memoryStream.ToArray(); + } + } + + private void OnEnchantCategoriesChange(string item, object checkedValue) + { + if ((bool)checkedValue) + { + if (!itemModel.EnchantCategories.Contains(item)) + { + itemModel.EnchantCategories.Add(item); + } + + return; + } + + if (itemModel.EnchantCategories.Contains(item)) + { + itemModel.EnchantCategories.Remove(item); + } + } + + private void OnRepairWithChange(string item, object checkedValue) + { + if ((bool)checkedValue) + { + if (!itemModel.RepairWith.Contains(item)) + { + itemModel.RepairWith.Add(item); + } + + return; + } + + if (itemModel.RepairWith.Contains(item)) + { + itemModel.RepairWith.Remove(item); + } + } + } +} diff --git a/src/CraftSharp/Pages/List.razor b/src/CraftSharp/Pages/List.razor index a2a357b..72bc9e9 100644 --- a/src/CraftSharp/Pages/List.razor +++ b/src/CraftSharp/Pages/List.razor @@ -1,8 +1,52 @@ @page "/list" -@using Models +@using CraftSharp.Models -

@Localizer["Title"]

+

List

-@code { +
+ + Ajouter + +
-} + + + + + @if (!string.IsNullOrWhiteSpace(context.ImageBase64)) + { + @context.DisplayName + } + else + { + @context.DisplayName + } + + + + + + + + @(string.Join(", ", ((Item)context).EnchantCategories)) + + + + + @(string.Join(", ", ((Item)context).RepairWith)) + + + + + + Editer + + + + \ No newline at end of file diff --git a/src/CraftSharp/Pages/List.razor.cs b/src/CraftSharp/Pages/List.razor.cs index 5bb544e..de707ae 100644 --- a/src/CraftSharp/Pages/List.razor.cs +++ b/src/CraftSharp/Pages/List.razor.cs @@ -1,12 +1,64 @@ -using Microsoft.AspNetCore.Components; +using Blazored.LocalStorage; +using Blazored.Modal; +using Blazored.Modal.Services; +using Blazorise.DataGrid; +using CraftSharp.Modals; +using CraftSharp.Models; +using CraftSharp.Services; +using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Localization; namespace CraftSharp.Pages { public partial class List { + private List items; + + private int totalItem; + + [Inject] + public NavigationManager NavigationManager { get; set; } + + [CascadingParameter] + public IModalService Modal { get; set; } [Inject] - public IStringLocalizer Localizer { get; set; } + public IDataService DataService { get; set; } + + [Inject] + public IWebHostEnvironment WebHostEnvironment { get; set; } + + private async Task OnReadData(DataGridReadDataEventArgs e) + { + if (e.CancellationToken.IsCancellationRequested) + { + return; + } + + if (!e.CancellationToken.IsCancellationRequested) + { + items = await DataService.List(e.Page, e.PageSize); + totalItem = await DataService.Count(); + } + } + private async void OnDelete(int id) + { + var parameters = new ModalParameters(); + parameters.Add(nameof(Item.Id), id); + + var modal = Modal.Show("Delete Confirmation", parameters); + var result = await modal.Result; + + if (result.Cancelled) + { + return; + } + + await DataService.Delete(id); + + // Reload the page + NavigationManager.NavigateTo("list", true); + } } } + diff --git a/src/CraftSharp/Pages/_Layout.cshtml b/src/CraftSharp/Pages/_Layout.cshtml index 50f7cc9..b8ac950 100644 --- a/src/CraftSharp/Pages/_Layout.cshtml +++ b/src/CraftSharp/Pages/_Layout.cshtml @@ -28,7 +28,10 @@ + + + diff --git a/src/CraftSharp/Program.cs b/src/CraftSharp/Program.cs index 5ced326..c9f4343 100644 --- a/src/CraftSharp/Program.cs +++ b/src/CraftSharp/Program.cs @@ -1,3 +1,8 @@ +using Blazored.LocalStorage; +using Blazorise; +using Blazored.Modal; +using Blazorise.Bootstrap; +using Blazorise.Icons.FontAwesome; using CraftSharp.Data; using CraftSharp.Services; using Microsoft.AspNetCore.Components; @@ -21,7 +26,16 @@ builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; }); builder.Services.AddHttpClient(); -builder.Services.AddScoped(); +builder.Services.AddBlazoredModal(); + +builder.Services + .AddBlazorise() + .AddBootstrapProviders() + .AddFontAwesomeIcons(); + +builder.Services.AddBlazoredLocalStorage(); + +builder.Services.AddScoped(); // Configure the localtization builder.Services.Configure(options => diff --git a/src/CraftSharp/Services/DataLocalService.cs b/src/CraftSharp/Services/DataLocalService.cs new file mode 100644 index 0000000..f248643 --- /dev/null +++ b/src/CraftSharp/Services/DataLocalService.cs @@ -0,0 +1,147 @@ +using Blazored.LocalStorage; +using CraftSharp.Components; +using CraftSharp.Factories; +using CraftSharp.Models; +using Microsoft.AspNetCore.Components; + +namespace CraftSharp.Services +{ + public class DataLocalService : IDataService + { + private readonly HttpClient _http; + private readonly ILocalStorageService _localStorage; + private readonly NavigationManager _navigationManager; + private readonly IWebHostEnvironment _webHostEnvironment; + + public DataLocalService( + ILocalStorageService localStorage, + HttpClient http, + IWebHostEnvironment webHostEnvironment, + NavigationManager navigationManager) + { + _localStorage = localStorage; + _http = http; + _webHostEnvironment = webHostEnvironment; + _navigationManager = navigationManager; + } + + public async Task Add(ItemModel model) + { + // Get the current data + var currentData = await _localStorage.GetItemAsync>("data"); + + // Simulate the Id + model.Id = currentData.Max(s => s.Id) + 1; + + // Add the item to the current data + currentData.Add(ItemFactory.Create(model)); + + // Save the data + await _localStorage.SetItemAsync("data", currentData); + } + + public async Task Count() + { + // Load data from the local storage + var currentData = await _localStorage.GetItemAsync("data"); + + // Check if data exist in the local storage + if (currentData == null) + { + // this code add in the local storage the fake data + var originalData = await _http.GetFromJsonAsync($"{_navigationManager.BaseUri}fake-data.json"); + await _localStorage.SetItemAsync("data", originalData); + } + + return (await _localStorage.GetItemAsync("data")).Length; + } + + public async Task> List(int currentPage, int pageSize) + { + // Load data from the local storage + var currentData = await _localStorage.GetItemAsync("data"); + + // Check if data exist in the local storage + if (currentData == null) + { + // this code add in the local storage the fake data + var originalData = await _http.GetFromJsonAsync($"{_navigationManager.BaseUri}fake-data.json"); + await _localStorage.SetItemAsync("data", originalData); + } + + return (await _localStorage.GetItemAsync("data")).Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(); + } + public async Task GetById(int id) + { + // Get the current data + var currentData = await _localStorage.GetItemAsync>("data"); + + // Get the item int the list + var item = currentData.FirstOrDefault(w => w.Id == id); + + // Check if item exist + if (item == null) + { + throw new Exception($"Unable to found the item with ID: {id}"); + } + + return item; + } + + public async Task Update(int id, ItemModel model) + { + // Get the current data + var currentData = await _localStorage.GetItemAsync>("data"); + + // Get the item int the list + var item = currentData.FirstOrDefault(w => w.Id == id); + + // Check if item exist + if (item == null) + { + throw new Exception($"Unable to found the item with ID: {id}"); + } + + // Modify the content of the item + ItemFactory.Update(item, model); + + // Save the data + await _localStorage.SetItemAsync("data", currentData); + } + + public async Task Delete(int id) + { + // Get the current data + var currentData = await _localStorage.GetItemAsync>("data"); + + // Get the item int the list + var item = currentData.FirstOrDefault(w => w.Id == id); + + // Delete item in + currentData.Remove(item); + + // Save the data + await _localStorage.SetItemAsync("data", currentData); + } + + public Task> GetRecipes() + { + var items = new List + { + new CraftingRecipe + { + Give = new Item { DisplayName = "Diamond", Name = "diamond" }, + Have = new List> + { + new List { "dirt", "dirt", "dirt" }, + new List { "dirt", null, "dirt" }, + new List { "dirt", "dirt", "dirt" } + } + } + }; + + return Task.FromResult(items); + } + + } +} diff --git a/src/CraftSharp/Services/IDataService.cs b/src/CraftSharp/Services/IDataService.cs index c5a515c..2dd688d 100644 --- a/src/CraftSharp/Services/IDataService.cs +++ b/src/CraftSharp/Services/IDataService.cs @@ -14,8 +14,9 @@ namespace CraftSharp.Services Task Update(int id, ItemModel model); Task Delete(int id); - Task> GetRecipes(); + + //Task> GetRecipes(); } } diff --git a/src/CraftSharp/Shared/HeaderLayout.razor b/src/CraftSharp/Shared/HeaderLayout.razor index 4b6b97e..5c9ba21 100644 --- a/src/CraftSharp/Shared/HeaderLayout.razor +++ b/src/CraftSharp/Shared/HeaderLayout.razor @@ -30,6 +30,11 @@ Inventaire +
diff --git a/src/CraftSharp/_Imports.razor b/src/CraftSharp/_Imports.razor index 06955e4..b191629 100644 --- a/src/CraftSharp/_Imports.razor +++ b/src/CraftSharp/_Imports.razor @@ -8,3 +8,6 @@ @using Microsoft.JSInterop @using CraftSharp @using CraftSharp.Shared +@using Blazorise.DataGrid +@using Blazored.Modal +@using Blazored.Modal.Services \ No newline at end of file diff --git a/src/CraftSharp/wwwroot/Images/default.png b/src/CraftSharp/wwwroot/Images/default.png new file mode 100644 index 0000000..a7446c9 Binary files /dev/null and b/src/CraftSharp/wwwroot/Images/default.png differ diff --git a/src/CraftSharp/wwwroot/Images/sq.png b/src/CraftSharp/wwwroot/Images/sq.png new file mode 100644 index 0000000..d8bf2ce Binary files /dev/null and b/src/CraftSharp/wwwroot/Images/sq.png differ diff --git a/src/CraftSharp/wwwroot/Images/weegee.png b/src/CraftSharp/wwwroot/Images/weegee.png new file mode 100644 index 0000000..d8bf2ce Binary files /dev/null and b/src/CraftSharp/wwwroot/Images/weegee.png differ diff --git a/src/CraftSharp/wwwroot/fake-data.json b/src/CraftSharp/wwwroot/fake-data.json index 30d311b..44f4918 100644 --- a/src/CraftSharp/wwwroot/fake-data.json +++ b/src/CraftSharp/wwwroot/fake-data.json @@ -1,469 +1,223 @@ -{ - "blocks": [ - { - "id": 1, - "name": "Comveyer", - "stacksize": 35, - "rarity": "rare" - }, - { - "id": 2, - "name": "Uncorp", - "stacksize": 56, - "rarity": "legendary" - }, - { - "id": 3, - "name": "Oatfarm", - "stacksize": 27, - "rarity": "rare" - }, - { - "id": 4, - "name": "Isostream", - "stacksize": 21, - "rarity": "legendary" - }, - { - "id": 5, - "name": "Deepends", - "stacksize": 23, - "rarity": "rare" - }, - { - "id": 6, - "name": "Flumbo", - "stacksize": 26, - "rarity": "common" - }, - { - "id": 7, - "name": "Navir", - "stacksize": 64, - "rarity": "common" - }, - { - "id": 8, - "name": "Circum", - "stacksize": 31, - "rarity": "legendary" - }, - { - "id": 9, - "name": "Virva", - "stacksize": 30, - "rarity": "epic" - }, - { - "id": 10, - "name": "Zillanet", - "stacksize": 18, - "rarity": "common" - }, - { - "id": 11, - "name": "Ezent", - "stacksize": 49, - "rarity": "legendary" - }, - { - "id": 12, - "name": "Pigzart", - "stacksize": 48, - "rarity": "common" - }, - { - "id": 13, - "name": "Mantrix", - "stacksize": 6, - "rarity": "rare" - }, - { - "id": 14, - "name": "Aquamate", - "stacksize": 9, - "rarity": "rare" - }, - { - "id": 15, - "name": "Twiist", - "stacksize": 54, - "rarity": "legendary" - }, - { - "id": 16, - "name": "Mazuda", - "stacksize": 17, - "rarity": "rare" - }, - { - "id": 17, - "name": "Ecolight", - "stacksize": 50, - "rarity": "epic" - }, - { - "id": 18, - "name": "Greeker", - "stacksize": 40, - "rarity": "rare" - }, - { - "id": 19, - "name": "Stelaecor", - "stacksize": 28, - "rarity": "legendary" - }, - { - "id": 20, - "name": "Deviltoe", - "stacksize": 24, - "rarity": "epic" - }, - { - "id": 21, - "name": "Comveyor", - "stacksize": 39, - "rarity": "legendary" - }, - { - "id": 22, - "name": "Neptide", - "stacksize": 63, - "rarity": "common" - } - ], - "tools": [ - { - "id": 1, - "name": "Applideck", - "stacksize": 10, - "rarity": "common", - "damages": 3 - }, - { - "id": 2, - "name": "Kenegy", - "stacksize": 7, - "rarity": "legendary", - "damages": 7 - }, - { - "id": 3, - "name": "Pyramis", - "stacksize": 47, - "rarity": "epic", - "damages": 8 - }, - { - "id": 4, - "name": "Xsports", - "stacksize": 6, - "rarity": "rare", - "damages": 7 - }, - { - "id": 5, - "name": "Extragen", - "stacksize": 11, - "rarity": "common", - "damages": 10 - }, - { - "id": 6, - "name": "Recrisys", - "stacksize": 40, - "rarity": "rare", - "damages": 3 - }, - { - "id": 7, - "name": "Martgo", - "stacksize": 39, - "rarity": "legendary", - "damages": 6 - }, - { - "id": 8, - "name": "Lotron", - "stacksize": 11, - "rarity": "rare", - "damages": 9 - }, - { - "id": 9, - "name": "Flum", - "stacksize": 14, - "rarity": "common", - "damages": 4 - }, - { - "id": 10, - "name": "Terrago", - "stacksize": 23, - "rarity": "common", - "damages": 10 - }, - { - "id": 11, - "name": "Stralum", - "stacksize": 17, - "rarity": "common", - "damages": 9 - }, - { - "id": 12, - "name": "Unisure", - "stacksize": 4, - "rarity": "epic", - "damages": 2 - }, - { - "id": 13, - "name": "Xleen", - "stacksize": 6, - "rarity": "rare", - "damages": 1 - }, - { - "id": 14, - "name": "Knowlysis", - "stacksize": 4, - "rarity": "rare", - "damages": 7 - }, - { - "id": 15, - "name": "Exoteric", - "stacksize": 56, - "rarity": "epic", - "damages": 4 - }, - { - "id": 16, - "name": "Elentrix", - "stacksize": 43, - "rarity": "legendary", - "damages": 9 - }, - { - "id": 17, - "name": "Exostream", - "stacksize": 2, - "rarity": "common", - "damages": 10 - }, - { - "id": 18, - "name": "Helixo", - "stacksize": 50, - "rarity": "epic", - "damages": 1 - }, - { - "id": 19, - "name": "Eventage", - "stacksize": 31, - "rarity": "common", - "damages": 10 - }, - { - "id": 20, - "name": "Isosphere", - "stacksize": 44, - "rarity": "common", - "damages": 9 - }, - { - "id": 21, - "name": "Surelogic", - "stacksize": 18, - "rarity": "epic", - "damages": 3 - }, - { - "id": 22, - "name": "Accufarm", - "stacksize": 36, - "rarity": "common", - "damages": 6 - }, - { - "id": 23, - "name": "Recognia", - "stacksize": 13, - "rarity": "epic", - "damages": 4 - }, - { - "id": 24, - "name": "Fibrodyne", - "stacksize": 20, - "rarity": "rare", - "damages": 7 - }, - { - "id": 25, - "name": "Plasmosis", - "stacksize": 62, - "rarity": "common", - "damages": 2 - }, - { - "id": 26, - "name": "Dogtown", - "stacksize": 58, - "rarity": "common", - "damages": 6 - }, - { - "id": 27, - "name": "Edecine", - "stacksize": 56, - "rarity": "rare", - "damages": 3 - }, - { - "id": 28, - "name": "Spacewax", - "stacksize": 51, - "rarity": "legendary", - "damages": 8 - } +[ + { + "id": 1, + "displayname": "Bicol", + "name": "bicol", + "stacksize": 6, + "maxdurability": 18, + "enchantcategories": [ + "armor_head", + "armor", + "armor_head" ], - "armors": [ - { - "id": 1, - "name": "Splinx", - "stacksize": 59, - "rarity": "common", - "toughness": 19 - }, - { - "id": 2, - "name": "Digigen", - "stacksize": 34, - "rarity": "legendary", - "toughness": 10 - }, - { - "id": 3, - "name": "Geoform", - "stacksize": 33, - "rarity": "legendary", - "toughness": 13 - }, - { - "id": 4, - "name": "Ovium", - "stacksize": 21, - "rarity": "legendary", - "toughness": 1 - }, - { - "id": 5, - "name": "Slambda", - "stacksize": 51, - "rarity": "common", - "toughness": 8 - }, - { - "id": 6, - "name": "Opticon", - "stacksize": 34, - "rarity": "rare", - "toughness": 18 - }, - { - "id": 7, - "name": "Combogen", - "stacksize": 22, - "rarity": "rare", - "toughness": 2 - }, - { - "id": 8, - "name": "Talae", - "stacksize": 38, - "rarity": "epic", - "toughness": 3 - }, - { - "id": 9, - "name": "Quotezart", - "stacksize": 63, - "rarity": "common", - "toughness": 7 - }, - { - "id": 10, - "name": "Edecine", - "stacksize": 54, - "rarity": "epic", - "toughness": 9 - }, - { - "id": 11, - "name": "Geekwagon", - "stacksize": 16, - "rarity": "common", - "toughness": 17 - }, - { - "id": 12, - "name": "Buzzmaker", - "stacksize": 1, - "rarity": "epic", - "toughness": 1 - }, - { - "id": 13, - "name": "Dreamia", - "stacksize": 11, - "rarity": "legendary", - "toughness": 3 - }, - { - "id": 14, - "name": "Memora", - "stacksize": 64, - "rarity": "legendary", - "toughness": 2 - }, - { - "id": 15, - "name": "Exerta", - "stacksize": 10, - "rarity": "legendary", - "toughness": 13 - }, - { - "id": 16, - "name": "Talkola", - "stacksize": 12, - "rarity": "rare", - "toughness": 10 - }, - { - "id": 17, - "name": "Zosis", - "stacksize": 12, - "rarity": "legendary", - "toughness": 2 - }, - { - "id": 18, - "name": "Aquazure", - "stacksize": 40, - "rarity": "rare", - "toughness": 6 - }, - { - "id": 19, - "name": "Crustatia", - "stacksize": 25, - "rarity": "common", - "toughness": 16 - } - ] -} \ No newline at end of file + "repairwith": [], + "createddate": "2022-06-14", + "updateddate": null + }, + { + "id": 2, + "displayname": "Kyagoro", + "name": "kyagoro", + "stacksize": 60, + "maxdurability": 56, + "enchantcategories": [], + "repairwith": [ + "birch_planks" + ], + "createddate": "2016-01-06", + "updateddate": null + }, + { + "id": 3, + "displayname": "Euron", + "name": "euron", + "stacksize": 22, + "maxdurability": 116, + "enchantcategories": [ + "armor_head" + ], + "repairwith": [], + "createddate": "2016-04-03", + "updateddate": "2017-01-22" + }, + { + "id": 4, + "displayname": "Cosmetex", + "name": "cosmetex", + "stacksize": 24, + "maxdurability": 33, + "enchantcategories": [ + "breakable" + ], + "repairwith": [ + "oak_planks", + "dark_oak_planks" + ], + "createddate": "2016-02-25", + "updateddate": null + }, + { + "id": 5, + "displayname": "Microluxe", + "name": "microluxe", + "stacksize": 48, + "maxdurability": 50, + "enchantcategories": [ + "armor_head", + "digger", + "weapon" + ], + "repairwith": [], + "createddate": "2022-05-20", + "updateddate": "2020-05-18" + }, + { + "id": 6, + "displayname": "Pyramis", + "name": "pyramis", + "stacksize": 3, + "maxdurability": 89, + "enchantcategories": [ + "vanishable", + "weapon" + ], + "repairwith": [], + "createddate": "2021-01-09", + "updateddate": null + }, + { + "id": 7, + "displayname": "Magnafone", + "name": "magnafone", + "stacksize": 16, + "maxdurability": 124, + "enchantcategories": [], + "repairwith": [], + "createddate": "2021-08-28", + "updateddate": "2019-02-25" + }, + { + "id": 8, + "displayname": "Macronaut", + "name": "macronaut", + "stacksize": 45, + "maxdurability": 81, + "enchantcategories": [ + "armor_chest", + "weapon" + ], + "repairwith": [], + "createddate": "2021-09-05", + "updateddate": "2017-04-19" + }, + { + "id": 9, + "displayname": "Pharmacon", + "name": "pharmacon", + "stacksize": 1, + "maxdurability": 49, + "enchantcategories": [ + "armor" + ], + "repairwith": [ + "acacia_planks", + "oak_planks" + ], + "createddate": "2019-12-25", + "updateddate": "2014-04-14" + }, + { + "id": 10, + "displayname": "Krog", + "name": "krog", + "stacksize": 28, + "maxdurability": 87, + "enchantcategories": [], + "repairwith": [], + "createddate": "2020-10-26", + "updateddate": "2017-10-24" + }, + { + "id": 11, + "displayname": "Escenta", + "name": "escenta", + "stacksize": 59, + "maxdurability": 103, + "enchantcategories": [], + "repairwith": [ + "jungle_planks" + ], + "createddate": "2020-04-07", + "updateddate": null + }, + { + "id": 12, + "displayname": "Vidto", + "name": "vidto", + "stacksize": 59, + "maxdurability": 60, + "enchantcategories": [], + "repairwith": [], + "createddate": "2017-09-24", + "updateddate": null + }, + { + "id": 13, + "displayname": "Datagen", + "name": "datagen", + "stacksize": 30, + "maxdurability": 11, + "enchantcategories": [ + "vanishable" + ], + "repairwith": [ + "warped_planks", + "spruce_planks" + ], + "createddate": "2021-12-02", + "updateddate": "2018-05-17" + }, + { + "id": 14, + "displayname": "Elemantra", + "name": "elemantra", + "stacksize": 4, + "maxdurability": 5, + "enchantcategories": [], + "repairwith": [ + "warped_planks", + "dark_oak_planks" + ], + "createddate": "2014-06-04", + "updateddate": "2016-07-28" + }, + { + "id": 15, + "displayname": "Moltonic", + "name": "moltonic", + "stacksize": 31, + "maxdurability": 105, + "enchantcategories": [ + "weapon" + ], + "repairwith": [], + "createddate": "2018-09-12", + "updateddate": null + }, + { + "id": 16, + "displayname": "Goko", + "name": "goko", + "stacksize": 7, + "maxdurability": 63, + "enchantcategories": [ + "vanishable" + ], + "repairwith": [ + "crimson_planks", + "crimson_planks" + ], + "createddate": "2021-04-13", + "updateddate": "2016-10-24" + } +] \ No newline at end of file