the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.world.entity.ai.attributes.h"
3#include "ModifiableAttributeInstance.h"
4
5ModifiableAttributeInstance::ModifiableAttributeInstance(BaseAttributeMap *attributeMap, Attribute *attribute)
6{
7 this->attributeMap = attributeMap;
8 this->attribute = attribute;
9
10 dirty = true;
11 cachedValue = 0.0;
12
13 baseValue = attribute->getDefaultValue();
14}
15
16ModifiableAttributeInstance::~ModifiableAttributeInstance()
17{
18 for (int i = 0; i < AttributeModifier::TOTAL_OPERATIONS; i++)
19 {
20 for (AUTO_VAR(it, modifiers[i].begin()); it != modifiers[i].end(); ++it)
21 {
22 // Delete all modifiers
23 delete *it;
24 }
25 }
26}
27
28Attribute *ModifiableAttributeInstance::getAttribute()
29{
30 return attribute;
31}
32
33double ModifiableAttributeInstance::getBaseValue()
34{
35 return baseValue;
36}
37
38void ModifiableAttributeInstance::setBaseValue(double baseValue)
39{
40 if (baseValue == this->getBaseValue()) return;
41 this->baseValue = baseValue;
42 setDirty();
43}
44
45// Returns a pointer to an internally managed vector of modifers by operation
46unordered_set<AttributeModifier *> *ModifiableAttributeInstance::getModifiers(int operation)
47{
48 return &modifiers[operation];
49}
50
51// Returns a pointer to a new vector of all modifiers
52void ModifiableAttributeInstance::getModifiers(unordered_set<AttributeModifier *>& result)
53{
54 for (int i = 0; i < AttributeModifier::TOTAL_OPERATIONS; i++)
55 {
56 unordered_set<AttributeModifier *> *opModifiers = &modifiers[i];
57
58 for (AUTO_VAR(it, opModifiers->begin()); it != opModifiers->end(); ++it)
59 {
60 result.insert(*it);
61 }
62 }
63}
64
65AttributeModifier *ModifiableAttributeInstance::getModifier(eMODIFIER_ID id)
66{
67 AttributeModifier *modifier = NULL;
68
69 AUTO_VAR(it, modifierById.find(id));
70 if(it != modifierById.end())
71 {
72 modifier = it->second;
73 }
74
75 return modifier;
76}
77
78void ModifiableAttributeInstance::addModifiers(unordered_set<AttributeModifier *> *modifiers)
79{
80 for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it)
81 {
82 addModifier(*it);
83 }
84}
85
86// Add new modifier to attribute instance (takes ownership of modifier)
87void ModifiableAttributeInstance::addModifier(AttributeModifier *modifier)
88{
89 // Can't add modifiers with the same ID (unless the modifier is anonymous)
90 if (modifier->getId() != eModifierId_ANONYMOUS && getModifier(modifier->getId()) != NULL)
91 {
92 assert(0);
93 // throw new IllegalArgumentException("Modifier is already applied on this attribute!");
94 return;
95 }
96
97 modifiers[modifier->getOperation()].insert(modifier);
98 modifierById[modifier->getId()] = modifier;
99
100 setDirty();
101}
102
103void ModifiableAttributeInstance::setDirty()
104{
105 dirty = true;
106 attributeMap->onAttributeModified(this);
107}
108
109void ModifiableAttributeInstance::removeModifier(AttributeModifier *modifier)
110{
111 for (int i = 0; i < AttributeModifier::TOTAL_OPERATIONS; i++)
112 {
113 for (AUTO_VAR(it, modifiers[i].begin()); it != modifiers[i].end(); ++it)
114 {
115 if (modifier->equals(*it))
116 {
117 modifiers[i].erase(it);
118 break;
119 }
120 }
121 }
122
123 modifierById.erase(modifier->getId());
124
125 setDirty();
126}
127
128void ModifiableAttributeInstance::removeModifier(eMODIFIER_ID id)
129{
130 AttributeModifier *modifier = getModifier(id);
131 if (modifier != NULL) removeModifier(modifier);
132}
133
134void ModifiableAttributeInstance::removeModifiers()
135{
136 unordered_set<AttributeModifier *> removingModifiers;
137 getModifiers(removingModifiers);
138
139 for (AUTO_VAR(it, removingModifiers.begin()); it != removingModifiers.end(); ++it)
140 {
141 removeModifier(*it);
142 }
143}
144
145double ModifiableAttributeInstance::getValue()
146{
147 if (dirty)
148 {
149 cachedValue = calculateValue();
150 dirty = false;
151 }
152
153 return cachedValue;
154}
155
156double ModifiableAttributeInstance::calculateValue()
157{
158 double base = getBaseValue();
159 unordered_set<AttributeModifier *> *modifiers;
160
161 modifiers = getModifiers(AttributeModifier::OPERATION_ADDITION);
162 for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it)
163 {
164 AttributeModifier *modifier = *it;
165 base += modifier->getAmount();
166 }
167
168 double result = base;
169
170 modifiers = getModifiers(AttributeModifier::OPERATION_MULTIPLY_BASE);
171 for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it)
172 {
173 AttributeModifier *modifier = *it;
174 result += base * modifier->getAmount();
175 }
176
177 modifiers = getModifiers(AttributeModifier::OPERATION_MULTIPLY_TOTAL);
178 for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it)
179 {
180 AttributeModifier *modifier = *it;
181 result *= 1 + modifier->getAmount();
182 }
183
184 return attribute->sanitizeValue(result);
185}