Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions Server/Components/Pages/GamePage.razor
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
@using Fracture.Server.Modules.Shared
@using Fracture.Server.Modules.Shared.ImageChangers
@using Fracture.Server.Modules.Users
@using Fracture.Server.Modules.Users.Services
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@implements IDisposable
@page "/game"
Expand All @@ -26,6 +27,8 @@
@inject IItemsRepository ItemsRepository
@inject VersionInfoProvider VersionInfoProvider
@inject BackgroundImageChanger BackgroundImageChanger
@inject UserService UserService

<link rel="icon" type="image/png" href="assets/icons/favicon.png" />

<link rel="icon" type="image/png" href="assets/favicon.png" />
Expand All @@ -42,18 +45,18 @@
</div>
</div>
</div>
<UserStats Equipment="_equipment"></UserStats>
<UserStats></UserStats>
</div>
<div class="equipment">
<div class="info">
<div class="info-content">
<div @onclick="() => _popup.ShowComponent<EquipmentPopup>(_equipmentPopupParameters)">
<div @onclick="() => _popup.ShowComponent<EquipmentPopup>()">
<img src="assets/icons/infobutton.svg" />

</div>
</div>
</div>
<EquipmentTable Equipment="@_equipment" />
<EquipmentTable></EquipmentTable>
</div>

</div>
Expand Down
69 changes: 27 additions & 42 deletions Server/Components/Pages/GamePage.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,14 @@
using Fracture.Server.Modules.MapGenerator.UI.Models;
using Fracture.Server.Modules.Pathfinding.Models;
using Fracture.Server.Modules.Shared.ImageChangers;
using Fracture.Server.Modules.Users;
using Fracture.Server.Modules.Users.Models;

namespace Fracture.Server.Components.Pages;

