int vMover::GetMaxOriginFatiguePoint( bool bOriginal ) { int nSta, nStr, nDex; if( bOriginal ) { nSta = m_nSta; nStr = m_nStr; nDex = m_nDex; } else { nSta = GetSta(); nStr = GetStr(); nDex = GetDex(); } if( IsPlayer() ) { JobProp* pProperty = g_prj.GetJobProp( GetJob() ); float factor = pProperty->fFactorMaxFP; return (int)( (((GetLevel()*2.0f) + (nSta*6.0f))*factor) + (nSta*factor) ); } return ( ( GetLevel() * 2 ) + ( nStr * 7 ) + ( nSta *2 ) + ( nDex * 4 ) ); }
bool CClient::CanSkillUp(skillIndexes skillindex) { int currentskill = m_cSkillMastery[skillindex]; currentskill++; switch (skillindex) { case SKILL_MINING: case SKILL_HANDATTACK: case SKILL_MANUFACTURING: // limit: 2*str if (currentskill > (GetStr() * 2)) { return false; } break; case SKILL_MAGICRES: // limit: 2*lvl if (currentskill > (GetLevel() * 2)) { return false; } break; case SKILL_MAGIC: case SKILL_STAFF: // limit: 2*mag if (currentskill > (GetMag() * 2)) { return false; } break; case SKILL_FISHING: case SKILL_ARCHERY: case SKILL_SHORTSWORD: case SKILL_LONGSWORD: case SKILL_FENCING: case SKILL_AXE: case SKILL_SHIELD: case SKILL_HAMMER: // limit: 2*dex if (currentskill > (GetDex() * 2)) { return false; } break; case SKILL_FARMING: case SKILL_ALCHEMY: case SKILL_15: case SKILL_PRETENDCORPSE: // limit: 2*int if (currentskill > (GetInt() * 2)) { return false; } break; case SKILL_POISONRES: // limit: 2*vit if (currentskill > (GetVit() * 2)) { return false; } break; } return true; }
void CClient::ValidateSkills(bool logInvalidSkills) { if(IsGM()) return; int invalidSkills = 0; char logMessage[100]; for (int skillIndex = 0; skillIndex < MAXSKILLTYPE; skillIndex++) { switch (skillIndex) { case SKILL_MINING: case SKILL_MANUFACTURING: case SKILL_HANDATTACK: if (m_cSkillMastery[skillIndex] > (GetStr() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetStr() * 2); m_cSkillMastery[skillIndex] = GetStr() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_MAGICRES: if (m_cSkillMastery[skillIndex] > (m_iLevel * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (m_iLevel * 2); m_cSkillMastery[skillIndex] = m_iLevel * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_MAGIC: case SKILL_STAFF: if (m_cSkillMastery[skillIndex] > (GetMag() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetMag() * 2); m_cSkillMastery[skillIndex] = GetMag() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_FISHING: case SKILL_ARCHERY: case SKILL_SHORTSWORD: case SKILL_LONGSWORD: case SKILL_FENCING: case SKILL_AXE: case SKILL_SHIELD: case SKILL_HAMMER: if (m_cSkillMastery[skillIndex] > (GetDex() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetDex() * 2); m_cSkillMastery[skillIndex] = GetDex() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_ALCHEMY: case SKILL_FARMING: case SKILL_PRETENDCORPSE: if (m_cSkillMastery[skillIndex] > (GetInt() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetInt() * 2); m_cSkillMastery[skillIndex] = GetInt() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_POISONRES: if (m_cSkillMastery[skillIndex] > (GetVit() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetVit() * 2); m_cSkillMastery[skillIndex] = GetVit() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; default: m_iSkillSSN[skillIndex] = 0; break; } } if(logInvalidSkills && (invalidSkills > 0)) { wsprintf(logMessage, "PC(%s) A skill was too high, reduced by (%d) points", m_cCharName, invalidSkills); PutLogList(logMessage); } }