bool CItem::CanUsedBy(LPCHARACTER ch) { // Anti flag check switch (ch->GetJob()) { case JOB_WARRIOR: if (GetAntiFlag() & ITEM_ANTIFLAG_WARRIOR) return false; break; case JOB_ASSASSIN: if (GetAntiFlag() & ITEM_ANTIFLAG_ASSASSIN) return false; break; case JOB_SHAMAN: if (GetAntiFlag() & ITEM_ANTIFLAG_SHAMAN) return false; break; case JOB_SURA: if (GetAntiFlag() & ITEM_ANTIFLAG_SURA) return false; break; } return true; }
int CalcAttBonus(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, int iAtk) { // PvP에는 적용하지않음 if (!pkVictim->IsPC()) iAtk += pkAttacker->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_ATTACK_BONUS); // PvP에는 적용하지않음 if (!pkAttacker->IsPC()) { int iReduceDamagePct = pkVictim->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_TRANSFER_DAMAGE); iAtk = iAtk * (100 + iReduceDamagePct) / 100; } if (pkAttacker->IsNPC() && pkVictim->IsPC()) { iAtk = (iAtk * CHARACTER_MANAGER::instance().GetMobDamageRate(pkAttacker)) / 100; } if (pkVictim->IsNPC()) { if (pkVictim->IsRaceFlag(RACE_FLAG_ANIMAL)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ANIMAL)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_UNDEAD)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_UNDEAD)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_DEVIL)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DEVIL)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_HUMAN)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_HUMAN)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_ORC)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ORC)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_MILGYO)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_MILGYO)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_INSECT)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_INSECT)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_FIRE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_FIRE)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_ICE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ICE)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_DESERT)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DESERT)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_TREE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_TREE)) / 100; iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_MONSTER)) / 100; } else if (pkVictim->IsPC()) { iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_HUMAN)) / 100; switch (pkVictim->GetJob()) { case JOB_WARRIOR: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_WARRIOR)) / 100; break; case JOB_ASSASSIN: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ASSASSIN)) / 100; break; case JOB_SURA: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_SURA)) / 100; break; case JOB_SHAMAN: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_SHAMAN)) / 100; break; } } if (pkAttacker->IsPC() == true) { switch (pkAttacker->GetJob()) { case JOB_WARRIOR: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_WARRIOR)) / 100; break; case JOB_ASSASSIN: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_ASSASSIN)) / 100; break; case JOB_SURA: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SURA)) / 100; break; case JOB_SHAMAN: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SHAMAN)) / 100; break; } } //[ mob -> PC ] 원소 속성 방어 적용 //2013/01/17 //몬스터 속성공격 데미지의 30%에 해당하는 수치에만 저항이 적용됨. if (pkAttacker->IsNPC() && pkVictim->IsPC()) { if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ELEC)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ELEC)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_FIRE)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_FIRE)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ICE)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ICE)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_WIND)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_WIND)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_EARTH)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_EARTH)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_DARK)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_DARK)) / 10000; } return iAtk; }
int CalcAttBonus(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, int iAtk) { // PvPїЎґВ АыїлЗПБцѕКАЅ if (!pkVictim->IsPC()) iAtk += pkAttacker->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_ATTACK_BONUS); // PvPїЎґВ АыїлЗПБцѕКАЅ if (!pkAttacker->IsPC()) { int iReduceDamagePct = pkVictim->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_TRANSFER_DAMAGE); iAtk = iAtk * (100 + iReduceDamagePct) / 100; } if (pkAttacker->IsNPC() && pkVictim->IsPC()) { iAtk = (iAtk * CHARACTER_MANAGER::instance().GetMobDamageRate(pkAttacker)) / 100; } if (pkVictim->IsNPC()) { if (pkVictim->IsRaceFlag(RACE_FLAG_ANIMAL)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ANIMAL)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_UNDEAD)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_UNDEAD)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_DEVIL)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DEVIL)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_HUMAN)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_HUMAN)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_ORC)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ORC)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_MILGYO)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_MILGYO)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_INSECT)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_INSECT)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_FIRE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_FIRE)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_ICE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ICE)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_DESERT)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_DESERT)) / 100; else if (pkVictim->IsRaceFlag(RACE_FLAG_TREE)) iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_TREE)) / 100; iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_MONSTER)) / 100; } else if (pkVictim->IsPC()) { iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_HUMAN)) / 100; switch (pkVictim->GetJob()) { case JOB_WARRIOR: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_WARRIOR)) / 100; break; case JOB_ASSASSIN: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_ASSASSIN)) / 100; break; case JOB_SURA: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_SURA)) / 100; break; case JOB_SHAMAN: iAtk += (iAtk * pkAttacker->GetPoint(POINT_ATTBONUS_SHAMAN)) / 100; break; } } if (pkAttacker->IsPC() == true) { switch (pkAttacker->GetJob()) { case JOB_WARRIOR: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_WARRIOR)) / 100; break; case JOB_ASSASSIN: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_ASSASSIN)) / 100; break; case JOB_SURA: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SURA)) / 100; break; case JOB_SHAMAN: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SHAMAN)) / 100; break; } } //[ mob -> PC ] їшјТ јУјє №жѕо Аыїл //2013/01/17 //ёуЅєЕН јУјє°ш°Э µҐ№МБцАЗ 30%їЎ ЗШґзЗПґВ јцДЎїЎёё АъЗЧАМ АыїлµК. if (pkAttacker->IsNPC() && pkVictim->IsPC()) { if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ELEC)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ELEC)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_FIRE)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_FIRE)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_ICE)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_ICE)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_WIND)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_WIND)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_EARTH)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_EARTH)) / 10000; else if (pkAttacker->IsRaceFlag(RACE_FLAG_ATT_DARK)) iAtk -= (iAtk * 30 * pkVictim->GetPoint(POINT_RESIST_DARK)) / 10000; } return iAtk; }