Index: scripts/globals/magic.lua =================================================================== --- scripts/globals/magic.lua (revision 3763) +++ scripts/globals/magic.lua (working copy) @@ -537,6 +537,7 @@ --handling stoneskin dmg = utils.stoneskin(target, dmg); + utils.dmgToMP(target, dmg); target:delHP(dmg); target:updateEnmityFromDamage(caster,dmg); Index: scripts/globals/monstertpmoves.lua =================================================================== --- scripts/globals/monstertpmoves.lua (revision 3763) +++ scripts/globals/monstertpmoves.lua (working copy) @@ -653,6 +653,7 @@ end dmg = utils.stoneskin(target, dmg); + utils.dmgToMP(target, dmg); if(dmg > 0) then target:wakeUp(); Index: scripts/globals/utils.lua =================================================================== --- scripts/globals/utils.lua (revision 3763) +++ scripts/globals/utils.lua (working copy) @@ -109,6 +109,30 @@ return dmg * resist; end; +function utils.dmgToMP(target, dmg) + + if(target:getObjType() == TYPE_PC) then + local etherealMP = 0; + local percentMP = 0; + if(target:getEquipID(SLOT_EAR1) == 15965 or target:getEquipID(SLOT_EAR2) == 15965) then -- Ethereal Earring + percentMP = percentMP + .03; + end + if(target:getEquipID(SLOT_HEAD) == 11170) then -- Creed Armet +1 + percentMP = percentMP + .03; + end + if(target:getEquipID(SLOT_HEAD) == 11070) then -- Creed Armet +2 + percentMP = percentMP + .03; + end + etherealMP = math.floor(dmg * percentMP); + target:addMP(etherealMP); + if(etherealMP > 0) then + target:messageBasic(25,0,etherealMP); + end + -- printf("MP Gained %u",etherealMP); + end + +end; + function utils.breathDmgTaken(target, breathDmg) local resist = 1 + (target:getMod(MOD_UDMGBREATH) / 100); Index: scripts/globals/weaponskills.lua =================================================================== --- scripts/globals/weaponskills.lua (revision 3763) +++ scripts/globals/weaponskills.lua (working copy) @@ -195,6 +195,7 @@ if(target:hasStatusEffect(EFFECT_FORMLESS_STRIKES) == false) then utils.dmgTaken(target, finaldmg); utils.physicalDmgTaken(target, finaldmg); + utils.dmgToMP(target, finaldmg); end attacker:delStatusEffectSilent(EFFECT_BUILDING_FLOURISH); return finaldmg, criticalHit, tpHitsLanded, extraHitsLanded; @@ -683,6 +684,7 @@ utils.dmgTaken(target, finaldmg); utils.rangedDmgTaken(target, finaldmg); + utils.dmgToMP(target, finaldmg); return finaldmg, tpHitsLanded, extraHitsLanded; end; Index: src/map/ai/ai_mob_dummy.cpp =================================================================== --- src/map/ai/ai_mob_dummy.cpp (revision 3768) +++ src/map/ai/ai_mob_dummy.cpp (working copy) @@ -1596,6 +1596,14 @@ if (m_PBattleTarget->objtype == TYPE_PC) { damage = battleutils::HandleSpecialPhysicalDamageReduction((CCharEntity*)m_PBattleTarget,damage,&Action); + uint16 recoverMP = battleutils::HandleDamageToMP((CCharEntity*)m_PBattleTarget,damage,&Action); + if (recoverMP > 0) + { + // ShowDebug(CL_CYAN"Damage to MP %d", recoverMP); + m_PBattleTarget->addMP(recoverMP); + m_PBattleTarget->loc.zone->PushPacket(m_PBattleTarget,CHAR_INRANGE_SELF, new CMessageBasicPacket(m_PBattleTarget,m_PBattleTarget,0,recoverMP, 276)); + charutils::UpdateHealth((CCharEntity*)m_PBattleTarget); + } } Action.param = battleutils::TakePhysicalDamage(m_PMob, m_PBattleTarget, damage, isBlocked ,SLOT_MAIN, 1, NULL, true); Index: src/map/battleutils.cpp =================================================================== --- src/map/battleutils.cpp (revision 3768) +++ src/map/battleutils.cpp (working copy) @@ -505,6 +505,107 @@ } +uint32 HandleDamageToMP(CCharEntity* PChar, uint32 damage, apAction_t* Action) +{ + // check for gear + CItemArmor* PEarring1 = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_EAR1]); + CItemArmor* PEarring2 = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_EAR2]); + CItemArmor* PWaist = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_WAIST]); + CItemArmor* PHead = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_HEAD]); + CItemArmor* PBody = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_BODY]); + + uint32 damageToMP = 0; + if(PEarring1 != NULL) + { + switch(PEarring1->getID()) + { + //Ethereal Earring + case 15965: + damageToMP = damage * .03; + break; + + + default: + break; + } + } + if(PEarring2 != NULL) + { + switch(PEarring2->getID()) + { + //Ethereal Earring + case 15965: + damageToMP = damage * .03; + break; + + + default: + break; + } + } + if(PBody != NULL) + { + switch(PBody->getID()) + { + //Valor Surcoat + case 15093: + //Valor Surcoat +1 + case 14506: + if(PChar->StatusEffectContainer->HasStatusEffect(EFFECT_COVER)) + { + damageToMP = damage * .2; + break; + } + + //Valor Surcoat +2 + case 10676: + if(PChar->StatusEffectContainer->HasStatusEffect(EFFECT_COVER)) + { + damageToMP = damage * .3; + break; + } + + default: + break; + } + } + if(PWaist != NULL) + { + switch(PWaist->getID()) + { + //Flume Belt + case 10819: + damageToMP = damage * .02; + break; + + + default: + break; + } + } + if(PHead != NULL) + { + switch(PHead->getID()) + { + //Creed Armet +1 + case 11170: + damageToMP = damage * .03; + break; + + //Creed Armet +1 + case 11070: + damageToMP = damage * .05; + break; + + default: + break; + } + } + + return damageToMP; + +} + uint16 CalculateSpikeDamage(CBattleEntity* PAttacker, CBattleEntity* PDefender, uint8 spikesType, uint16 damageTaken) { uint16 damage = PDefender->getMod(MOD_SPIKES_DMG); Index: src/map/battleutils.h =================================================================== --- src/map/battleutils.h (revision 3768) +++ src/map/battleutils.h (working copy) @@ -149,6 +149,7 @@ CItemArmor* GetEntityArmor(CBattleEntity* PEntity, SLOTTYPE Slot); uint32 HandleSpecialPhysicalDamageReduction(CCharEntity* PAttacker, uint32 damage, apAction_t* Action); + uint32 HandleDamageToMP(CCharEntity* PAttacker, uint32 damage, apAction_t* Action); void MakeEntityStandUp(CBattleEntity* PEntity); bool IsEngauged(CBattleEntity* PEntity); CBattleEntity* getAvailableTrickAttackChar(CBattleEntity* taUser, CBattleEntity* PMob);