the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 185 lines 4.5 kB view raw
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}