Add MainAmmo slot check for AddItemBonuses - only includes skill mods

This commit is contained in:
Uleat 2016-02-29 21:46:53 -05:00
parent 63cce6875f
commit abedfd3918
9 changed files with 298 additions and 296 deletions

View File

@ -1,5 +1,8 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50) EQEMu Changelog (Started on Sept 24, 2003 15:50)
------------------------------------------------------- -------------------------------------------------------
== 02/29/2016 ==
Uleat: Change in AddItemBonuses - now includes ammo slot for skill mods only. Defined SoD- client SkillModMax packet property (client does not show..but, does enforce.)
== 02/11/2016 == == 02/11/2016 ==
Hateborne: Added IgnoreSpellDmgLvlRestriction rule (boolean) to ignore the 5 level spread when checking to add SpellDmg Hateborne: Added IgnoreSpellDmgLvlRestriction rule (boolean) to ignore the 5 level spread when checking to add SpellDmg

View File

@ -2230,11 +2230,12 @@ void ItemInst::ScaleItem() {
m_scaledItem->Mana = (int32)((float)m_item->Mana*Mult); m_scaledItem->Mana = (int32)((float)m_item->Mana*Mult);
m_scaledItem->AC = (int32)((float)m_item->AC*Mult); m_scaledItem->AC = (int32)((float)m_item->AC*Mult);
m_scaledItem->SkillModValue = (int32)((float)m_item->SkillModValue*Mult); // check these..some may not need to be modified (really need to check all stats/bonuses)
m_scaledItem->BaneDmgAmt = (int8)((float)m_item->BaneDmgAmt*Mult); //m_scaledItem->SkillModValue = (int32)((float)m_item->SkillModValue*Mult);
m_scaledItem->BardValue = (int32)((float)m_item->BardValue*Mult); //m_scaledItem->BaneDmgAmt = (int8)((float)m_item->BaneDmgAmt*Mult); // watch (10 entries with charmfileid)
m_scaledItem->ElemDmgAmt = (uint8)((float)m_item->ElemDmgAmt*Mult); m_scaledItem->BardValue = (int32)((float)m_item->BardValue*Mult); // watch (no entries with charmfileid)
m_scaledItem->Damage = (uint32)((float)m_item->Damage*Mult); m_scaledItem->ElemDmgAmt = (uint8)((float)m_item->ElemDmgAmt*Mult); // watch (no entries with charmfileid)
m_scaledItem->Damage = (uint32)((float)m_item->Damage*Mult); // watch
m_scaledItem->CombatEffects = (int8)((float)m_item->CombatEffects*Mult); m_scaledItem->CombatEffects = (int8)((float)m_item->CombatEffects*Mult);
m_scaledItem->Shielding = (int8)((float)m_item->Shielding*Mult); m_scaledItem->Shielding = (int8)((float)m_item->Shielding*Mult);

View File

@ -3661,7 +3661,7 @@ namespace SoD
ibs.Races = item->Races; ibs.Races = item->Races;
ibs.Deity = item->Deity; ibs.Deity = item->Deity;
ibs.SkillModValue = item->SkillModValue; ibs.SkillModValue = item->SkillModValue;
ibs.unknown6 = 0; ibs.SkillModMax = item->SkillModMax;
ibs.SkillModType = item->SkillModType; ibs.SkillModType = item->SkillModType;
ibs.BaneDmgRace = item->BaneDmgRace; ibs.BaneDmgRace = item->BaneDmgRace;
ibs.BaneDmgBody = item->BaneDmgBody; ibs.BaneDmgBody = item->BaneDmgBody;

View File

@ -4006,7 +4006,7 @@ struct ItemBodyStruct
uint32 Races; uint32 Races;
uint32 Deity; uint32 Deity;
int32 SkillModValue; int32 SkillModValue;
uint32 unknown6; uint32 SkillModMax;
uint32 SkillModType; uint32 SkillModType;
uint32 BaneDmgRace; uint32 BaneDmgRace;
uint32 BaneDmgBody; uint32 BaneDmgBody;

View File

@ -2983,7 +2983,7 @@ namespace SoF
ibs.Races = item->Races; ibs.Races = item->Races;
ibs.Deity = item->Deity; ibs.Deity = item->Deity;
ibs.SkillModValue = item->SkillModValue; ibs.SkillModValue = item->SkillModValue;
ibs.unknown6 = 0; ibs.SkillModMax = item->SkillModMax;
ibs.SkillModType = item->SkillModType; ibs.SkillModType = item->SkillModType;
ibs.BaneDmgRace = item->BaneDmgRace; ibs.BaneDmgRace = item->BaneDmgRace;
ibs.BaneDmgBody = item->BaneDmgBody; ibs.BaneDmgBody = item->BaneDmgBody;

View File

@ -3861,7 +3861,7 @@ struct ItemBodyStruct
uint32 Races; uint32 Races;
uint32 Deity; uint32 Deity;
int32 SkillModValue; int32 SkillModValue;
uint32 unknown6; uint32 SkillModMax;
uint32 SkillModType; uint32 SkillModType;
uint32 BaneDmgRace; uint32 BaneDmgRace;
uint32 BaneDmgBody; uint32 BaneDmgBody;

View File

@ -39,7 +39,7 @@ These fields must be in the order of how they are serialized!
/* 030 */ I(AC) /* 030 */ I(AC)
/* 031 */ I(Deity) /* 031 */ I(Deity)
/* 032 */ I(SkillModValue) /* 032 */ I(SkillModValue)
/* 033 */ C("0") /* 033 */ I(SkillModMax)
/* 034 */ I(SkillModType) /* 034 */ I(SkillModType)
/* 035 */ I(BaneDmgRace) /* 035 */ I(BaneDmgRace)
/* 036 */ I(BaneDmgAmt) /* 036 */ I(BaneDmgAmt)

View File

@ -144,12 +144,12 @@ void Client::CalcItemBonuses(StatBonuses* newbon) {
SetTwoHanderEquipped(false); SetTwoHanderEquipped(false);
unsigned int i; unsigned int i;
//should not include 21 (SLOT_AMMO) // Update: MainAmmo should only calc skill mods (TODO: Check for other cases)
for (i = MainCharm; i < MainAmmo; i++) { for (i = MainCharm; i <= MainAmmo; i++) {
const ItemInst* inst = m_inv[i]; const ItemInst* inst = m_inv[i];
if(inst == 0) if(inst == 0)
continue; continue;
AddItemBonuses(inst, newbon); AddItemBonuses(inst, newbon, false, false, 0, (i == MainAmmo));
//These are given special flags due to how often they are checked for various spell effects. //These are given special flags due to how often they are checked for various spell effects.
const Item_Struct *item = inst->GetItem(); const Item_Struct *item = inst->GetItem();
@ -207,7 +207,7 @@ void Client::ProcessItemCaps()
itembonuses.ATK = std::min(itembonuses.ATK, CalcItemATKCap()); itembonuses.ATK = std::min(itembonuses.ATK, CalcItemATKCap());
} }
void Client::AddItemBonuses(const ItemInst *inst, StatBonuses *newbon, bool isAug, bool isTribute, int rec_override) void Client::AddItemBonuses(const ItemInst *inst, StatBonuses *newbon, bool isAug, bool isTribute, int rec_override, bool ammo_slot_item)
{ {
if (!inst || !inst->IsType(ItemClassCommon)) { if (!inst || !inst->IsType(ItemClassCommon)) {
return; return;
@ -227,309 +227,307 @@ void Client::AddItemBonuses(const ItemInst *inst, StatBonuses *newbon, bool isAu
if (GetLevel() < inst->GetItemRequiredLevel(true)) { if (GetLevel() < inst->GetItemRequiredLevel(true)) {
return; return;
} }
// So there isn't a very nice way to get the real rec level from the aug's inst, so we just pass it in, only // So there isn't a very nice way to get the real rec level from the aug's inst, so we just pass it in, only
// used for augs // used for augs
auto rec_level = isAug ? rec_override : inst->GetItemRecommendedLevel(true); auto rec_level = isAug ? rec_override : inst->GetItemRecommendedLevel(true);
if (GetLevel() >= rec_level) {
newbon->AC += item->AC;
newbon->HP += item->HP;
newbon->Mana += item->Mana;
newbon->Endurance += item->Endur;
newbon->ATK += item->Attack;
newbon->STR += (item->AStr + item->HeroicStr);
newbon->STA += (item->ASta + item->HeroicSta);
newbon->DEX += (item->ADex + item->HeroicDex);
newbon->AGI += (item->AAgi + item->HeroicAgi);
newbon->INT += (item->AInt + item->HeroicInt);
newbon->WIS += (item->AWis + item->HeroicWis);
newbon->CHA += (item->ACha + item->HeroicCha);
newbon->MR += (item->MR + item->HeroicMR); if (!ammo_slot_item) {
newbon->FR += (item->FR + item->HeroicFR); if (GetLevel() >= rec_level) {
newbon->CR += (item->CR + item->HeroicCR); newbon->AC += item->AC;
newbon->PR += (item->PR + item->HeroicPR); newbon->HP += item->HP;
newbon->DR += (item->DR + item->HeroicDR); newbon->Mana += item->Mana;
newbon->Corrup += (item->SVCorruption + item->HeroicSVCorrup); newbon->Endurance += item->Endur;
newbon->ATK += item->Attack;
newbon->STR += (item->AStr + item->HeroicStr);
newbon->STA += (item->ASta + item->HeroicSta);
newbon->DEX += (item->ADex + item->HeroicDex);
newbon->AGI += (item->AAgi + item->HeroicAgi);
newbon->INT += (item->AInt + item->HeroicInt);
newbon->WIS += (item->AWis + item->HeroicWis);
newbon->CHA += (item->ACha + item->HeroicCha);
newbon->STRCapMod += item->HeroicStr; newbon->MR += (item->MR + item->HeroicMR);
newbon->STACapMod += item->HeroicSta; newbon->FR += (item->FR + item->HeroicFR);
newbon->DEXCapMod += item->HeroicDex; newbon->CR += (item->CR + item->HeroicCR);
newbon->AGICapMod += item->HeroicAgi; newbon->PR += (item->PR + item->HeroicPR);
newbon->INTCapMod += item->HeroicInt; newbon->DR += (item->DR + item->HeroicDR);
newbon->WISCapMod += item->HeroicWis; newbon->Corrup += (item->SVCorruption + item->HeroicSVCorrup);
newbon->CHACapMod += item->HeroicCha;
newbon->MRCapMod += item->HeroicMR;
newbon->CRCapMod += item->HeroicFR;
newbon->FRCapMod += item->HeroicCR;
newbon->PRCapMod += item->HeroicPR;
newbon->DRCapMod += item->HeroicDR;
newbon->CorrupCapMod += item->HeroicSVCorrup;
newbon->HeroicSTR += item->HeroicStr; newbon->STRCapMod += item->HeroicStr;
newbon->HeroicSTA += item->HeroicSta; newbon->STACapMod += item->HeroicSta;
newbon->HeroicDEX += item->HeroicDex; newbon->DEXCapMod += item->HeroicDex;
newbon->HeroicAGI += item->HeroicAgi; newbon->AGICapMod += item->HeroicAgi;
newbon->HeroicINT += item->HeroicInt; newbon->INTCapMod += item->HeroicInt;
newbon->HeroicWIS += item->HeroicWis; newbon->WISCapMod += item->HeroicWis;
newbon->HeroicCHA += item->HeroicCha; newbon->CHACapMod += item->HeroicCha;
newbon->HeroicMR += item->HeroicMR; newbon->MRCapMod += item->HeroicMR;
newbon->HeroicFR += item->HeroicFR; newbon->CRCapMod += item->HeroicFR;
newbon->HeroicCR += item->HeroicCR; newbon->FRCapMod += item->HeroicCR;
newbon->HeroicPR += item->HeroicPR; newbon->PRCapMod += item->HeroicPR;
newbon->HeroicDR += item->HeroicDR; newbon->DRCapMod += item->HeroicDR;
newbon->HeroicCorrup += item->HeroicSVCorrup; newbon->CorrupCapMod += item->HeroicSVCorrup;
} else { newbon->HeroicSTR += item->HeroicStr;
int lvl = GetLevel(); newbon->HeroicSTA += item->HeroicSta;
newbon->HeroicDEX += item->HeroicDex;
newbon->HeroicAGI += item->HeroicAgi;
newbon->HeroicINT += item->HeroicInt;
newbon->HeroicWIS += item->HeroicWis;
newbon->HeroicCHA += item->HeroicCha;
newbon->HeroicMR += item->HeroicMR;
newbon->HeroicFR += item->HeroicFR;
newbon->HeroicCR += item->HeroicCR;
newbon->HeroicPR += item->HeroicPR;
newbon->HeroicDR += item->HeroicDR;
newbon->HeroicCorrup += item->HeroicSVCorrup;
newbon->AC += CalcRecommendedLevelBonus(lvl, rec_level, item->AC); }
newbon->HP += CalcRecommendedLevelBonus(lvl, rec_level, item->HP); else {
newbon->Mana += CalcRecommendedLevelBonus(lvl, rec_level, item->Mana); int lvl = GetLevel();
newbon->Endurance += CalcRecommendedLevelBonus(lvl, rec_level, item->Endur);
newbon->ATK += CalcRecommendedLevelBonus(lvl, rec_level, item->Attack);
newbon->STR += CalcRecommendedLevelBonus(lvl, rec_level, (item->AStr + item->HeroicStr));
newbon->STA += CalcRecommendedLevelBonus(lvl, rec_level, (item->ASta + item->HeroicSta));
newbon->DEX += CalcRecommendedLevelBonus(lvl, rec_level, (item->ADex + item->HeroicDex));
newbon->AGI += CalcRecommendedLevelBonus(lvl, rec_level, (item->AAgi + item->HeroicAgi));
newbon->INT += CalcRecommendedLevelBonus(lvl, rec_level, (item->AInt + item->HeroicInt));
newbon->WIS += CalcRecommendedLevelBonus(lvl, rec_level, (item->AWis + item->HeroicWis));
newbon->CHA += CalcRecommendedLevelBonus(lvl, rec_level, (item->ACha + item->HeroicCha));
newbon->MR += CalcRecommendedLevelBonus(lvl, rec_level, (item->MR + item->HeroicMR)); newbon->AC += CalcRecommendedLevelBonus(lvl, rec_level, item->AC);
newbon->FR += CalcRecommendedLevelBonus(lvl, rec_level, (item->FR + item->HeroicFR)); newbon->HP += CalcRecommendedLevelBonus(lvl, rec_level, item->HP);
newbon->CR += CalcRecommendedLevelBonus(lvl, rec_level, (item->CR + item->HeroicCR)); newbon->Mana += CalcRecommendedLevelBonus(lvl, rec_level, item->Mana);
newbon->PR += CalcRecommendedLevelBonus(lvl, rec_level, (item->PR + item->HeroicPR)); newbon->Endurance += CalcRecommendedLevelBonus(lvl, rec_level, item->Endur);
newbon->DR += CalcRecommendedLevelBonus(lvl, rec_level, (item->DR + item->HeroicDR)); newbon->ATK += CalcRecommendedLevelBonus(lvl, rec_level, item->Attack);
newbon->Corrup += newbon->STR += CalcRecommendedLevelBonus(lvl, rec_level, (item->AStr + item->HeroicStr));
CalcRecommendedLevelBonus(lvl, rec_level, (item->SVCorruption + item->HeroicSVCorrup)); newbon->STA += CalcRecommendedLevelBonus(lvl, rec_level, (item->ASta + item->HeroicSta));
newbon->DEX += CalcRecommendedLevelBonus(lvl, rec_level, (item->ADex + item->HeroicDex));
newbon->AGI += CalcRecommendedLevelBonus(lvl, rec_level, (item->AAgi + item->HeroicAgi));
newbon->INT += CalcRecommendedLevelBonus(lvl, rec_level, (item->AInt + item->HeroicInt));
newbon->WIS += CalcRecommendedLevelBonus(lvl, rec_level, (item->AWis + item->HeroicWis));
newbon->CHA += CalcRecommendedLevelBonus(lvl, rec_level, (item->ACha + item->HeroicCha));
newbon->STRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicStr); newbon->MR += CalcRecommendedLevelBonus(lvl, rec_level, (item->MR + item->HeroicMR));
newbon->STACapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSta); newbon->FR += CalcRecommendedLevelBonus(lvl, rec_level, (item->FR + item->HeroicFR));
newbon->DEXCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDex); newbon->CR += CalcRecommendedLevelBonus(lvl, rec_level, (item->CR + item->HeroicCR));
newbon->AGICapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicAgi); newbon->PR += CalcRecommendedLevelBonus(lvl, rec_level, (item->PR + item->HeroicPR));
newbon->INTCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicInt); newbon->DR += CalcRecommendedLevelBonus(lvl, rec_level, (item->DR + item->HeroicDR));
newbon->WISCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicWis); newbon->Corrup +=
newbon->CHACapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCha); CalcRecommendedLevelBonus(lvl, rec_level, (item->SVCorruption + item->HeroicSVCorrup));
newbon->MRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicMR);
newbon->CRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicFR);
newbon->FRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCR);
newbon->PRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicPR);
newbon->DRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDR);
newbon->CorrupCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSVCorrup);
newbon->HeroicSTR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicStr); newbon->STRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicStr);
newbon->HeroicSTA += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSta); newbon->STACapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSta);
newbon->HeroicDEX += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDex); newbon->DEXCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDex);
newbon->HeroicAGI += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicAgi); newbon->AGICapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicAgi);
newbon->HeroicINT += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicInt); newbon->INTCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicInt);
newbon->HeroicWIS += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicWis); newbon->WISCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicWis);
newbon->HeroicCHA += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCha); newbon->CHACapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCha);
newbon->HeroicMR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicMR); newbon->MRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicMR);
newbon->HeroicFR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicFR); newbon->CRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicFR);
newbon->HeroicCR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCR); newbon->FRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCR);
newbon->HeroicPR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicPR); newbon->PRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicPR);
newbon->HeroicDR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDR); newbon->DRCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDR);
newbon->HeroicCorrup += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSVCorrup); newbon->CorrupCapMod += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSVCorrup);
}
newbon->HeroicSTR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicStr);
// FatherNitwit: New style haste, shields, and regens newbon->HeroicSTA += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSta);
if (newbon->haste < (int32)item->Haste) { newbon->HeroicDEX += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDex);
newbon->haste = item->Haste; newbon->HeroicAGI += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicAgi);
} newbon->HeroicINT += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicInt);
if (item->Regen > 0) newbon->HeroicWIS += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicWis);
newbon->HPRegen += item->Regen; newbon->HeroicCHA += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCha);
newbon->HeroicMR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicMR);
if (item->ManaRegen > 0) newbon->HeroicFR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicFR);
newbon->ManaRegen += item->ManaRegen; newbon->HeroicCR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicCR);
newbon->HeroicPR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicPR);
if (item->EnduranceRegen > 0) newbon->HeroicDR += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicDR);
newbon->EnduranceRegen += item->EnduranceRegen; newbon->HeroicCorrup += CalcRecommendedLevelBonus(lvl, rec_level, item->HeroicSVCorrup);
}
if (item->DamageShield > 0) {
if ((newbon->DamageShield + item->DamageShield) > RuleI(Character, ItemDamageShieldCap)) // FatherNitwit: New style haste, shields, and regens
newbon->DamageShield = RuleI(Character, ItemDamageShieldCap); if (newbon->haste < (int32)item->Haste) {
else newbon->haste = item->Haste;
newbon->DamageShield += item->DamageShield; }
} if (item->Regen > 0)
if (item->SpellShield > 0) { newbon->HPRegen += item->Regen;
if ((newbon->SpellShield + item->SpellShield) > RuleI(Character, ItemSpellShieldingCap))
newbon->SpellShield = RuleI(Character, ItemSpellShieldingCap); if (item->ManaRegen > 0)
else newbon->ManaRegen += item->ManaRegen;
newbon->SpellShield += item->SpellShield;
} if (item->EnduranceRegen > 0)
if (item->Shielding > 0) { newbon->EnduranceRegen += item->EnduranceRegen;
if ((newbon->MeleeMitigation + item->Shielding) > RuleI(Character, ItemShieldingCap))
newbon->MeleeMitigation = RuleI(Character, ItemShieldingCap); if (item->DamageShield > 0) {
else if ((newbon->DamageShield + item->DamageShield) > RuleI(Character, ItemDamageShieldCap))
newbon->MeleeMitigation += item->Shielding; newbon->DamageShield = RuleI(Character, ItemDamageShieldCap);
} else
if (item->StunResist > 0) { newbon->DamageShield += item->DamageShield;
if ((newbon->StunResist + item->StunResist) > RuleI(Character, ItemStunResistCap)) }
newbon->StunResist = RuleI(Character, ItemStunResistCap); if (item->SpellShield > 0) {
else if ((newbon->SpellShield + item->SpellShield) > RuleI(Character, ItemSpellShieldingCap))
newbon->StunResist += item->StunResist; newbon->SpellShield = RuleI(Character, ItemSpellShieldingCap);
} else
if (item->StrikeThrough > 0) { newbon->SpellShield += item->SpellShield;
if ((newbon->StrikeThrough + item->StrikeThrough) > RuleI(Character, ItemStrikethroughCap)) }
newbon->StrikeThrough = RuleI(Character, ItemStrikethroughCap); if (item->Shielding > 0) {
else if ((newbon->MeleeMitigation + item->Shielding) > RuleI(Character, ItemShieldingCap))
newbon->StrikeThrough += item->StrikeThrough; newbon->MeleeMitigation = RuleI(Character, ItemShieldingCap);
} else
if (item->Avoidance > 0) { newbon->MeleeMitigation += item->Shielding;
if ((newbon->AvoidMeleeChance + item->Avoidance) > RuleI(Character, ItemAvoidanceCap)) }
newbon->AvoidMeleeChance = RuleI(Character, ItemAvoidanceCap); if (item->StunResist > 0) {
else if ((newbon->StunResist + item->StunResist) > RuleI(Character, ItemStunResistCap))
newbon->AvoidMeleeChance += item->Avoidance; newbon->StunResist = RuleI(Character, ItemStunResistCap);
} else
if (item->Accuracy > 0) { newbon->StunResist += item->StunResist;
if ((newbon->HitChance + item->Accuracy) > RuleI(Character, ItemAccuracyCap)) }
newbon->HitChance = RuleI(Character, ItemAccuracyCap); if (item->StrikeThrough > 0) {
else if ((newbon->StrikeThrough + item->StrikeThrough) > RuleI(Character, ItemStrikethroughCap))
newbon->HitChance += item->Accuracy; newbon->StrikeThrough = RuleI(Character, ItemStrikethroughCap);
} else
if (item->CombatEffects > 0) { newbon->StrikeThrough += item->StrikeThrough;
if ((newbon->ProcChance + item->CombatEffects) > RuleI(Character, ItemCombatEffectsCap)) }
newbon->ProcChance = RuleI(Character, ItemCombatEffectsCap); if (item->Avoidance > 0) {
else if ((newbon->AvoidMeleeChance + item->Avoidance) > RuleI(Character, ItemAvoidanceCap))
newbon->ProcChance += item->CombatEffects; newbon->AvoidMeleeChance = RuleI(Character, ItemAvoidanceCap);
} else
if (item->DotShielding > 0) { newbon->AvoidMeleeChance += item->Avoidance;
if ((newbon->DoTShielding + item->DotShielding) > RuleI(Character, ItemDoTShieldingCap)) }
newbon->DoTShielding = RuleI(Character, ItemDoTShieldingCap); if (item->Accuracy > 0) {
else if ((newbon->HitChance + item->Accuracy) > RuleI(Character, ItemAccuracyCap))
newbon->DoTShielding += item->DotShielding; newbon->HitChance = RuleI(Character, ItemAccuracyCap);
} else
newbon->HitChance += item->Accuracy;
if (item->HealAmt > 0) { }
if ((newbon->HealAmt + item->HealAmt) > RuleI(Character, ItemHealAmtCap)) if (item->CombatEffects > 0) {
newbon->HealAmt = RuleI(Character, ItemHealAmtCap); if ((newbon->ProcChance + item->CombatEffects) > RuleI(Character, ItemCombatEffectsCap))
else newbon->ProcChance = RuleI(Character, ItemCombatEffectsCap);
newbon->HealAmt += item->HealAmt; else
} newbon->ProcChance += item->CombatEffects;
if (item->SpellDmg > 0) { }
if ((newbon->SpellDmg + item->SpellDmg) > RuleI(Character, ItemSpellDmgCap)) if (item->DotShielding > 0) {
newbon->SpellDmg = RuleI(Character, ItemSpellDmgCap); if ((newbon->DoTShielding + item->DotShielding) > RuleI(Character, ItemDoTShieldingCap))
else newbon->DoTShielding = RuleI(Character, ItemDoTShieldingCap);
newbon->SpellDmg += item->SpellDmg; else
} newbon->DoTShielding += item->DotShielding;
if (item->Clairvoyance > 0) { }
if ((newbon->Clairvoyance + item->Clairvoyance) > RuleI(Character, ItemClairvoyanceCap))
newbon->Clairvoyance = RuleI(Character, ItemClairvoyanceCap); if (item->HealAmt > 0) {
else if ((newbon->HealAmt + item->HealAmt) > RuleI(Character, ItemHealAmtCap))
newbon->Clairvoyance += item->Clairvoyance; newbon->HealAmt = RuleI(Character, ItemHealAmtCap);
} else
newbon->HealAmt += item->HealAmt;
if (item->DSMitigation > 0) { }
if ((newbon->DSMitigation + item->DSMitigation) > RuleI(Character, ItemDSMitigationCap)) if (item->SpellDmg > 0) {
newbon->DSMitigation = RuleI(Character, ItemDSMitigationCap); if ((newbon->SpellDmg + item->SpellDmg) > RuleI(Character, ItemSpellDmgCap))
else newbon->SpellDmg = RuleI(Character, ItemSpellDmgCap);
newbon->DSMitigation += item->DSMitigation; else
} newbon->SpellDmg += item->SpellDmg;
if (item->Worn.Effect > 0 && item->Worn.Type == ET_WornEffect) { // latent effects }
ApplySpellsBonuses(item->Worn.Effect, item->Worn.Level, newbon, 0, item->Worn.Type); if (item->Clairvoyance > 0) {
} if ((newbon->Clairvoyance + item->Clairvoyance) > RuleI(Character, ItemClairvoyanceCap))
newbon->Clairvoyance = RuleI(Character, ItemClairvoyanceCap);
if (item->Focus.Effect > 0 && (item->Focus.Type == ET_Focus)) { // focus effects else
ApplySpellsBonuses(item->Focus.Effect, item->Focus.Level, newbon, 0); newbon->Clairvoyance += item->Clairvoyance;
} }
switch (item->BardType) { if (item->DSMitigation > 0) {
case 51: /* All (e.g. Singing Short Sword) */ if ((newbon->DSMitigation + item->DSMitigation) > RuleI(Character, ItemDSMitigationCap))
{ newbon->DSMitigation = RuleI(Character, ItemDSMitigationCap);
if (item->BardValue > newbon->singingMod) else
newbon->singingMod = item->BardValue; newbon->DSMitigation += item->DSMitigation;
if (item->BardValue > newbon->brassMod) }
newbon->brassMod = item->BardValue; if (item->Worn.Effect > 0 && item->Worn.Type == ET_WornEffect) { // latent effects
if (item->BardValue > newbon->stringedMod) ApplySpellsBonuses(item->Worn.Effect, item->Worn.Level, newbon, 0, item->Worn.Type);
newbon->stringedMod = item->BardValue; }
if (item->BardValue > newbon->percussionMod)
newbon->percussionMod = item->BardValue; if (item->Focus.Effect > 0 && (item->Focus.Type == ET_Focus)) { // focus effects
if (item->BardValue > newbon->windMod) ApplySpellsBonuses(item->Focus.Effect, item->Focus.Level, newbon, 0);
newbon->windMod = item->BardValue; }
break;
} switch (item->BardType) {
case 50: /* Singing */ case 51: /* All (e.g. Singing Short Sword) */
{ if (item->BardValue > newbon->singingMod)
if (item->BardValue > newbon->singingMod) newbon->singingMod = item->BardValue;
newbon->singingMod = item->BardValue; if (item->BardValue > newbon->brassMod)
break; newbon->brassMod = item->BardValue;
} if (item->BardValue > newbon->stringedMod)
case 23: /* Wind */ newbon->stringedMod = item->BardValue;
{ if (item->BardValue > newbon->percussionMod)
if (item->BardValue > newbon->windMod) newbon->percussionMod = item->BardValue;
newbon->windMod = item->BardValue; if (item->BardValue > newbon->windMod)
break; newbon->windMod = item->BardValue;
} break;
case 24: /* stringed */ case 50: /* Singing */
{ if (item->BardValue > newbon->singingMod)
if (item->BardValue > newbon->stringedMod) newbon->singingMod = item->BardValue;
newbon->stringedMod = item->BardValue; break;
break; case 23: /* Wind */
} if (item->BardValue > newbon->windMod)
case 25: /* brass */ newbon->windMod = item->BardValue;
{ break;
if (item->BardValue > newbon->brassMod) case 24: /* stringed */
newbon->brassMod = item->BardValue; if (item->BardValue > newbon->stringedMod)
break; newbon->stringedMod = item->BardValue;
} break;
case 26: /* Percussion */ case 25: /* brass */
{ if (item->BardValue > newbon->brassMod)
if (item->BardValue > newbon->percussionMod) newbon->brassMod = item->BardValue;
newbon->percussionMod = item->BardValue; break;
break; case 26: /* Percussion */
} if (item->BardValue > newbon->percussionMod)
newbon->percussionMod = item->BardValue;
break;
}
// Add Item Faction Mods
if (item->FactionMod1) {
if (item->FactionAmt1 > 0 && item->FactionAmt1 > GetItemFactionBonus(item->FactionMod1)) {
AddItemFactionBonus(item->FactionMod1, item->FactionAmt1);
}
else if (item->FactionAmt1 < 0 && item->FactionAmt1 < GetItemFactionBonus(item->FactionMod1)) {
AddItemFactionBonus(item->FactionMod1, item->FactionAmt1);
}
}
if (item->FactionMod2) {
if (item->FactionAmt2 > 0 && item->FactionAmt2 > GetItemFactionBonus(item->FactionMod2)) {
AddItemFactionBonus(item->FactionMod2, item->FactionAmt2);
}
else if (item->FactionAmt2 < 0 && item->FactionAmt2 < GetItemFactionBonus(item->FactionMod2)) {
AddItemFactionBonus(item->FactionMod2, item->FactionAmt2);
}
}
if (item->FactionMod3) {
if (item->FactionAmt3 > 0 && item->FactionAmt3 > GetItemFactionBonus(item->FactionMod3)) {
AddItemFactionBonus(item->FactionMod3, item->FactionAmt3);
}
else if (item->FactionAmt3 < 0 && item->FactionAmt3 < GetItemFactionBonus(item->FactionMod3)) {
AddItemFactionBonus(item->FactionMod3, item->FactionAmt3);
}
}
if (item->FactionMod4) {
if (item->FactionAmt4 > 0 && item->FactionAmt4 > GetItemFactionBonus(item->FactionMod4)) {
AddItemFactionBonus(item->FactionMod4, item->FactionAmt4);
}
else if (item->FactionAmt4 < 0 && item->FactionAmt4 < GetItemFactionBonus(item->FactionMod4)) {
AddItemFactionBonus(item->FactionMod4, item->FactionAmt4);
}
}
if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= HIGHEST_SKILL) {
if ((newbon->SkillDamageAmount[item->ExtraDmgSkill] + item->ExtraDmgAmt) >
RuleI(Character, ItemExtraDmgCap))
newbon->SkillDamageAmount[item->ExtraDmgSkill] = RuleI(Character, ItemExtraDmgCap);
else
newbon->SkillDamageAmount[item->ExtraDmgSkill] += item->ExtraDmgAmt;
}
} }
// Process when ammo_slot_item = true or false
if (item->SkillModValue != 0 && item->SkillModType <= HIGHEST_SKILL) { if (item->SkillModValue != 0 && item->SkillModType <= HIGHEST_SKILL) {
if ((item->SkillModValue > 0 && newbon->skillmod[item->SkillModType] < item->SkillModValue) || if ((item->SkillModValue > 0 && newbon->skillmod[item->SkillModType] < item->SkillModValue) ||
(item->SkillModValue < 0 && newbon->skillmod[item->SkillModType] > item->SkillModValue)) { (item->SkillModValue < 0 && newbon->skillmod[item->SkillModType] > item->SkillModValue)) {
newbon->skillmod[item->SkillModType] = item->SkillModValue; newbon->skillmod[item->SkillModType] = item->SkillModValue;
newbon->skillmodmax[item->SkillModType] = item->SkillModMax; newbon->skillmodmax[item->SkillModType] = item->SkillModMax;
} }
} }
// Add Item Faction Mods
if (item->FactionMod1) {
if (item->FactionAmt1 > 0 && item->FactionAmt1 > GetItemFactionBonus(item->FactionMod1)) {
AddItemFactionBonus(item->FactionMod1, item->FactionAmt1);
} else if (item->FactionAmt1 < 0 && item->FactionAmt1 < GetItemFactionBonus(item->FactionMod1)) {
AddItemFactionBonus(item->FactionMod1, item->FactionAmt1);
}
}
if (item->FactionMod2) {
if (item->FactionAmt2 > 0 && item->FactionAmt2 > GetItemFactionBonus(item->FactionMod2)) {
AddItemFactionBonus(item->FactionMod2, item->FactionAmt2);
} else if (item->FactionAmt2 < 0 && item->FactionAmt2 < GetItemFactionBonus(item->FactionMod2)) {
AddItemFactionBonus(item->FactionMod2, item->FactionAmt2);
}
}
if (item->FactionMod3) {
if (item->FactionAmt3 > 0 && item->FactionAmt3 > GetItemFactionBonus(item->FactionMod3)) {
AddItemFactionBonus(item->FactionMod3, item->FactionAmt3);
} else if (item->FactionAmt3 < 0 && item->FactionAmt3 < GetItemFactionBonus(item->FactionMod3)) {
AddItemFactionBonus(item->FactionMod3, item->FactionAmt3);
}
}
if (item->FactionMod4) {
if (item->FactionAmt4 > 0 && item->FactionAmt4 > GetItemFactionBonus(item->FactionMod4)) {
AddItemFactionBonus(item->FactionMod4, item->FactionAmt4);
} else if (item->FactionAmt4 < 0 && item->FactionAmt4 < GetItemFactionBonus(item->FactionMod4)) {
AddItemFactionBonus(item->FactionMod4, item->FactionAmt4);
}
}
if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= HIGHEST_SKILL) {
if ((newbon->SkillDamageAmount[item->ExtraDmgSkill] + item->ExtraDmgAmt) >
RuleI(Character, ItemExtraDmgCap))
newbon->SkillDamageAmount[item->ExtraDmgSkill] = RuleI(Character, ItemExtraDmgCap);
else
newbon->SkillDamageAmount[item->ExtraDmgSkill] += item->ExtraDmgAmt;
}
if (!isAug) { if (!isAug) {
for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++) for (int i = 0; i < EmuConstants::ITEM_COMMON_SIZE; i++)
AddItemBonuses(inst->GetAugment(i), newbon, true, false, rec_level); AddItemBonuses(inst->GetAugment(i), newbon, true, false, rec_level, ammo_slot_item);
} }
} }

View File

@ -1303,7 +1303,7 @@ public:
protected: protected:
friend class Mob; friend class Mob;
void CalcItemBonuses(StatBonuses* newbon); void CalcItemBonuses(StatBonuses* newbon);
void AddItemBonuses(const ItemInst *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0); void AddItemBonuses(const ItemInst *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0, bool ammo_slot_item = false);
void AdditiveWornBonuses(const ItemInst *inst, StatBonuses* newbon, bool isAug = false); void AdditiveWornBonuses(const ItemInst *inst, StatBonuses* newbon, bool isAug = false);
int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat); int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat);
void CalcEdibleBonuses(StatBonuses* newbon); void CalcEdibleBonuses(StatBonuses* newbon);