Repository navigation
Expand file tree
/
Copy pathPlayerEquipmentController.cs
More file actions
121 lines (95 loc) · 3.58 KB
/
Copy pathPlayerEquipmentController.cs
File metadata and controls
121 lines (95 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using UnityEngine;
using UnityRPG.Character.Player;
using UnityRPG.Character.Stats;
namespace UnityRPG.Item
{
[DisallowMultipleComponent]
[RequireComponent(typeof(PlayerInventory))]
[RequireComponent(typeof(PlayerEquipment))]
[RequireComponent(typeof(PlayerStats))]
[RequireComponent(typeof(PlayerHealth))]
public sealed class PlayerEquipmentController : MonoBehaviour
{
private PlayerInventory inventory;
private PlayerEquipment equipment;
private PlayerStats playerStats;
private PlayerHealth playerHealth;
private bool isConfigured;
private void Awake()
{
inventory = GetComponent<PlayerInventory>();
equipment = GetComponent<PlayerEquipment>();
playerStats = GetComponent<PlayerStats>();
playerHealth = GetComponent<PlayerHealth>();
isConfigured = inventory != null && equipment != null && playerStats != null && playerHealth != null;
}
public bool TryEquip(EquipmentDefinition item)
{
if (!isConfigured || item == null)
return false;
if (equipment.IsEquipped(item))
return false;
if (!inventory.HasItem(item))
return false;
EquipmentDefinition previous = equipment.GetEquipped(item.Slot);
if (inventory.RemoveItem(item, 1) != 1)
return false;
if (previous != null && inventory.AddItem(previous, 1) != 1)
{
inventory.AddItem(item, 1);
return false;
}
if (previous != null)
playerStats.RemoveModifiersFromSource(previous);
ApplyStatBonuses(item);
equipment.SetEquipped(item);
playerHealth.ClampToMaxHealth();
return true;
}
public bool TryUnequip(EquipmentSlot slot)
{
if (!isConfigured)
return false;
EquipmentDefinition equippedItem = equipment.GetEquipped(slot);
if (equippedItem == null)
return false;
if (inventory.AddItem(equippedItem, 1) != 1)
return false;
playerStats.RemoveModifiersFromSource(equippedItem);
equipment.ClearSlot(slot);
playerHealth.ClampToMaxHealth();
return true;
}
internal void ClearForRestore()
{
if (!isConfigured)
return;
foreach (EquipmentSlot slot in System.Enum.GetValues(typeof(EquipmentSlot)))
{
EquipmentDefinition equippedItem = equipment.GetEquipped(slot);
if (equippedItem == null)
continue;
playerStats.RemoveModifiersFromSource(equippedItem);
equipment.ClearSlot(slot);
}
playerHealth.ClampToMaxHealth();
}
internal bool TryEquipForRestore(EquipmentDefinition item)
{
if (!isConfigured || item == null || equipment.HasEquipment(item.Slot))
return false;
ApplyStatBonuses(item);
equipment.SetEquipped(item);
playerHealth.ClampToMaxHealth();
return true;
}
private void ApplyStatBonuses(EquipmentDefinition item)
{
for (int i = 0; i < item.StatBonuses.Count; i++)
{
EquipmentStatBonus bonus = item.StatBonuses[i];
playerStats.AddModifier(bonus.StatType, new StatModifier(bonus.Value, item));
}
}
}
}