mirror of
https://github.com/ApfelTeeSaft/UnrealEvent.git
synced 2026-08-26 19:33:43 +00:00
201 lines
6.6 KiB
C++
201 lines
6.6 KiB
C++
#pragma once
|
|
#include "framework.h"
|
|
|
|
namespace InventoryHandler
|
|
{
|
|
void Update(AFortPlayerControllerAthena* PlayerController, FFortItemEntry* ItemEntry = nullptr)
|
|
{
|
|
PlayerController->WorldInventory->HandleInventoryLocalUpdate();
|
|
PlayerController->WorldInventory->Inventory.MarkArrayDirty();
|
|
|
|
if (ItemEntry)
|
|
PlayerController->WorldInventory->Inventory.MarkItemDirty(*ItemEntry);
|
|
}
|
|
|
|
EFortQuickBars GetItemQuickbar(UFortItemDefinition* ItemDefinition)
|
|
{
|
|
if (!ItemDefinition->IsA(UFortResourceItemDefinition::StaticClass()) && !ItemDefinition->IsA(UFortConsumableItemDefinition::StaticClass())
|
|
&& !ItemDefinition->IsA(UFortBuildingItemDefinition::StaticClass()) && !ItemDefinition->IsA(UFortEditToolItemDefinition::StaticClass())
|
|
&& !ItemDefinition->IsA(UFortAmmoItemDefinition::StaticClass()) && !ItemDefinition->IsA(UFortWeaponMeleeItemDefinition::StaticClass()))
|
|
return EFortQuickBars::Primary;
|
|
|
|
return EFortQuickBars::Secondary;
|
|
}
|
|
|
|
bool IsPrimaryFull(AFortPlayerControllerAthena* PlayerController)
|
|
{
|
|
AFortInventory* WorldInventory = PlayerController->WorldInventory;
|
|
TArray<FFortItemEntry>& ReplicatedEntries = WorldInventory->Inventory.ReplicatedEntries;
|
|
int Slots = 0;
|
|
for (int i = 0; i < ReplicatedEntries.Num(); i++)
|
|
{
|
|
FFortItemEntry ReplicatedEntry = ReplicatedEntries[i];
|
|
if (GetItemQuickbar(ReplicatedEntry.ItemDefinition) == EFortQuickBars::Primary)
|
|
{
|
|
Slots++;
|
|
|
|
if (Slots >= 5)
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Slots >= 5;
|
|
}
|
|
|
|
FFortItemEntry* FindItem(AFortPlayerControllerAthena* PlayerController, UFortItemDefinition* ItemDefinition)
|
|
{
|
|
TArray<FFortItemEntry> ReplicatedEntries = PlayerController->WorldInventory->Inventory.ReplicatedEntries;
|
|
for (int i = 0; i < ReplicatedEntries.Num(); i++)
|
|
{
|
|
if (ReplicatedEntries[i].ItemDefinition == ItemDefinition)
|
|
return &ReplicatedEntries[i];
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
FFortItemEntry* FindItem(AFortPlayerControllerAthena* PlayerController, FGuid ItemGuid)
|
|
{
|
|
TArray<FFortItemEntry> ReplicatedEntries = PlayerController->WorldInventory->Inventory.ReplicatedEntries;
|
|
for (int i = 0; i < ReplicatedEntries.Num(); i++)
|
|
{
|
|
if (ReplicatedEntries[i].ItemGuid == ItemGuid)
|
|
return &ReplicatedEntries[i];
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
bool RemoveItem(AFortPlayerController* PlayerController, FGuid ItemGuid, int Count = -1)
|
|
{
|
|
if (!PlayerController)
|
|
return false;
|
|
|
|
AFortInventory* WorldInventory = PlayerController->WorldInventory;
|
|
if (!WorldInventory)
|
|
return false;
|
|
|
|
bool bWasSuccessful = false;
|
|
|
|
for (int i = 0; i < WorldInventory->Inventory.ReplicatedEntries.Num(); i++)
|
|
{
|
|
if (WorldInventory->Inventory.ReplicatedEntries[i].ItemGuid == ItemGuid)
|
|
{
|
|
if (Count == -1 || Count >= WorldInventory->Inventory.ReplicatedEntries[i].Count)
|
|
{
|
|
WorldInventory->Inventory.ReplicatedEntries.Remove(i);
|
|
break;
|
|
}
|
|
|
|
WorldInventory->Inventory.ReplicatedEntries[i].Count -= Count;
|
|
WorldInventory->Inventory.MarkItemDirty(WorldInventory->Inventory.ReplicatedEntries[i]);
|
|
bWasSuccessful = true;
|
|
}
|
|
}
|
|
|
|
WorldInventory->Inventory.MarkArrayDirty();
|
|
WorldInventory->HandleInventoryLocalUpdate();
|
|
return bWasSuccessful;
|
|
}
|
|
|
|
bool RemoveItem(AFortPlayerController* PlayerController, UFortItemDefinition* ItemDefinition, int Count = -1)
|
|
{
|
|
if (!PlayerController || !ItemDefinition)
|
|
return false;
|
|
|
|
AFortInventory* WorldInventory = PlayerController->WorldInventory;
|
|
if (!WorldInventory)
|
|
return false;
|
|
|
|
bool bWasSuccessful = false;
|
|
|
|
for (int i = 0; i < WorldInventory->Inventory.ReplicatedEntries.Num(); i++)
|
|
{
|
|
if (WorldInventory->Inventory.ReplicatedEntries[i].ItemDefinition == ItemDefinition)
|
|
{
|
|
if (Count == -1 || Count >= WorldInventory->Inventory.ReplicatedEntries[i].Count)
|
|
{
|
|
WorldInventory->Inventory.ReplicatedEntries.Remove(i);
|
|
break;
|
|
}
|
|
|
|
WorldInventory->Inventory.ReplicatedEntries[i].Count -= Count;
|
|
WorldInventory->Inventory.MarkItemDirty(WorldInventory->Inventory.ReplicatedEntries[i]);
|
|
bWasSuccessful = true;
|
|
}
|
|
}
|
|
|
|
WorldInventory->Inventory.MarkArrayDirty();
|
|
WorldInventory->HandleInventoryLocalUpdate();
|
|
return bWasSuccessful;
|
|
}
|
|
|
|
UFortWorldItem* CreateItem(AFortPlayerControllerAthena* PlayerController, UFortItemDefinition* ItemDefinition, int Count)
|
|
{
|
|
auto WorldItem = static_cast<UFortWorldItem*>(ItemDefinition->CreateTemporaryItemInstanceBP(Count, 1));
|
|
WorldItem->SetOwningControllerForTemporaryItem(PlayerController);
|
|
return WorldItem;
|
|
}
|
|
|
|
bool AddItem(AFortPlayerControllerAthena* PlayerController, UFortItemDefinition* ItemDefinition, int Count, int LoadedAmmo = 0, bool bForceCreateNewItem = false)
|
|
{
|
|
FFortItemEntry* FoundItemEntry = FindItem(PlayerController, ItemDefinition);
|
|
bool bCreateNewItem = bForceCreateNewItem;
|
|
|
|
if (FoundItemEntry && !bCreateNewItem)
|
|
{
|
|
int NewCount = FoundItemEntry->Count + Count;
|
|
if (NewCount > ItemDefinition->MaxStackSize)
|
|
{
|
|
PlayerController->ServerAttemptInventoryDrop(FoundItemEntry->ItemGuid, NewCount - ItemDefinition->MaxStackSize);
|
|
FoundItemEntry->Count = ItemDefinition->MaxStackSize;
|
|
}
|
|
else
|
|
{
|
|
FoundItemEntry->Count = NewCount;
|
|
}
|
|
|
|
PlayerController->WorldInventory->HandleInventoryLocalUpdate();
|
|
PlayerController->WorldInventory->Inventory.MarkArrayDirty();
|
|
PlayerController->WorldInventory->Inventory.MarkItemDirty(*FoundItemEntry);
|
|
|
|
return true;
|
|
}
|
|
else
|
|
bCreateNewItem = true;
|
|
|
|
if (bCreateNewItem)
|
|
{
|
|
if (UFortWorldItem* NewItem = CreateItem(PlayerController, ItemDefinition, Count))
|
|
{
|
|
NewItem->ItemEntry.LoadedAmmo = LoadedAmmo;
|
|
if (ItemDefinition->MaxStackSize < Count)
|
|
{
|
|
NewItem->ItemEntry.Count = ItemDefinition->MaxStackSize;
|
|
PlayerController->ServerAttemptInventoryDrop(NewItem->ItemEntry.ItemGuid, Count - ItemDefinition->MaxStackSize);
|
|
}
|
|
|
|
PlayerController->WorldInventory->Inventory.ReplicatedEntries.Add(NewItem->ItemEntry);
|
|
PlayerController->WorldInventory->HandleInventoryLocalUpdate();
|
|
PlayerController->WorldInventory->Inventory.MarkArrayDirty();
|
|
PlayerController->WorldInventory->Inventory.MarkItemDirty(NewItem->ItemEntry);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void InitializePlayer(AFortPlayerControllerAthena* PlayerController)
|
|
{
|
|
static auto PickaxeDefinition = UObject::FindObject<UFortWeaponMeleeItemDefinition>("FortWeaponMeleeItemDefinition WID_Harvest_Pickaxe_Athena_C_T01.WID_Harvest_Pickaxe_Athena_C_T01");
|
|
AddItem(PlayerController, PickaxeDefinition, 1);
|
|
|
|
TArray<FItemAndCount> StartingItems = Globals::GetGameMode()->StartingItems;
|
|
for (int i = 0; i < StartingItems.Num(); i++)
|
|
{
|
|
AddItem(PlayerController, StartingItems[i].Item, StartingItems[i].Count);
|
|
}
|
|
}
|
|
} |