Skip to content

Commit 7c38fd3

Browse files
committed
added ability to remove equiped weapon
1 parent c67f1ff commit 7c38fd3

7 files changed

Lines changed: 135 additions & 5 deletions

File tree

Plugins/InventoryFramework/Source/InventoryFramework/Private/IFEquipmentComponent.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,39 @@ void UIFEquipmentComponent::ClientAddItemFromInventory_Implementation(class UIFI
8383
OnItemAdded(EquipmentItems[EquipmentIndex].Item, EquipmentIndex);
8484
OnItemAddedEvent.Broadcast(EquipmentIndex, EquipmentIndex, EquipmentItems[EquipmentIndex].Item);
8585
Source->RemoveItem(SourceIndex);
86+
}
87+
88+
89+
void UIFEquipmentComponent::RemoveFromEquipment(uint8 EquipmentIndex)
90+
{
91+
if (GetOwnerRole() < ENetRole::ROLE_Authority)
92+
{
93+
ServerRemoveFromEquipment(EquipmentIndex);
94+
return;
95+
}
96+
}
97+
98+
void UIFEquipmentComponent::ServerRemoveFromEquipment_Implementation(uint8 EquipmentIndex)
99+
{
100+
if (EquipmentItems[EquipmentIndex].Item)
101+
{
102+
EquipmentItems[EquipmentIndex].Item->MarkPendingKill();
103+
}
104+
EquipmentItems[EquipmentIndex].Item = nullptr;
105+
ClientRemoveFromEquipment(EquipmentIndex);
106+
OnServerItemRemoved(EquipmentIndex);
107+
}
108+
bool UIFEquipmentComponent::ServerRemoveFromEquipment_Validate(uint8 EquipmentIndex)
109+
{
110+
return true;
111+
}
112+
113+
void UIFEquipmentComponent::ClientRemoveFromEquipment_Implementation(uint8 EquipmentIndex)
114+
{
115+
if (EquipmentItems[EquipmentIndex].Item)
116+
{
117+
EquipmentItems[EquipmentIndex].Item->MarkPendingKill();
118+
}
119+
EquipmentItems[EquipmentIndex].Item = nullptr;
120+
OnItemRemoved(EquipmentIndex);
86121
}

Plugins/InventoryFramework/Source/InventoryFramework/Private/IFInventoryComponent.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "IFItemBase.h"
99
#include "IFItemActorBase.h"
1010
#include "IFInventoryInterface.h"
11+
#include "IFEquipmentComponent.h"
1112
#include "Net/UnrealNetwork.h"
1213
#include "Engine/ActorChannel.h"
1314

@@ -264,6 +265,49 @@ void UIFInventoryComponent::ClientAddItemFromEquipment_Implementation(class UIFE
264265

265266
}
266267

