mirror of
https://github.com/mangosfour/server.git
synced 2025-12-23 16:37:03 +00:00
[12736] Implemented reforge, also added missing part for HandleObjectUpdateFailedOpcode
This commit is contained in:
parent
22e906cea5
commit
3490f642cf
17 changed files with 464 additions and 14 deletions
|
|
@ -12450,6 +12450,12 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
|
|||
if (slot >= MAX_ENCHANTMENT_SLOT)
|
||||
return;
|
||||
|
||||
if (slot == REFORGE_ENCHANTMENT_SLOT)
|
||||
{
|
||||
ApplyReforgeEnchantment(item, apply);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 enchant_id = item->GetEnchantmentId(slot);
|
||||
if (!enchant_id)
|
||||
return;
|
||||
|
|
@ -12741,6 +12747,240 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
|
|||
}
|
||||
}
|
||||
|
||||
void Player::ApplyReforgeEnchantment(Item* item, bool apply)
|
||||
{
|
||||
|
||||
if (!item)
|
||||
return;
|
||||
|
||||
ItemReforgeEntry const* reforge = sItemReforgeStore.LookupEntry(item->GetEnchantmentId(REFORGE_ENCHANTMENT_SLOT));
|
||||
if (!reforge)
|
||||
return;
|
||||
|
||||
float removeValue = item->GetReforgableStat(ItemModType(reforge->SourceStat)) * reforge->SourceMultiplier;
|
||||
|
||||
float addValue = removeValue * reforge->FinalMultiplier;
|
||||
|
||||
switch (reforge->SourceStat)
|
||||
{
|
||||
case ITEM_MOD_HEALTH:
|
||||
HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_AGILITY:
|
||||
HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, -removeValue, apply);
|
||||
ApplyStatBuffMod(STAT_AGILITY, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_STRENGTH:
|
||||
HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, -removeValue, apply);
|
||||
ApplyStatBuffMod(STAT_STRENGTH, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_INTELLECT:
|
||||
HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, -removeValue, apply);
|
||||
ApplyStatBuffMod(STAT_INTELLECT, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_SPIRIT:
|
||||
HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, -removeValue, apply);
|
||||
ApplyStatBuffMod(STAT_SPIRIT, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_STAMINA:
|
||||
HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, -removeValue, apply);
|
||||
ApplyStatBuffMod(STAT_STAMINA, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_DEFENSE_SKILL_RATING:
|
||||
ApplyRatingMod(CR_DEFENSE_SKILL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_DODGE_RATING:
|
||||
ApplyRatingMod(CR_DODGE, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_PARRY_RATING:
|
||||
ApplyRatingMod(CR_PARRY, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_BLOCK_RATING:
|
||||
ApplyRatingMod(CR_BLOCK, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_MELEE_RATING:
|
||||
ApplyRatingMod(CR_HIT_MELEE, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_RANGED_RATING:
|
||||
ApplyRatingMod(CR_HIT_RANGED, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_SPELL_RATING:
|
||||
ApplyRatingMod(CR_HIT_SPELL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_MELEE_RATING:
|
||||
ApplyRatingMod(CR_CRIT_MELEE, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_RANGED_RATING:
|
||||
ApplyRatingMod(CR_CRIT_RANGED, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_SPELL_RATING:
|
||||
ApplyRatingMod(CR_CRIT_SPELL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HASTE_SPELL_RATING:
|
||||
ApplyRatingMod(CR_HASTE_SPELL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_RATING:
|
||||
ApplyRatingMod(CR_HIT_MELEE, -int32(removeValue), apply);
|
||||
ApplyRatingMod(CR_HIT_RANGED, -int32(removeValue), apply);
|
||||
ApplyRatingMod(CR_HIT_SPELL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_RATING:
|
||||
ApplyRatingMod(CR_CRIT_MELEE, -int32(removeValue), apply);
|
||||
ApplyRatingMod(CR_CRIT_RANGED, -int32(removeValue), apply);
|
||||
ApplyRatingMod(CR_CRIT_SPELL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_RESILIENCE_RATING:
|
||||
ApplyRatingMod(CR_RESILIENCE_DAMAGE_TAKEN, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HASTE_RATING:
|
||||
ApplyRatingMod(CR_HASTE_MELEE, -int32(removeValue), apply);
|
||||
ApplyRatingMod(CR_HASTE_RANGED, -int32(removeValue), apply);
|
||||
ApplyRatingMod(CR_HASTE_SPELL, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_EXPERTISE_RATING:
|
||||
ApplyRatingMod(CR_EXPERTISE, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_ATTACK_POWER:
|
||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, -removeValue, apply);
|
||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_RANGED_ATTACK_POWER:
|
||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, -removeValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_MANA_REGENERATION:
|
||||
ApplyManaRegenBonus(-int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_ARMOR_PENETRATION_RATING:
|
||||
ApplyRatingMod(CR_ARMOR_PENETRATION, -int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_SPELL_POWER:
|
||||
ApplySpellPowerBonus(-int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HEALTH_REGEN:
|
||||
ApplyHealthRegenBonus(-int32(removeValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_SPELL_PENETRATION:
|
||||
ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, -int32(removeValue), apply);
|
||||
m_spellPenetrationItemMod += apply ? -int32(removeValue) : int32(removeValue);
|
||||
break;
|
||||
case ITEM_MOD_BLOCK_VALUE:
|
||||
break;
|
||||
case ITEM_MOD_MASTERY_RATING:
|
||||
ApplyRatingMod(CR_MASTERY, -int32(removeValue), apply);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
switch (reforge->FinalStat)
|
||||
{
|
||||
case ITEM_MOD_HEALTH:
|
||||
HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_AGILITY:
|
||||
HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, addValue, apply);
|
||||
ApplyStatBuffMod(STAT_AGILITY, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_STRENGTH:
|
||||
HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, addValue, apply);
|
||||
ApplyStatBuffMod(STAT_STRENGTH, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_INTELLECT:
|
||||
HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, addValue, apply);
|
||||
ApplyStatBuffMod(STAT_INTELLECT, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_SPIRIT:
|
||||
HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, addValue, apply);
|
||||
ApplyStatBuffMod(STAT_SPIRIT, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_STAMINA:
|
||||
HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, addValue, apply);
|
||||
ApplyStatBuffMod(STAT_STAMINA, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_DEFENSE_SKILL_RATING:
|
||||
ApplyRatingMod(CR_DEFENSE_SKILL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_DODGE_RATING:
|
||||
ApplyRatingMod(CR_DODGE, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_PARRY_RATING:
|
||||
ApplyRatingMod(CR_PARRY, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_BLOCK_RATING:
|
||||
ApplyRatingMod(CR_BLOCK, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_MELEE_RATING:
|
||||
ApplyRatingMod(CR_HIT_MELEE, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_RANGED_RATING:
|
||||
ApplyRatingMod(CR_HIT_RANGED, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_SPELL_RATING:
|
||||
ApplyRatingMod(CR_HIT_SPELL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_MELEE_RATING:
|
||||
ApplyRatingMod(CR_CRIT_MELEE, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_RANGED_RATING:
|
||||
ApplyRatingMod(CR_CRIT_RANGED, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_SPELL_RATING:
|
||||
ApplyRatingMod(CR_CRIT_SPELL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HASTE_SPELL_RATING:
|
||||
ApplyRatingMod(CR_HASTE_SPELL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HIT_RATING:
|
||||
ApplyRatingMod(CR_HIT_MELEE, int32(addValue), apply);
|
||||
ApplyRatingMod(CR_HIT_RANGED, int32(addValue), apply);
|
||||
ApplyRatingMod(CR_HIT_SPELL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_CRIT_RATING:
|
||||
ApplyRatingMod(CR_CRIT_MELEE, int32(addValue), apply);
|
||||
ApplyRatingMod(CR_CRIT_RANGED, int32(addValue), apply);
|
||||
ApplyRatingMod(CR_CRIT_SPELL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_RESILIENCE_RATING:
|
||||
ApplyRatingMod(CR_RESILIENCE_DAMAGE_TAKEN, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HASTE_RATING:
|
||||
ApplyRatingMod(CR_HASTE_MELEE, int32(addValue), apply);
|
||||
ApplyRatingMod(CR_HASTE_RANGED, int32(addValue), apply);
|
||||
ApplyRatingMod(CR_HASTE_SPELL, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_EXPERTISE_RATING:
|
||||
ApplyRatingMod(CR_EXPERTISE, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_ATTACK_POWER:
|
||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, addValue, apply);
|
||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_RANGED_ATTACK_POWER:
|
||||
HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, addValue, apply);
|
||||
break;
|
||||
case ITEM_MOD_MANA_REGENERATION:
|
||||
ApplyManaRegenBonus(int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_ARMOR_PENETRATION_RATING:
|
||||
ApplyRatingMod(CR_ARMOR_PENETRATION, int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_SPELL_POWER:
|
||||
ApplySpellPowerBonus(int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_HEALTH_REGEN:
|
||||
ApplyHealthRegenBonus(int32(addValue), apply);
|
||||
break;
|
||||
case ITEM_MOD_SPELL_PENETRATION:
|
||||
ApplyModInt32Value(PLAYER_FIELD_MOD_TARGET_RESISTANCE, int32(addValue), apply);
|
||||
m_spellPenetrationItemMod += apply ? int32(addValue) : -int32(addValue);
|
||||
break;
|
||||
case ITEM_MOD_BLOCK_VALUE:
|
||||
break;
|
||||
case ITEM_MOD_MASTERY_RATING:
|
||||
ApplyRatingMod(CR_MASTERY, int32(addValue), apply);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::SendEnchantmentDurations()
|
||||
{
|
||||
for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue