void LightsaberCrystalComponentImplementation::updateCraftingValues(CraftingValues* values, bool firstUpdate) { int colorMax = values->getMaxValue("color"); int color = values->getCurrentValue("color"); setMaxCondition(values->getCurrentValue("hitpoints")); if (colorMax != 31) { int finalColor = MIN(color, 11); setColor(finalColor); updateCrystal(finalColor); } else { setColor(31); updateCrystal(31); } if (color == 31){ setQuality(values->getCurrentValue("quality")); setAttackSpeed(Math::getPrecision(values->getCurrentValue("attackspeed"), 2)); setMinimumDamage(MIN(values->getCurrentValue("mindamage"), 50)); setMaximumDamage(MIN(values->getCurrentValue("maxdamage"), 50)); setWoundChance(values->getCurrentValue("woundchance")); // Following are incoming positive values in script (Due to loot modifier.) // Switch to negative number. setSacHealth(MIN(values->getCurrentValue("attackhealthcost"), 9) * -1); setSacAction(MIN(values->getCurrentValue("attackactioncost"), 9) * -1); setSacMind(MIN(values->getCurrentValue("attackmindcost"), 9) * -1); setForceCost(MIN(values->getCurrentValue("forcecost"), 9) * -1); } ComponentImplementation::updateCraftingValues(values, firstUpdate); }
void LightsaberCrystalComponentImplementation::generateCrystalStats() { ManagedReference<LootManager*> lootManager = getZoneServer()->getLootManager(); if (lootManager == NULL) return; CrystalData* crystalData = lootManager->getCrystalData(getObjectTemplate()->getTemplateFileName()); if (crystalData == NULL) { error("Unable to find crystal stats for " + getObjectTemplate()->getTemplateFileName()); return; } int minStat = crystalData->getMinHitpoints(); int maxStat = crystalData->getMaxHitpoints(); setMaxCondition(getRandomizedStat(minStat, maxStat, itemLevel)); if (color == 31) { int minStat = crystalData->getMinDamage(); int maxStat = crystalData->getMaxDamage(); damage = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinHealthSac(); maxStat = crystalData->getMaxHealthSac(); sacHealth = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinActionSac(); maxStat = crystalData->getMaxActionSac(); sacAction = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinMindSac(); maxStat = crystalData->getMaxMindSac(); sacMind = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinWoundChance(); maxStat = crystalData->getMaxWoundChance(); woundChance = getRandomizedStat(minStat, maxStat, itemLevel); float minFloatStat = crystalData->getMinForceCost(); float maxFloatStat = crystalData->getMaxForceCost(); floatForceCost = getRandomizedStat(minFloatStat, maxFloatStat, itemLevel); minFloatStat = crystalData->getMinAttackSpeed(); maxFloatStat = crystalData->getMaxAttackSpeed(); attackSpeed = Math::getPrecision(getRandomizedStat(minFloatStat, maxFloatStat, itemLevel), 2); } quality = getCrystalQuality(); }
void ConsumableImplementation::updateCraftingValues(CraftingValues* values, bool firstUpdate) { if(firstUpdate) { setMaxCondition(values->getCurrentValue("hitpoints"), true); } if (!isSpice()) { if(values->hasProperty("filling")) { filling = (fillingMax - fillingMin) * values->getCurrentPercentage("filling") + fillingMin; if(values->hasProperty("add_filling")) filling *= (1 -(values->getCurrentValue("add_filling") / 100.f)); } //http://www.swgemu.com/archive/scrapbookv51/data/20070126195417/cheffaq2_5.html //Containers //How do containers work? //Containers are required components for all drinks, but you can use any container in that slot. Each container has a multiplier that gets applied to the base quantity of the drink (which is shown in the Food Chart). //Small Glass: 1x multiplier (base quantity),Large Glass: 1.5x multiplier //Cask: 3x multiplier , Barrel: Unknown (bugged as of 3/30/04). //The multiplier is applied after any rounding due to experimentation. So if a drink needs to be experimented to 25% to go from 6 to 7 doses, that point is still when additional doses appear, just with the multiplier. With a large glass, that drink would go from 9 to 10 doses (6 * 1.5 = 9, 7 * 1.5 = 10.5, but it gets rounded down). This makes things tricky when using large glasses. The rounding is done twice, so you'll get some jumpy increases, first from 9 to 10 at 25% quantity, then from 10 to 12 at 50% quantity. //The container multiplier also stacks with any BE quantity enhancer. So if you use both a +150 quantity tissue (which gives a 2.5x multiplier) and a cask, the final drink will have 7.5x as many doses as one made with a small glass and without the tissue. //T'illa T'ill is the only exception. This appears to be designed as a single-dose item (although why a 10-15% reduction in the food stomach is considered that powerful is beyond me). This will always come out with a single dose no matter what container or BE tissue you include in it, so stick to small glasses. if(values->hasProperty("quantity")) { int quant = (quantityMax - quantityMin) * values->getCurrentPercentage("quantity") + quantityMin; if(values->hasProperty("quantity_bonus")) quant *= values->getCurrentValue("quantity_bonus"); if(values->hasProperty("add_quantity")) quant *= (1 + (values->getCurrentValue("add_quantity") / 100.f)); setUseCount(quant, true); } if(values->hasProperty("flavor")) { duration = (flavorMax - flavorMin) * values->getCurrentPercentage("flavor") + flavorMin; if(values->hasProperty("add_flavor")) duration *= (1 + (values->getCurrentValue("add_flavor") / 100.f)); } if(values->hasProperty("nutrition")) { nutrition = (nutritionMax - nutritionMin) * values->getCurrentPercentage("nutrition") + nutritionMin; if(values->hasProperty("add_nutrition")) nutrition *= (1 + (values->getCurrentValue("add_nutrition") / 100.f)); } } }
String WeaponObjectImplementation::repairAttempt(int repairChance) { String message = "@error_message:"; if(repairChance < 25) { message += "sys_repair_failed"; setMaxCondition(1, true); setConditionDamage(0, true); } else if(repairChance < 50) { message += "sys_repair_imperfect"; setMaxCondition(getMaxCondition() * .65f, true); setConditionDamage(0, true); } else if(repairChance < 75) { setMaxCondition(getMaxCondition() * .80f, true); setConditionDamage(0, true); message += "sys_repair_slight"; } else { setMaxCondition(getMaxCondition() * .95f, true); setConditionDamage(0, true); message += "sys_repair_perfect"; } return message; }
void WeaponObjectImplementation::updateCraftingValues(CraftingValues* values, bool firstUpdate) { /* * Incoming Values: Ranges: * mindamage Differs between weapons * maxdamage * attackspeed * woundchance * roundsused * hitpoints * zerorangemod * maxrange * maxrangemod * midrange * midrangemod * charges * attackhealthcost * attackactioncost * attackmindcost */ float value = 0.f; setMinDamage(MAX(values->getCurrentValue("mindamage"), 0)); setMaxDamage(MAX(values->getCurrentValue("maxdamage"), 0)); setAttackSpeed(values->getCurrentValue("attackspeed")); setHealthAttackCost((int)values->getCurrentValue("attackhealthcost")); setActionAttackCost((int)values->getCurrentValue("attackactioncost")); setMindAttackCost((int)values->getCurrentValue("attackmindcost")); if (isJediWeapon()) { setForceCost((int)values->getCurrentValue("forcecost")); setBladeColor(31); } value = values->getCurrentValue("woundchance"); if(value != CraftingValues::VALUENOTFOUND) setWoundsRatio(value); //value = craftingValues->getCurrentValue("roundsused"); //if(value != DraftSchematicValuesImplementation::VALUENOTFOUND) //_this.getReferenceUnsafeStaticCast()->set_______(value); value = values->getCurrentValue("zerorangemod"); if(value != CraftingValues::VALUENOTFOUND) setPointBlankAccuracy((int)value); value = values->getCurrentValue("maxrange"); if(value != CraftingValues::VALUENOTFOUND) setMaxRange((int)value); value = values->getCurrentValue("maxrangemod"); if(value != CraftingValues::VALUENOTFOUND) setMaxRangeAccuracy((int)value); value = values->getCurrentValue("midrange"); if(value != CraftingValues::VALUENOTFOUND) setIdealRange((int)value); value = values->getCurrentValue("midrangemod"); if(value != CraftingValues::VALUENOTFOUND) setIdealAccuracy((int)value); //value = craftingValues->getCurrentValue("charges"); //if(value != CraftingValues::VALUENOTFOUND) // setUsesRemaining((int)value); value = values->getCurrentValue("hitpoints"); if(value != CraftingValues::VALUENOTFOUND) setMaxCondition((int)value); setConditionDamage(0); }
void LightsaberCrystalComponentImplementation::validateCrystalStats() { ManagedReference<LootManager*> lootManager = getZoneServer()->getLootManager(); if (lootManager == NULL) return; CrystalData* crystalData = lootManager->getCrystalData(getObjectTemplate()->getTemplateFileName()); if (crystalData == NULL) { error("Unable to find crystal stats for " + getObjectTemplate()->getTemplateFileName()); return; } int minStat = crystalData->getMinHitpoints(); int maxStat = crystalData->getMaxHitpoints(); if (getMaxCondition() > maxStat || getMaxCondition() < minStat) setMaxCondition(getRandomizedStat(minStat, maxStat, itemLevel)); if (color == 31) { minStat = crystalData->getMinDamage(); maxStat = crystalData->getMaxDamage(); if (damage > maxStat || damage < minStat) damage = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinHealthSac(); maxStat = crystalData->getMaxHealthSac(); if (sacHealth > maxStat || sacHealth < minStat) sacHealth = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinActionSac(); maxStat = crystalData->getMaxActionSac(); if (sacAction > maxStat || sacAction < minStat) sacAction = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinMindSac(); maxStat = crystalData->getMaxMindSac(); if (sacMind > maxStat || sacMind < minStat) sacMind = getRandomizedStat(minStat, maxStat, itemLevel); minStat = crystalData->getMinWoundChance(); maxStat = crystalData->getMaxWoundChance(); if (woundChance > maxStat || woundChance < minStat) woundChance = getRandomizedStat(minStat, maxStat, itemLevel); float minFloatStat = crystalData->getMinForceCost(); float maxFloatStat = crystalData->getMaxForceCost(); if (floatForceCost > maxFloatStat || floatForceCost < minFloatStat) floatForceCost = getRandomizedStat(minFloatStat, maxFloatStat, itemLevel); minFloatStat = crystalData->getMinAttackSpeed(); maxFloatStat = crystalData->getMaxAttackSpeed(); if (attackSpeed > maxFloatStat || attackSpeed < minFloatStat) attackSpeed = Math::getPrecision(getRandomizedStat(minFloatStat, maxFloatStat, itemLevel), 2); } }