268+
void UIFInventoryComponent::AddItemFromEquipmentAnySlot(class UIFEquipmentComponent* Source, uint8 SourceIndex)
269+
{
270+
if (GetOwnerRole() < ENetRole::ROLE_Authority)
271+
{
272+
UIFItemBase* Item = Source->GetItem(SourceIndex);
273+
if (!Item)
274+
return;
275+
ServerAddItemFromEquipmentAnySlot(Source, SourceIndex);
276+
return;
277+
}
278+
}
279+
void UIFInventoryComponent::ServerAddItemFromEquipmentAnySlot_Implementation(class UIFEquipmentComponent* Source, uint8 SourceIndex)
280+
{
281+
UIFItemBase* Item = Source->GetItem(SourceIndex);
282+
if (!Item)
283+
return;
284+
285+
uint8 FreeSlot = 0;
286+
for (uint8 Idx = 0; Idx < InventoryItems.Num(); Idx++)
287+
{
288+
if (InventoryItems[Idx].Item == nullptr)
289+
{
290+
FreeSlot = Idx;
291+
break;
292+
}
293+
}
294+
295+
InventoryItems[FreeSlot].Item = DuplicateObject<UIFItemBase>(Item, this);
296+
ClientAddItemFromEquipmentAnySlot(Source, SourceIndex, FreeSlot);
297+
}
298+
bool UIFInventoryComponent::ServerAddItemFromEquipmentAnySlot_Validate(class UIFEquipmentComponent* Source, uint8 SourceIndex)
299+
{
300+
return true;
301+
}
302+
void UIFInventoryComponent::ClientAddItemFromEquipmentAnySlot_Implementation(class UIFEquipmentComponent* Source, uint8 SourceIndex, uint8 InventoryIndex)
303+
{
304+
UIFItemBase* Item = Source->GetItem(SourceIndex);
305+
306+
InventoryItems[InventoryIndex].Item = DuplicateObject<UIFItemBase>(Item, this);
307+
Source->RemoveFromEquipment(SourceIndex);
308+
}
309+
310+
267311
void UIFInventoryComponent::RemoveItem(uint8 InIndex)
268312
{
269313
if(GetOwnerRole() < ENetRole::ROLE_Authority)
@@ -321,7 +365,7 @@ void UIFInventoryComponent::OnItemLoadedFreeSlot(TSoftClassPtr<class UIFItemBase
321365

322366

323367
TSharedPtr<FJsonObject> Obj = MakeShareable(new FJsonObject());
324-
FJsonObjectConverter::UStructToJsonObject(Item.StaticStruct(), &Item, Obj.ToSharedRef(), 0, 0);
368+
FJsonObjectConverter::UStructToJsonObject(FIFItemData::StaticStruct(), &Item, Obj.ToSharedRef(), 0, 0);
325369

326370
FakeBackend.Add(Obj);
327371

Plugins/InventoryFramework/Source/InventoryFramework/Public/IFEquipmentComponent.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ class INVENTORYFRAMEWORK_API UIFEquipmentComponent : public UActorComponent
6868
void ClientAddItemFromInventory(class UIFInventoryComponent* Source, uint8 SourceIndex, uint8 EquipmentIndex);
6969
void ClientAddItemFromInventory_Implementation(class UIFInventoryComponent* Source, uint8 SourceIndex, uint8 EquipmentIndex);
7070

71+
void RemoveFromEquipment(uint8 EquipmentIndex);
72+
UFUNCTION(Server, Reliable, WithValidation)
73+
void ServerRemoveFromEquipment(uint8 EquipmentIndex);
74+
void ServerRemoveFromEquipment_Implementation(uint8 EquipmentIndex);
75+
bool ServerRemoveFromEquipment_Validate(uint8 EquipmentIndex);
76+
UFUNCTION(Client, Reliable)
77+
void ClientRemoveFromEquipment(uint8 EquipmentIndex);
78+
void ClientRemoveFromEquipment_Implementation(uint8 EquipmentIndex);
79+
80+
7181
virtual void OnItemAdded(UIFItemBase* Item, uint8 Index) {};
7282
virtual void OnItemChanged(UIFItemBase* Item, uint8 Index) {};
7383
virtual void OnItemRemoved(uint8 Index) {};

Plugins/InventoryFramework/Source/InventoryFramework/Public/IFInventoryComponent.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,20 @@ class INVENTORYFRAMEWORK_API UIFInventoryComponent : public UActorComponent
176176
void ClientAddItemFromEquipment(class UIFEquipmentComponent* Source, uint8 SourceIndex, uint8 InventoryIndex);
177177
void ClientAddItemFromEquipment_Implementation(class UIFEquipmentComponent* Source, uint8 SourceIndex, uint8 InventoryIndex);
178178

179+
void AddItemFromEquipmentAnySlot(class UIFEquipmentComponent* Source, uint8 SourceIndex);
180+
UFUNCTION(Server, Reliable, WithValidation)
181+
void ServerAddItemFromEquipmentAnySlot(class UIFEquipmentComponent* Source, uint8 SourceIndex);
182+
void ServerAddItemFromEquipmentAnySlot_Implementation(class UIFEquipmentComponent* Source, uint8 SourceIndex);
183+
bool ServerAddItemFromEquipmentAnySlot_Validate(class UIFEquipmentComponent* Source, uint8 SourceIndex);
184+
/*
185+
Confirm that change can be made and do the same change on client.
186+
We do not predict inventory modifications. Clients MUST wait for server to make changes and send confirmation back.
187+
*/
188+
UFUNCTION(Client, Reliable)
189+
void ClientAddItemFromEquipmentAnySlot(class UIFEquipmentComponent* Source, uint8 SourceIndex, uint8 InventoryIndex);
190+
void ClientAddItemFromEquipmentAnySlot_Implementation(class UIFEquipmentComponent* Source, uint8 SourceIndex, uint8 InventoryIndex);
191+
192+
179193
virtual void OnItemAdded(UIFItemBase* Item, uint8 LocalIndex) {};
180194
virtual void OnItemChanged(UIFItemBase* Item, uint8 LocalIndex) {};
181195
virtual void OnItemRemoved(uint8 LocalIndex) {};

Source/ActionRPGGame/Public/UI/Inventory/ARUIInventoryComponent.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,25 @@ void UARUIInventoryComponent::ShowWeaponsForSlot(class UARItemView* ForSlot)
112112
InventoryView->UpdateItemList<UARItemWeapon, UARListItemWeaponWidget>(Items, ListItemWeaponClass, PC, ForSlot);
113113
}
114114

115+
void UARUIInventoryComponent::RemoveWeaponFromSlot(int8 Index)
116+
{
117+
AARPlayerController* PC = nullptr;
118+
AARCharacter* Character = nullptr;
119+
if (AARHUD* HUD = Cast<AARHUD>(GetOwner()))
120+
{
121+
PC = Cast<AARPlayerController>(HUD->PlayerOwner);
122+
123+
if (!PC)
124+
return;
125+
Character = Cast<AARCharacter>(PC->GetPawn());
126+
if (!Character)
127+
return;
128+
129+
PC->MainInventory->AddItemFromEquipmentAnySlot(Character->WeaponInventory, Index);
130+
131+
}
132+
}
133+
115134
void UARUIInventoryComponent::AddWeaponToSlot(uint8 TargetNetIndex
116135
, uint8 TargetLocalIndex
117136
, uint8 SourceNetIndex

Source/ActionRPGGame/Public/UI/Inventory/ARUIInventoryComponent.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ACTIONRPGGAME_API UARUIInventoryComponent : public UActorComponent
5252

5353
public:
5454
void ShowWeaponsForSlot(class UARItemView* ForSlot);
55-
55+
void RemoveWeaponFromSlot(int8 Index);
5656
void AddWeaponToSlot(uint8 TargetNetIndex
5757
, uint8 TargetLocalIndex
5858
, uint8 SourceNetIndex

Source/ActionRPGGame/Public/UI/Inventory/Weapons/ARItemWeaponWidget.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,17 @@ void UARItemWeaponWidget::NativeConstruct()
3939

4040
FReply UARItemWeaponWidget::NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
4141
{
42-
UObject* Out = GetOuter();
43-
UARInventoryScreenWidget* MainView = Cast<UARInventoryScreenWidget>(Out);
44-
InventoryComponent->ShowWeaponsForSlot(this);
42+
if (InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton)
43+
{
44+
UObject* Out = GetOuter();
45+
UARInventoryScreenWidget* MainView = Cast<UARInventoryScreenWidget>(Out);
46+
InventoryComponent->ShowWeaponsForSlot(this);
47+
}
48+
else if (InMouseEvent.GetEffectingButton() == EKeys::RightMouseButton)
49+
{
50+
InventoryComponent->RemoveWeaponFromSlot(LocalIndex);
51+
}
52+
4553

4654
return FReply::Handled();
4755
}

0 commit comments

Comments
 (0)