public partial class GamePage
{
private User _user = new();
private readonly ObservableCollection<Item> _equipment = new();
private readonly ObservableCollection<Item> _inventory = new();

private Dictionary<string, object> _equipmentPopupParameters = null!;
private Dictionary<string, object> _mapPopupParameters = null!;
public static Map Map { get; set; }

Check warning on line 15 in Server/Components/Pages/GamePage.razor.cs

View workflow job for this annotation

GitHub Actions / Checks

Non-nullable property 'Map' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the property as nullable.

private PopupContainer _popup = null!;

Expand All @@ -29,46 +24,12 @@

protected override async Task OnInitializedAsync()
{
var username = await ProtectedSessionStore.GetAsync<string>("username");
if (!username.Success)
bool userLoaded = await LoadUser();
if (!userLoaded)
{
NavigationManager.NavigateTo("/");
return;
}

if (string.IsNullOrEmpty(username.Value))
{
NavigationManager.NavigateTo("/");
return;
}

var user = await UsersRepository.GetUserAsync(username.Value!);
if (user is null)
{
user = new User { Username = username.Value! };
await UsersRepository.AddUserAsync(user);
}

_user = user;

_inventory.Clear();
_equipment.Clear();
foreach (var item in await ItemsRepository.GetItemsOfUserAsync(_user.Id))
{
_inventory.Add(item);
}

foreach (var item in _inventory.ToList().Where(i => i.IsEquipped))
{
_equipment.Add(item);
}

_equipmentPopupParameters = new Dictionary<string, object>
{
{ "UserData", _user },
{ "Equipment", _equipment },
{ "Inventory", _inventory },
};
Map = MapManagerService.GetWorldMap() ?? throw new InvalidOperationException();
_mapDisplayData.ShowColorMap = true;
_mapPopupParameters = new Dictionary<string, object>
Expand All @@ -85,6 +46,30 @@
await base.OnInitializedAsync();
}

private async Task<bool> LoadUser()
{
var username = await ProtectedSessionStore.GetAsync<string>("username");
if (!username.Success)
{
return false;
}

if (string.IsNullOrEmpty(username.Value))
{
return false;
}

var user = await UsersRepository.GetUserAsync(username.Value!);
if (user is null)
{
user = new User { Username = username.Value! };
await UsersRepository.AddUserAsync(user);
}

await UserService.LoadUserAsync(user);
return true;
}

private void Logout()
{
NavigationManager.NavigateTo("/home");
Expand Down
13 changes: 8 additions & 5 deletions Server/Components/Popups/EquipmentPopup.razor
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
@using Fracture.Server.Modules.Items.Models
@using Fracture.Server.Modules.Items.Services
@using Fracture.Server.Modules.Users
@using Fracture.Server.Modules.Users.Services
@inject IItemGenerator ItemGenerator
@inject IItemsRepository ItemsRepository
@inject ILogger<EquipmentPopup> Logger

@inject UserService UserService


<div class="eqContainer">
Expand All @@ -18,16 +19,18 @@
<div>Inventory</div>
<div class="eqColumn">

@foreach (var item in Inventory.Where(x => !IsEquipped(x))) {
<ItemCard Item="@item" OnEquipClicked="() => Equip(item)" IsEquipped="IsEquipped(item)"
@foreach (var item in UserService.Inventory.Where(x => !UserService.IsEquipped(x)))
{
<ItemCard Item="@item" OnEquipClicked="() => Equip(item)" IsEquipped="UserService.IsEquipped(item)"
OnUnequipClicked="() => Unequip(item)"></ItemCard>
}
</div>
<div>Equipped</div>
<div class="eqColumn">

@foreach (var item in Equipment) {
<ItemCard Item="@item" OnEquipClicked="() => Equip(item)" IsEquipped="IsEquipped(item)"
@foreach (var item in UserService.Equipment)
{
<ItemCard Item="@item" OnEquipClicked="() => Equip(item)" IsEquipped="UserService.IsEquipped(item)"
OnUnequipClicked="() => Unequip(item)"></ItemCard>
}
</div>
Expand Down
87 changes: 8 additions & 79 deletions Server/Components/Popups/EquipmentPopup.razor.cs
Original file line number Diff line number Diff line change
@@ -1,106 +1,35 @@
using System.Collections.ObjectModel;
using Fracture.Server.Modules.Items.Models;
using Fracture.Server.Modules.Users;
using Fracture.Server.Modules.Users.Models;
using Microsoft.AspNetCore.Components;

namespace Fracture.Server.Components.Popups;

public partial class EquipmentPopup
{
[Parameter]
public required ObservableCollection<Item> Inventory { get; set; }

[Parameter]
public required ObservableCollection<Item> Equipment { get; set; }

[Parameter]
public required User UserData { get; set; }

private const int slots = 6;

protected override async Task OnInitializedAsync()
{
Inventory.Clear();
Equipment.Clear();
foreach (var item in await ItemsRepository.GetItemsOfUserAsync(UserData.Id))
{
Inventory.Add(item);
}

foreach (var item in Inventory.ToList().Where(i => i.IsEquipped))
{
Equipment.Add(item);
}

Logger.LogInformation($"Inventory initialized for user: {UserData.Username}");
}

public async void Refresh()
{
Logger.LogInformation($"Refreshing! New username: {UserData.Username}");
Inventory.Clear();
Equipment.Clear();
foreach (var item in await ItemsRepository.GetItemsOfUserAsync(UserData.Id))
{
Inventory.Add(item);
}

foreach (var item in Inventory.ToList().Where(i => i.IsEquipped))
{
Equipment.Add(item);
}

await OnInitializedAsync();
}
protected override async Task OnInitializedAsync() { }

public async Task GenerateNewItem()
{
var item = await ItemGenerator.Generate();

if (item is not null)
{
item.CreatedBy = UserData;
item.CreatedById = UserData.Id;
item.CreatedBy = UserService.User!;
item.CreatedById = UserService.User!.Id;

await ItemsRepository.AddItemAsync(item);
Inventory.Add(item);
UserService.Inventory.Add(item);
}
}

public void Equip(Item item)
{
if (Equipment.Count < slots)
{
if (item.Type.Equals(ItemType.Ring))
{
item.IsEquipped = true;
ItemsRepository.UpdateItemAsync(item);
Equipment.Add(item);
return;
}

foreach (var equipped in Equipment)
{
if (equipped.Type.Equals(item.Type))
{
return;
}
}

item.IsEquipped = true;
ItemsRepository.UpdateItemAsync(item);
Equipment.Add(item);
}
UserService.Equip(item);
}

public void Unequip(Item item)
{
item.IsEquipped = false;
ItemsRepository.UpdateItemAsync(item);
Equipment.Remove(item);
}

public bool IsEquipped(Item item)
{
return Equipment.Contains(item);
UserService.Unequip(item);
}
}
15 changes: 8 additions & 7 deletions Server/Components/UI/EquipmentTable.razor
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
@using System.Collections.ObjectModel
@using Fracture.Server.Modules.Items.Models
@using Fracture.Server.Modules.Users.Services
@rendermode InteractiveServer
@inject UserService UserService

<table class="equipmentTable">
<tr>
@for (var i = 0; i < 3; i++)
{
if (i < Equipment.Count)
if (i < UserService.Equipment.Count)
{
<td>
<div class="@ToCss(Equipment[i].Name)">@Equipment[i].Name</div>
<div class="@ToCss(UserService.Equipment[i].Name)">@UserService.Equipment[i].Name</div>
</td>
}
else
Expand All @@ -22,10 +24,10 @@
<tr>
@for (var i = 3; i < 6; i++)
{
if (i < Equipment.Count)
if (i < UserService.Equipment.Count)
{
<td>
<div class="@ToCss(Equipment[i].Name)">@Equipment[i].Name</div>
<div class="@ToCss(UserService.Equipment[i].Name)">@UserService.Equipment[i].Name</div>
</td>
}
else
Expand All @@ -38,12 +40,11 @@

</table>

@code {
[Parameter] public required ObservableCollection<Item> Equipment { get; set; }
@code {

protected override void OnInitialized()
{
Equipment.CollectionChanged += (sender, e) => StateHasChanged();
UserService.Equipment.CollectionChanged += (sender, e) => StateHasChanged();
}

private string ToCss(string name)
Expand Down
13 changes: 7 additions & 6 deletions Server/Components/UI/UserStats.razor
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
@using System.Collections.ObjectModel
@using Fracture.Server.Modules.Items.Models
@using Fracture.Server.Modules.Users.Services
@inject UserService UserService

<table class="stat-table">
@foreach (var itemStat in Enum.GetValues<ItemStat>())
{
var stat = Equipment.Sum(x => x.Statistics.GetStatFromItemStat(itemStat));
var stat = UserService.Equipment?.Sum(x => x.Statistics.GetStatFromItemStat(itemStat));
<tr>
<td><img src=@("assets/" + images[itemStat])></td>
<td>@itemStat</td>
Expand All @@ -12,13 +15,11 @@
}
</table>

@code {

[Parameter] public required ObservableCollection<Item> Equipment { get; set; }
@code {

protected override void OnInitialized()
{
Equipment.CollectionChanged += (sender, e) => StateHasChanged();
{
UserService.Equipment.CollectionChanged += (sender, e) => StateHasChanged();
}

Dictionary<ItemStat, string> images = new() {
Expand Down
2 changes: 1 addition & 1 deletion Server/Modules/Database/FractureDbContext.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Fracture.Server.Modules.Items.Models;
using Fracture.Server.Modules.Users;
using Fracture.Server.Modules.Users.Models;
using Microsoft.EntityFrameworkCore;

namespace Fracture.Server.Modules.Database;
Expand Down
2 changes: 1 addition & 1 deletion Server/Modules/Database/IUsersRepository.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Fracture.Server.Modules.Users;
using Fracture.Server.Modules.Users.Models;

namespace Fracture.Server.Modules.Database;

Expand Down
2 changes: 1 addition & 1 deletion Server/Modules/Database/UsersRepository.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Fracture.Server.Modules.Users;
using Fracture.Server.Modules.Users.Models;
using Microsoft.EntityFrameworkCore;

namespace Fracture.Server.Modules.Database;
Expand Down
2 changes: 1 addition & 1 deletion Server/Modules/Items/Models/Item.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text.Json.Serialization;
using Fracture.Server.Modules.Users;
using Fracture.Server.Modules.Users.Models;

namespace Fracture.Server.Modules.Items.Models;

Expand Down
Loading
Loading