void CCalCharacter::gObjCalCharacter(int aIndex) { LPOBJ lpObj = &gObj[aIndex]; int Strength = 0; int Dexterity = 0; int Vitality = 0; int Energy = 0; int Leadership = 0; // ---- CItem * Right = &lpObj->pInventory[0]; CItem * Left = &lpObj->pInventory[1]; CItem * Helm = &lpObj->pInventory[2]; CItem * Armor = &lpObj->pInventory[3]; CItem * Pants = &lpObj->pInventory[4]; CItem * Gloves = &lpObj->pInventory[5]; CItem * Boots = &lpObj->pInventory[6]; CItem * Wings = &lpObj->pInventory[7]; CItem * Helper = &lpObj->pInventory[8]; CItem * Amulet = &lpObj->pInventory[9]; CItem * Ring01 = &lpObj->pInventory[10]; CItem * Ring02 = &lpObj->pInventory[11]; lpObj->HaveWeaponInHand = true; // ------------------------------------------------------- // Check Weapon in hand // ------------------------------------------------------- if ( Right->IsItem() == false && Left->IsItem() == false ) { lpObj->HaveWeaponInHand = false; } else if ( Left->IsItem() == false && Right->m_Type == ITEMGET(4,15) ) // Arrow { lpObj->HaveWeaponInHand = false; } else if ( Right->IsItem() == false ) { int iType = Left->m_Type / MAX_SUBTYPE_ITEMS; if ( Left->m_Type == ITEMGET(4,7) ) // Bolt { lpObj->HaveWeaponInHand = false; } else if ( iType == 6 ) // Shield { lpObj->HaveWeaponInHand = false; } } // ------------------------------------------------------- lpObj->AddLife = 0; lpObj->AddMana = 0; lpObj->MonsterDieGetMoney = 0; lpObj->MonsterDieGetLife = 0; lpObj->MonsterDieGetMana = 0; lpObj->DamageReflect = 0; lpObj->DamageMinus = 0; lpObj->SkillLongSpearChange = false; if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.PrevSetItemLastEffectForHallowin(lpObj); } int iItemIndex; BOOL bIsChangeItem; // lc34 for ( iItemIndex=0; iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } } do { lpObj->SetOpAddMaxAttackDamage = 0; lpObj->SetOpAddMinAttackDamage = 0; lpObj->SetOpAddDamage = 0; lpObj->SetOpIncAGValue = 0; lpObj->SetOpAddCriticalDamageSuccessRate = 0; lpObj->SetOpAddCriticalDamage = 0; lpObj->SetOpAddExDamageSuccessRate = 0; lpObj->SetOpAddExDamage = 0; lpObj->SetOpAddSkillAttack = 0; lpObj->AddStrength = 0; lpObj->AddDexterity = 0; lpObj->AddVitality = 0; lpObj->AddEnergy = 0; lpObj->AddBP = 0; lpObj->iAddShield = 0; lpObj->SetOpAddAttackDamage = 0; lpObj->SetOpAddDefence = 0; lpObj->SetOpAddMagicPower = 0; lpObj->SetOpAddDefenceRate = 0; lpObj->SetOpIgnoreDefense = 0; lpObj->SetOpDoubleDamage = 0; lpObj->SetOpTwoHandSwordImproveDamage = 0; lpObj->SetOpImproveSuccessAttackRate = 0; lpObj->SetOpReflectionDamage = 0; lpObj->SetOpImproveSheldDefence = 0; lpObj->SetOpDecreaseAG = 0; lpObj->SetOpImproveItemDropRate = 0; lpObj->IsFullSetItem = false; memset(lpObj->m_AddResistance, 0, sizeof(lpObj->m_AddResistance)); bIsChangeItem = 0; gObjCalcSetItemStat(lpObj); gObjCalcSetItemOption(lpObj); for (iItemIndex=0;iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE && lpObj->pInventory[iItemIndex].m_IsValidItem != false ) { if ( gObjValidItem( lpObj, &lpObj->pInventory[iItemIndex], iItemIndex) != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } else { lpObj->pInventory[iItemIndex].m_IsValidItem = false; bIsChangeItem = TRUE; } } } } while ( bIsChangeItem != FALSE ); Strength = lpObj->Strength + lpObj->AddStrength; Dexterity = lpObj->Dexterity + lpObj->AddDexterity; Vitality = lpObj->Vitality + lpObj->AddVitality; Energy = lpObj->Energy + lpObj->AddEnergy; Leadership = lpObj->Leadership + lpObj->AddLeadership; switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_AttackDamageMinRight = (Strength / 8); lpObj->m_AttackDamageMaxRight = (Strength / 4); lpObj->m_AttackDamageMinLeft = (Strength / 8); lpObj->m_AttackDamageMaxLeft = (Strength / 4); break; case CLASS_KNIGHT: lpObj->m_AttackDamageMinRight = Strength / 6; lpObj->m_AttackDamageMaxRight = Strength / 4; lpObj->m_AttackDamageMinLeft = Strength / 6; lpObj->m_AttackDamageMaxLeft = Strength / 4; break; case CLASS_ELF: if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7)) || Right->m_Type == ITEMGET(4,16) || Left->m_Type == ITEMGET(4,17) || Right->m_Type == ITEMGET(4,18) || Right->m_Type == ITEMGET(4,19) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Left->m_Type == ITEMGET(4,22) || Left->m_Type == ITEMGET(4,23) || Left->m_Type == ITEMGET(4,24) ) { if ( (Right->IsItem() != FALSE && Right->m_IsValidItem == false) || (Left->IsItem() != FALSE && Left->m_IsValidItem == false) ) { lpObj->m_AttackDamageMinRight = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength ) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength ) / 4; } else { lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 8 ); lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 8 ); } } else { lpObj->m_AttackDamageMinRight = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength) / 4; } break; case CLASS_MAGUMSA: lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); break; case CLASS_DARKLORD: lpObj->m_AttackDamageMinRight = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxRight = (Strength / 5) + (Energy / 10); lpObj->m_AttackDamageMinLeft = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxLeft = (Strength / 5) + (Energy / 10); break; case CLASS_SUMMONER: lpObj->m_AttackDamageMinRight = (Strength / 8) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 8) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); break; case CLASS_FIGHTER: lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); break; } if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false ) { Wings->PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); Wings->PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); Wings->PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); Wings->PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); } int AddLeadership = 0; if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false) { AddLeadership += Wings->m_Leadership; } if ( Right->m_Type != -1 ) { if ( Right->m_IsValidItem != false ) { if ( Right->m_Type >= ITEMGET(5,0) && Right->m_Type <= ITEMGET(6,0) ) // Check this { lpObj->m_AttackDamageMinRight += Right->m_DamageMin / 2; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax / 2; } else { lpObj->m_AttackDamageMinRight += Right->m_DamageMin; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax; } } if ( Right->m_SkillChange != FALSE ) { lpObj->SkillLongSpearChange = true; } Right->PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); Right->PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false) { lpObj->m_AttackDamageMinLeft += Left->m_DamageMin; lpObj->m_AttackDamageMaxLeft += Left->m_DamageMax; } Left->PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); Left->PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); } lpObj->m_CriticalDamage = 0; lpObj->m_ExcelentDamage = 0; if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false ) { Wings->PlusSpecial(&lpObj->m_MagicDamageMin, 81); Wings->PlusSpecial(&lpObj->m_MagicDamageMax, 81); Wings->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Right->IsItem() != FALSE && Right->m_IsValidItem != false ) { Right->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Left->IsItem() != FALSE && Left->m_IsValidItem != false ) { Left->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Helm->IsItem() != FALSE && Helm->m_IsValidItem != false ) { Helm->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Armor->IsItem() != FALSE && Armor->m_IsValidItem != false ) { Armor->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Pants->IsItem() != FALSE && Pants->m_IsValidItem != false ) { Pants->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Gloves->IsItem() != FALSE && Gloves->m_IsValidItem != false ) { Gloves->PlusSpecial(&lpObj->m_CriticalDamage, 84); } if ( Boots->IsItem() != FALSE && Boots->m_IsValidItem != false ) { Boots->PlusSpecial(&lpObj->m_CriticalDamage, 84); } lpObj->m_MagicDamageMin = Energy / 9; lpObj->m_MagicDamageMax = Energy / 4; if ( Right->m_Type != -1 ) { if ( Right->m_Type == ITEMGET(0,31) || Right->m_Type == ITEMGET(0,21) || Right->m_Type == ITEMGET(0,23) || Right->m_Type == ITEMGET(0,25) || Right->m_Type == ITEMGET(0,28) ) { Right->PlusSpecial(&lpObj->m_MagicDamageMin, 80); Right->PlusSpecial(&lpObj->m_MagicDamageMax, 80); } else { Right->PlusSpecial(&lpObj->m_MagicDamageMin, 81); Right->PlusSpecial(&lpObj->m_MagicDamageMax, 81); } } lpObj->m_AttackRating = (Strength + Dexterity) / 2; if (lpObj->Class != CLASS_FIGHTER) // Rage Fighter - No Gloves { if ( Gloves->IsItem() != FALSE && Gloves->m_IsValidItem != false ) { lpObj->m_AttackRating += Gloves->ItemDefense(); } } // ---------------------------------------- // Attack Speed // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_AttackSpeed = Dexterity / 20; lpObj->m_MagicSpeed = Dexterity / 10; break; case CLASS_KNIGHT: lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; break; case CLASS_ELF: lpObj->m_AttackSpeed = Dexterity / 50; lpObj->m_MagicSpeed = Dexterity / 50; break; case CLASS_MAGUMSA: lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; break; case CLASS_DARKLORD: lpObj->m_AttackSpeed = Dexterity / 10; lpObj->m_MagicSpeed = Dexterity / 10; break; case CLASS_SUMMONER: lpObj->m_AttackSpeed = Dexterity / 20; lpObj->m_MagicSpeed = Dexterity / 20; break; case CLASS_FIGHTER: lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; break; } bool bRight = false; bool bLeft = false; // ---------------------------------------- // Check if have weapon in Right Hand // ---------------------------------------- if ( Right->m_Type != ITEMGET(4,7) && Right->m_Type != ITEMGET(4,15) && Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(6,0) ) { if ( Right->m_IsValidItem != false ) { bRight = true; } } // ---------------------------------------- // Check if have weapon in Left Hand // ---------------------------------------- if ( Left->m_Type != ITEMGET(4,7) && Left->m_Type != ITEMGET(4,15) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(6,0) ) { if ( Left->m_IsValidItem != false ) { bLeft = true; } } if ( bRight != false && bLeft != false ) { lpObj->m_AttackSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; lpObj->m_MagicSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; } else if ( bRight!= false ) { lpObj->m_AttackSpeed += Right->m_AttackSpeed; lpObj->m_MagicSpeed += Right->m_AttackSpeed; } else if ( bLeft != false ) { lpObj->m_AttackSpeed += Left->m_AttackSpeed; lpObj->m_MagicSpeed += Left->m_AttackSpeed; } if ( lpObj->Class != CLASS_FIGHTER ) // Rage Fighter - No Gloves { if ( Gloves->m_Type != -1 ) { if ( Gloves->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Gloves->m_AttackSpeed; lpObj->m_MagicSpeed += Gloves->m_AttackSpeed; } } } if ( Amulet->m_Type != -1 ) // Pendant { if ( Amulet->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Amulet->m_AttackSpeed; lpObj->m_MagicSpeed += Amulet->m_AttackSpeed; } } // ---------------------------------------- // Wizard Ring Effect // ---------------------------------------- if ( (lpObj->pInventory[10].IsItem() == TRUE && lpObj->pInventory[10].m_Type == ITEMGET(13,20) && lpObj->pInventory[10].m_Level == 0 && lpObj->pInventory[10].m_Durability > 0.0f ) || (lpObj->pInventory[11].IsItem() == TRUE && lpObj->pInventory[11].m_Type == ITEMGET(13,20) && lpObj->pInventory[11].m_Level == 0 && lpObj->pInventory[11].m_Durability > 0.0f ) ) { lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 10 / 100; lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 10 / 100; lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 10 / 100; lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 10 / 100; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 10 / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 10 / 100; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } // ---------------------------------------- // Speed Hack Detect // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); break; case CLASS_KNIGHT: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_ELF: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_MAGUMSA: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_DARKLORD: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); break; case CLASS_SUMMONER: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); break; case CLASS_FIGHTER: lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); break; } if ( lpObj->m_DetectSpeedHackTime < gMinimumAttackSpeedTime ) { lpObj->m_DetectSpeedHackTime = gMinimumAttackSpeedTime; } // ---------------------------------------- // Successful Blocking // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_KNIGHT: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_ELF: lpObj->m_SuccessfulBlocking = Dexterity / 4; break; case CLASS_MAGUMSA: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_DARKLORD: lpObj->m_SuccessfulBlocking = Dexterity / 7; break; case CLASS_SUMMONER: lpObj->m_SuccessfulBlocking = Dexterity / 3; break; case CLASS_FIGHTER: lpObj->m_SuccessfulBlocking = Dexterity / 5; break; } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false ) { lpObj->m_SuccessfulBlocking += Left->m_SuccessfulBlocking; Left->PlusSpecial(&lpObj->m_SuccessfulBlocking, 82); } } // ---------------------------------------- // Character Set & Succesful Blocking // ---------------------------------------- bool Success = true; if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helmet) { for ( int j=3;j<=6;j++) { if ( lpObj->pInventory[j].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[j].m_IsValidItem == false ) { Success = false; break; } } } else if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves) { for ( int l=2;l<6;l++) { if ( l != 5 ) { if ( lpObj->pInventory[l].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[l].m_IsValidItem == false ) { Success = false; break; } } } } else // Dark Wizard, Dark Knight, Dark Lord, Elf, Summoner (All Set) { for ( int k=2;k<=6;k++) { if ( lpObj->pInventory[k].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[k].m_IsValidItem == false ) { Success = false; break; } } } int Level11Count = 0; int Level10Count = 0; int Level12Count = 0; int Level13Count = 0; int Level14Count = 0; int Level15Count = 0; if ( Success != false ) { int in; if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helmet) { in = Armor->m_Type % MAX_SUBTYPE_ITEMS; if ( in != ITEMGET(0,15) && in != ITEMGET(0,20) && in != ITEMGET(0,23) && in != ITEMGET(0,32) && in != ITEMGET(0,37) ) { Success = false; } else { Level15Count++; for (int m=3;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14 ) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13 ) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } } if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves) { in = Boots->m_Type % MAX_SUBTYPE_ITEMS; if ( in != ITEMGET(0,59) && in != ITEMGET(0,60) && in != ITEMGET(0,61) ) { Success = false; } else { Level15Count++; for (int m=2;m<=6;m++) { if (m != 5) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14 ) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13 ) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } } } else // Dark Knight, Dark Wizard, Elf, Dark Lord, Summoner (All Set) { in = lpObj->pInventory[2].m_Type % MAX_SUBTYPE_ITEMS; for (int m=2;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14 ) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13 ) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } if ( Success != false ) // #warning unuseful if { lpObj->m_SuccessfulBlocking += lpObj->m_SuccessfulBlocking / 10; } } // ---------------------------------------- // Character Defense // ---------------------------------------- switch ( lpObj->Class ) { case CLASS_WIZARD: lpObj->m_Defense = Dexterity / 4; break; case CLASS_KNIGHT: lpObj->m_Defense = Dexterity / 3; break; case CLASS_ELF: lpObj->m_Defense = Dexterity / 10; break; case CLASS_MAGUMSA: lpObj->m_Defense = Dexterity / 4; break; case CLASS_DARKLORD: lpObj->m_Defense = Dexterity / 7; break; case CLASS_SUMMONER: lpObj->m_Defense = Dexterity / 4; break; case CLASS_FIGHTER: lpObj->m_Defense = Dexterity / 4; break; } if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helm) { lpObj->m_Defense += Armor->ItemDefense(); lpObj->m_Defense += Pants->ItemDefense(); lpObj->m_Defense += Gloves->ItemDefense(); lpObj->m_Defense += Boots->ItemDefense(); lpObj->m_Defense += Left->ItemDefense(); lpObj->m_Defense += Wings->ItemDefense(); } else if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves) { lpObj->m_Defense += Helm->ItemDefense(); lpObj->m_Defense += Armor->ItemDefense(); lpObj->m_Defense += Pants->ItemDefense(); lpObj->m_Defense += Boots->ItemDefense(); lpObj->m_Defense += Left->ItemDefense(); lpObj->m_Defense += Wings->ItemDefense(); } else // Dark Wizard, Dark Knight, Elf, Dark Lord, Summoner (All Set) { lpObj->m_Defense += Helm->ItemDefense(); lpObj->m_Defense += Armor->ItemDefense(); lpObj->m_Defense += Pants->ItemDefense(); lpObj->m_Defense += Gloves->ItemDefense(); lpObj->m_Defense += Boots->ItemDefense(); lpObj->m_Defense += Left->ItemDefense(); lpObj->m_Defense += Wings->ItemDefense(); } if ( Helper->IsItem() != FALSE ) { if ( Helper->m_Type == ITEMGET(13,4) && Helper->m_Durability > 0.0f ) // Dark Horse { lpObj->m_Defense += INT( Dexterity / 20 + 5 + Helper->m_PetItem_Level * 2 ); } } if ( (Level15Count + Level14Count + Level13Count + Level12Count + Level11Count + Level10Count) >= 5 ) { if ( Success != false ) { if ( Level15Count == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 30 / 100; } else if ( Level14Count == 5 || (Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 25 / 100; } else if ( Level13Count == 5 || (Level13Count + Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 20 / 100; } else if ( Level12Count == 5 || (Level12Count + Level13Count + Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 15 / 100; } else if ( Level11Count == 5 || (Level11Count + Level12Count + Level13Count + Level14Count + Level15Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 10 / 100; } else if ( Level10Count == 5 || (Level10Count + Level11Count + Level12Count + Level13Count + Level14Count + Level15Count) == 5) { lpObj->m_Defense += lpObj->m_Defense * 5 / 100; } } } lpObj->m_Defense = lpObj->m_Defense * 10 / 20; // ---------------------------------------- // Transformation Rings // ---------------------------------------- if ( lpObj->m_Change == 9 ) // Thunder Lich Change { // Add Magic Power Here } else if ( lpObj->m_Change == 41 ) // Death Cow Change { lpObj->AddLife = ((int)(lpObj->MaxLife * 20.0f))/100; } else if ( lpObj->m_Change == 372 ) // Don't Know { lpObj->m_Defense += lpObj->m_Defense / 10; lpObj->AddLife += lpObj->Level; } // ---------------------------------------- // Pets // ---------------------------------------- if ( Helper->m_Type == ITEMGET(13,0) ) // Guardian Angel { lpObj->AddLife += 50; } else if ( Helper->m_Type == ITEMGET(13,1) ) // Imp { //Add 30% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*30)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*30)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*30)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*30)/100; //Add 30% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*30)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*30)/100; } else if ( Helper->m_Type == ITEMGET(13,3) ) // Dinorant { //Helper->PlusSpecial(&lpObj->AddBP, 103 ); //Add 15% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*15)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*15)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*15)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*15)/100; //Add 15% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*15)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*15)/100; } else if ( Helper->m_Type == ITEMGET(13,64) ) // Demon { //Add 40% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*40)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*40)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*40)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*40)/100; //Add +10 to Attack Speed lpObj->m_MagicSpeed += 10; lpObj->m_AttackSpeed += 10; //Add 40% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*40)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*40)/100; } else if ( Helper->m_Type == ITEMGET(13,65) ) // Spirit Guardian { lpObj->AddLife += 50; } else if ( Helper->m_Type == ITEMGET(13,80) ) // Pet Panda { lpObj->m_Defense += 50; } else if ( Helper->m_Type == ITEMGET(13,123) ) // Skeleton Pet { //Add 20% to Attack lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*20)/100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*20)/100; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*20)/100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*20)/100; //Add +10 to Attack Speed lpObj->m_MagicSpeed += 10; lpObj->m_AttackSpeed += 10; //Add 20% to Magic Attack lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*20)/100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*20)/100; } int addlife = 0; int addmana = 0; Wings->PlusSpecial(&addlife, 100); Wings->PlusSpecial(&addmana, 101); Wings->PlusSpecial(&AddLeadership, 105); lpObj->AddLeadership = AddLeadership; lpObj->AddLife += addlife; lpObj->AddMana += addmana; if ( lpObj->Type == OBJ_USER ) { gDarkSpirit[lpObj->m_Index].Set(lpObj->m_Index, &lpObj->pInventory[1]); } Amulet->PlusSpecialPercentEx(&lpObj->AddBP, lpObj->MaxBP, 173); Ring01->PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); Ring02->PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); CItem * rItem[3]; int comparecount = 0; rItem[0] = &lpObj->pInventory[10]; rItem[1] = &lpObj->pInventory[11]; rItem[2] = &lpObj->pInventory[9]; #define GET_MAX_RESISTANCE(x,y,z) ( ( ( ( (x) > (y) ) ? (x) : (y) ) > (z) ) ? ( ( (x) > (y) ) ? (x) : (y) ) : (z) ) lpObj->m_Resistance[1] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[1], rItem[1]->m_Resistance[1], rItem[2]->m_Resistance[1]); lpObj->m_Resistance[0] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[0], rItem[1]->m_Resistance[0], rItem[2]->m_Resistance[0]); lpObj->m_Resistance[2] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[2], rItem[1]->m_Resistance[2], rItem[2]->m_Resistance[2]); lpObj->m_Resistance[3] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[3], rItem[1]->m_Resistance[3], rItem[2]->m_Resistance[3]); lpObj->m_Resistance[4] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[4], rItem[1]->m_Resistance[4], rItem[2]->m_Resistance[4]); lpObj->m_Resistance[5] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[5], rItem[1]->m_Resistance[5], rItem[2]->m_Resistance[5]); lpObj->m_Resistance[6] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[6], rItem[1]->m_Resistance[6], rItem[2]->m_Resistance[6]); g_Item380System.ApplyFor380Option(lpObj); g_kJewelOfHarmonySystem.SetApplyStrengthenItem(lpObj); gItemSocket.ApplyEffect(lpObj); gSkillTree.ApplyEffect(lpObj); GObjExtItemApply(lpObj); gObjSetItemApply(lpObj); gObjNextExpCal(lpObj); if ( (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7) ) || Left->m_Type == ITEMGET(4,17) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Left->m_Type == ITEMGET(4,22) || Left->m_Type == ITEMGET(4,23) || Left->m_Type == ITEMGET(4,24) ) { if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 1 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.03f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.03f + 1.0f); } else if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 2 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.05f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.05f + 1.0f); } } else if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Right->m_Type >= ITEMGET(4,16) && Right->m_Type < ITEMGET(5,0)) ) { if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 1 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.03f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.03f + 1.0f); } else if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 2 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.05f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.05f + 1.0f); } } if ( lpObj->Class == CLASS_KNIGHT || lpObj->Class == CLASS_MAGUMSA || lpObj->Class == CLASS_DARKLORD || lpObj->Class == CLASS_FIGHTER ) { if ( Right->m_Type != -1 && Left->m_Type != -1 ) { if ( Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(4,0) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(4,0) ) { lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * 55 / 100; lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * 55 / 100; lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * 55 / 100; lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * 55 / 100; } } } if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.NextSetItemLastEffectForHallowin(lpObj); } gObjCalcShieldPoint(lpObj); if ( lpObj->iShield > ( lpObj->iMaxShield + lpObj->iAddShield ) ) { lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield ; GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); } GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield); GCManaSend(lpObj->m_Index, lpObj->MaxMana + lpObj->AddMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); }
//00553d40 -> 100% void CMasterLevelSystem::DGAnsMasterLevelInfo(BYTE * aRecv) //OK { if( !aRecv ) { return; } // ---- MLP_ANS_MASTERLEVEL_INFO * lpRecvMsg = (MLP_ANS_MASTERLEVEL_INFO*)aRecv; // ---- if( !gObjIsConnectedGP(lpRecvMsg->iUserIndex) ) { return; } // ---- int iIndex = lpRecvMsg->iUserIndex; LPOBJ lpObj = &gObj[lpRecvMsg->iUserIndex]; // --- if( lpObj->m_bMasterLevelDBLoad ) { return; } // ---- if( !lpRecvMsg->btResult ) { LogAddTD("[%s][%s] MasterLevel Info Load Fail", lpObj->AccountID, lpObj->Name); //-> New return; } // ---- if( lpRecvMsg->btResult == 1 ) { if( lpObj->m_iMasterLevelPoint + lpRecvMsg->nMLPoint != lpRecvMsg->nMLevel ) //-> New (be good use MASTER_MAX_POINT for check) { LogAddTD("[%s][%s] MasterLevel Info Mismatch!! - Point(%d), Use Point(%d), Level(%d)", lpObj->AccountID, lpObj->Name, lpRecvMsg->nMLPoint, lpObj->m_bMasterLevelDBLoad, lpRecvMsg->nMLevel); } // ---- lpObj->m_bMasterLevelDBLoad = 1; // ---- if( lpRecvMsg->nMLevel == 0 && lpRecvMsg->i64NextMLExp == 0 ) { lpObj->m_nMasterLevel = lpRecvMsg->nMLevel; lpObj->m_i64MasterLevelExp = lpRecvMsg->i64MLExp; lpObj->m_i64NextMasterLevelExp = m_i64MasterLevelExpTlb[1]; lpObj->m_iMasterLevelPoint = lpRecvMsg->nMLPoint; // ---- LogAddTD("[%s][%s] MasterLevel Info First Set [MLevel:%d][MLExp:%I64d][m_i64NextMasterLevelExp:%I64d][MLPoint:%d]", lpObj->AccountID, lpObj->Name, lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, lpObj->m_i64NextMasterLevelExp, lpObj->m_iMasterLevelPoint); // ---- this->GDReqMasterLevelInfoSave(lpObj); } else { lpObj->m_nMasterLevel = lpRecvMsg->nMLevel; lpObj->m_i64MasterLevelExp = lpRecvMsg->i64MLExp; lpObj->m_i64NextMasterLevelExp = lpRecvMsg->i64NextMLExp; lpObj->m_iMasterLevelPoint = lpRecvMsg->nMLPoint; // ---- LogAddTD("[%s][%s] Recv MasterLevel Info [MLevel:%d][MLExp:%I64d][m_i64NextMasterLevelExp:%I64d][MLPoint:%d]", lpObj->AccountID, lpObj->Name, lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, lpObj->m_i64NextMasterLevelExp, lpObj->m_iMasterLevelPoint); // ---- this->GDReqMasterLevelInfoSave(lpObj); } // ---- lpObj->MaxLife = DCInfo.DefClass[lpObj->Class].Life + (lpObj->Level + lpObj->m_nMasterLevel - 1) * DCInfo.DefClass[lpObj->Class].LevelLife + ((lpObj->Vitality - DCInfo.DefClass[lpObj->Class].Vitality ) * DCInfo.DefClass[lpObj->Class].VitalityToLife); // ---- if( lpObj->Life > lpObj->MaxLife + lpObj->AddLife ) { lpObj->Life = lpObj->MaxLife; } // ---- lpObj->MaxMana = DCInfo.DefClass[lpObj->Class].Mana + (lpObj->Level + lpObj->m_nMasterLevel - 1) * DCInfo.DefClass[lpObj->Class].LevelMana + ((lpObj->Energy - DCInfo.DefClass[lpObj->Class].Energy ) * DCInfo.DefClass[lpObj->Class].EnergyToMana); // ---- if( lpObj->Mana > lpObj->MaxMana + lpObj->AddMana ) { lpObj->Mana = lpObj->MaxMana; } // ---- gObjCalcMaxLifePower(lpObj->m_Index); gObjSetBP(lpObj->m_Index); gObjCalcShieldPoint(lpObj); // ---- lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield; // ---- LogAddTD("[%s][%s] Reset Max Value For MasterLevel [MaxLife:%d][MaxMana:%d][MaxSD:%d]", lpObj->AccountID, lpObj->Name, lpObj->MaxLife, lpObj->MaxMana, lpObj->iShield); // ---- this->GCMasterLevelInfo(lpObj); // ---- GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield); GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP); } // ---- gObjCalCharacter(lpObj->m_Index); // ----- gObjCalcMLSkillItemOption(lpObj); g_MasterSkillSystem.CGReqGetMasterLevelSkillTree(lpObj->m_Index); }
void gObjCalCharacter(int aIndex) { LPOBJ lpObj = &gObj[aIndex]; int Strength = 0; int Dexterity = 0; int Vitality = 0; int Energy = 0; CItem * Right = &lpObj->pInventory[0]; CItem * Left = &lpObj->pInventory[1]; CItem * Gloves = &lpObj->pInventory[5]; CItem * Amulet = &lpObj->pInventory[9]; CItem * Helper = &lpObj->pInventory[8]; lpObj->HaveWeaponInHand = true; if ( Right->IsItem() == FALSE && Left->IsItem() == FALSE ) { lpObj->HaveWeaponInHand = false; } else if ( Left->IsItem() == FALSE && Right->m_Type == ITEMGET(4,15) ) // Arrow { lpObj->HaveWeaponInHand = false; } else if ( Right->IsItem() == FALSE ) { int iType = Left->m_Type / MAX_SUBTYPE_ITEMS; if ( Left->m_Type == ITEMGET(4,7) ) // Bolt { lpObj->HaveWeaponInHand = false; } else if ( iType == 6 ) { lpObj->HaveWeaponInHand = false; } } lpObj->AddLife = 0; lpObj->AddMana = 0; lpObj->MonsterDieGetMoney = 0; lpObj->MonsterDieGetLife = 0; lpObj->MonsterDieGetMana = 0; lpObj->DamageReflect = 0; lpObj->DamageMinus = 0; lpObj->SkillLongSpearChange = false; if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.PrevSetItemLastEffectForHallowin(lpObj); } int iItemIndex; BOOL bIsChangeItem; // lc34 for ( iItemIndex=0; iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } } do { lpObj->SetOpAddMaxAttackDamage = 0; lpObj->SetOpAddMinAttackDamage = 0; lpObj->SetOpAddDamage = 0; lpObj->SetOpIncAGValue = 0; lpObj->SetOpAddCriticalDamageSuccessRate = 0; lpObj->SetOpAddCriticalDamage = 0; lpObj->SetOpAddExDamageSuccessRate = 0; lpObj->SetOpAddExDamage = 0; lpObj->SetOpAddSkillAttack = 0; lpObj->AddStrength = 0; lpObj->AddDexterity = 0; lpObj->AddVitality = 0; lpObj->AddEnergy = 0; lpObj->AddBP = 0; lpObj->iAddShield = 0; lpObj->SetOpAddAttackDamage = 0; lpObj->SetOpAddDefence = 0; lpObj->SetOpAddMagicPower = 0; lpObj->SetOpAddDefenceRate = 0; lpObj->SetOpIgnoreDefense = 0; lpObj->SetOpDoubleDamage = 0; lpObj->SetOpTwoHandSwordImproveDamage = 0; lpObj->SetOpImproveSuccessAttackRate = 0; lpObj->SetOpReflectionDamage = 0; lpObj->SetOpImproveSheldDefence = 0; lpObj->SetOpDecreaseAG = 0; lpObj->SetOpImproveItemDropRate = 0; lpObj->IsFullSetItem = false; memset(lpObj->m_AddResistance, 0, sizeof(lpObj->m_AddResistance)); bIsChangeItem = 0; gObjCalcSetItemStat(lpObj); gObjCalcSetItemOption(lpObj); for (iItemIndex=0;iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++) { if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE && lpObj->pInventory[iItemIndex].m_IsValidItem != false ) { if ( gObjValidItem( lpObj, &lpObj->pInventory[iItemIndex], iItemIndex) != FALSE ) { lpObj->pInventory[iItemIndex].m_IsValidItem = true; } else { lpObj->pInventory[iItemIndex].m_IsValidItem = false; bIsChangeItem = TRUE; } } } } while ( bIsChangeItem != FALSE ); Strength = lpObj->Strength + lpObj->AddStrength; Dexterity = lpObj->Dexterity + lpObj->AddDexterity; Vitality = lpObj->Vitality + lpObj->AddVitality; Energy = lpObj->Energy + lpObj->AddEnergy; if ( lpObj->Class == CLASS_ELF ) // Elf { if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7)) || Right->m_Type == ITEMGET(4,16) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Right->m_Type == ITEMGET(4,18) || Right->m_Type == ITEMGET(4,19) || Left->m_Type == ITEMGET(4,17) ) { if ( (Right->IsItem() != FALSE && Right->m_IsValidItem == false) || (Left->IsItem() != FALSE && Left->m_IsValidItem == false) ) { lpObj->m_AttackDamageMinRight = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength ) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength ) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength ) / 4; } else { lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 8 ); lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 14); lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 8 ); } } else { lpObj->m_AttackDamageMinRight = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxRight = (Dexterity + Strength) / 4; lpObj->m_AttackDamageMinLeft = (Dexterity + Strength) / 7; lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength) / 4; } } else if ( lpObj->Class == CLASS_KNIGHT ) // Dark Knight { lpObj->m_AttackDamageMinRight = Strength / 6; lpObj->m_AttackDamageMaxRight = Strength / 4; lpObj->m_AttackDamageMinLeft = Strength / 6; lpObj->m_AttackDamageMaxLeft = Strength / 4; } else if (lpObj->Class == CLASS_MAGUMSA ) // MAgic Gladiator { lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8); lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12); lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8); } else if ( lpObj->Class == CLASS_DARKLORD ) // Dark Lord { lpObj->m_AttackDamageMinRight = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxRight = (Strength / 5) + (Energy / 10); lpObj->m_AttackDamageMinLeft = (Strength / 7) + (Energy / 14); lpObj->m_AttackDamageMaxLeft = (Strength / 5) + (Energy / 10); } else if( lpObj->Class == CLASS_SUMMONER ) // Summoner { lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 7); lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 4); lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 7); lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 4); } else { lpObj->m_AttackDamageMinRight = (Strength / 8); lpObj->m_AttackDamageMaxRight = (Strength / 4); lpObj->m_AttackDamageMinLeft = (Strength / 8); lpObj->m_AttackDamageMaxLeft = (Strength / 4); } lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); int AddLeadership = 0; if ( lpObj->pInventory[7].IsItem() != FALSE && lpObj->pInventory[7].m_IsValidItem != false) { AddLeadership += lpObj->pInventory[7].m_Leadership; } if ( Right->m_Type != -1 ) { if ( Right->m_IsValidItem != false ) { if ( Right->m_Type >= ITEMGET(5,0) && Right->m_Type <= ITEMGET(6,0) ) { lpObj->m_AttackDamageMinRight += Right->m_DamageMin / 2; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax / 2; } else { lpObj->m_AttackDamageMinRight += Right->m_DamageMin; lpObj->m_AttackDamageMaxRight += Right->m_DamageMax; } } if ( lpObj->pInventory[0].m_SkillChange != FALSE ) { lpObj->SkillLongSpearChange = true; } lpObj->pInventory[0].PlusSpecial(&lpObj->m_AttackDamageMinRight, 80); lpObj->pInventory[0].PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80); } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false) { lpObj->m_AttackDamageMinLeft += Left->m_DamageMin; lpObj->m_AttackDamageMaxLeft += Left->m_DamageMax; } lpObj->pInventory[1].PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80); lpObj->pInventory[1].PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80); } lpObj->m_CriticalDamage = 0; lpObj->m_ExcelentDamage = 0; lpObj->pInventory[0].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[1].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[2].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[3].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[4].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[5].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[6].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->pInventory[7].PlusSpecial(&lpObj->m_CriticalDamage, 84); lpObj->m_MagicDamageMin = Energy / 9; lpObj->m_MagicDamageMax = Energy / 4; lpObj->pInventory[7].PlusSpecial(&lpObj->m_MagicDamageMin, 81); lpObj->pInventory[7].PlusSpecial(&lpObj->m_MagicDamageMax, 81); if ( Right->m_Type != -1 ) { if ( lpObj->pInventory[0].m_Type == ITEMGET(0,31) || lpObj->pInventory[0].m_Type == ITEMGET(0,21) || lpObj->pInventory[0].m_Type == ITEMGET(0,23) || lpObj->pInventory[0].m_Type == ITEMGET(0,25) ) { lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMin, 80); lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMax, 80); } else { lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMin, 81); lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMax, 81); } } lpObj->m_AttackRating = (Strength + Dexterity) / 2; lpObj->m_AttackRating += lpObj->pInventory[5].ItemDefense(); if ( lpObj->Class == 2 ) // Elf { lpObj->m_AttackSpeed = Dexterity / 50; lpObj->m_MagicSpeed = Dexterity / 50; } else if ( lpObj->Class == 1 || lpObj->Class == 3) // Dark Knigh and MG { lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; } else if ( lpObj->Class == 4 ) // DarkLord { lpObj->m_AttackSpeed = Dexterity / 10; lpObj->m_MagicSpeed = Dexterity / 10; } else if ( lpObj->Class == 5 ) // Summoner { lpObj->m_AttackSpeed = Dexterity / 15; lpObj->m_MagicSpeed = Dexterity / 20; } else { lpObj->m_AttackSpeed = Dexterity / 20; lpObj->m_MagicSpeed = Dexterity / 10; } bool bRight = false; bool bLeft = false; if ( Right->m_Type != ITEMGET(4,7) && Right->m_Type != ITEMGET(4,15) && Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(6,0) ) { if ( Right->m_IsValidItem != false ) { bRight = true; } } if ( Left->m_Type != ITEMGET(4,7) && Left->m_Type != ITEMGET(4,15) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(6,0) ) { if ( Left->m_IsValidItem != false ) { bLeft = true; } } if ( bRight != false && bLeft != false ) { lpObj->m_AttackSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; lpObj->m_MagicSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2; } else if ( bRight!= false ) { lpObj->m_AttackSpeed += Right->m_AttackSpeed; lpObj->m_MagicSpeed += Right->m_AttackSpeed; } else if ( bLeft != false ) { lpObj->m_AttackSpeed += Left->m_AttackSpeed; lpObj->m_MagicSpeed += Left->m_AttackSpeed; } if ( Gloves->m_Type != -1 ) { if ( Gloves->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Gloves->m_AttackSpeed; lpObj->m_MagicSpeed += Gloves->m_AttackSpeed; } } if ( Helper->m_Type != -1 ) { if ( Helper->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Helper->m_AttackSpeed; lpObj->m_MagicSpeed += Helper->m_AttackSpeed; } } if ( Amulet->m_Type != -1 ) { if ( Amulet->m_IsValidItem != false ) { lpObj->m_AttackSpeed += Amulet->m_AttackSpeed; lpObj->m_MagicSpeed += Amulet->m_AttackSpeed; } } // Wizard Ring effect if ( (lpObj->pInventory[10].IsItem() == TRUE && lpObj->pInventory[10].m_Type == ITEMGET(13,20) && lpObj->pInventory[10].m_Level == 0 && lpObj->pInventory[10].m_Durability > 0.0f ) || (lpObj->pInventory[11].IsItem() == TRUE && lpObj->pInventory[11].m_Type == ITEMGET(13,20) && lpObj->pInventory[11].m_Level == 0 && lpObj->pInventory[11].m_Durability > 0.0f ) ) { lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 10 / 100; lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 10 / 100; lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 10 / 100; lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 10 / 100; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 10 / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 10 / 100; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } if ( lpObj->Class == CLASS_WIZARD ) // Dark Wizard; { lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) ); } else { lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) ); } if ( lpObj->m_DetectSpeedHackTime < gMinimumAttackSpeedTime ) { lpObj->m_DetectSpeedHackTime = gMinimumAttackSpeedTime; } if ( lpObj->Class == 2 ) // elf { lpObj->m_SuccessfulBlocking = Dexterity / 4; } else if ( lpObj->Class == 4 ) // DL { lpObj->m_SuccessfulBlocking = Dexterity / 7; } else { lpObj->m_SuccessfulBlocking = Dexterity / 3; } if ( Left->m_Type != -1 ) { if ( Left->m_IsValidItem != false ) { lpObj->m_SuccessfulBlocking += Left->m_SuccessfulBlocking; lpObj->pInventory[1].PlusSpecial(&lpObj->m_SuccessfulBlocking, 82); } } bool Success = true; if ( lpObj->Class == CLASS_MAGUMSA ) // MG { for ( int j=3;j<=6;j++) { if ( lpObj->pInventory[j].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[j].m_IsValidItem == false ) { Success = false; break; } } } else { for ( int k=2;k<=6;k++) { if ( lpObj->pInventory[k].m_Type == -1 ) { Success = false; break; } if ( lpObj->pInventory[k].m_IsValidItem == false ) { Success = false; break; } } } int Level11Count = 0; int Level10Count = 0; int Level12Count = 0; int Level13Count = 0; int Level14Count = 0; int Level15Count = 0; if ( Success != false ) { int in; if ( lpObj->Class == CLASS_MAGUMSA ) // MG { in = lpObj->pInventory[3].m_Type % MAX_SUBTYPE_ITEMS; if ( in != ITEMGET(0,15) && in != ITEMGET(0,20) && in != ITEMGET(0,23) && in != ITEMGET(0,33) && in != ITEMGET(0,32) && in != ITEMGET(0,37) ) { Success = false; } else { Level13Count++; for (int m=3;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } } else { in = lpObj->pInventory[2].m_Type % MAX_SUBTYPE_ITEMS; for (int m=2;m<=6;m++) { if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) ) { Success = false; } if ( lpObj->pInventory[m].m_Level > 14) { Level15Count++; } else if ( lpObj->pInventory[m].m_Level > 13) { Level14Count++; } else if ( lpObj->pInventory[m].m_Level > 12 ) { Level13Count++; } else if ( lpObj->pInventory[m].m_Level > 11 ) { Level12Count++; } else if ( lpObj->pInventory[m].m_Level > 10 ) { Level11Count++; } else if ( lpObj->pInventory[m].m_Level > 9 ) { Level10Count++; } } } if ( Success != false ) // #warning unuseful if { lpObj->m_SuccessfulBlocking += lpObj->m_SuccessfulBlocking / 10; } } if ( lpObj->Class == CLASS_ELF ) // Elf { lpObj->m_Defense = Dexterity / 10; } else if ( lpObj->Class == 1 ) // DK { lpObj->m_Defense = Dexterity / 3; } else if ( lpObj->Class == 4 ) // DL { lpObj->m_Defense = Dexterity / 7; } else if ( lpObj->Class == 5 ) // SU { lpObj->m_Defense = Dexterity / 3; } else { lpObj->m_Defense = Dexterity / 4; } lpObj->m_Defense += lpObj->pInventory[2].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[3].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[4].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[5].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[6].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[1].ItemDefense(); lpObj->m_Defense += lpObj->pInventory[7].ItemDefense(); if ( lpObj->pInventory[8].IsItem() != FALSE ) { if ( lpObj->pInventory[8].m_Type == ITEMGET(13,4) && lpObj->pInventory[8].m_Durability > 0.0f ) // Dark Horse { lpObj->m_Defense += INT( Dexterity / 20 + 5 + Helper->m_PetItem_Level * 2 ); } } if ( (Level13Count + Level12Count + Level11Count + Level10Count + Level14Count + Level15Count ) >= 5 ) { if ( Success != false ) { if( Level15Count == 5) { lpObj->m_Defense += lpObj->m_Defense * 30 / 100; } else if( Level14Count == 5) { lpObj->m_Defense += lpObj->m_Defense * 25 / 100; } else if ( Level13Count == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 20 / 100; } else if ( Level12Count == 5 || (Level12Count + Level13Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 15 / 100; } else if ( Level11Count == 5 || (Level11Count + Level12Count + Level13Count) == 5 ) { lpObj->m_Defense += lpObj->m_Defense * 10 / 100; } else if ( Level10Count == 5 || (Level10Count + Level11Count + Level12Count + Level13Count) == 5) { lpObj->m_Defense += lpObj->m_Defense * 5 / 100; } } } lpObj->m_Defense = lpObj->m_Defense * 10 / 20; if ( lpObj->m_Change == 9 ) { } else if ( lpObj->m_Change == 41 ) { lpObj->AddLife = ((int)(lpObj->MaxLife * 20.0f))/100; } else if ( lpObj->m_Change == 372 ) { lpObj->m_Defense += lpObj->m_Defense / 10; lpObj->AddLife += lpObj->Level; } else if ( lpObj->m_Change == 374 ) { lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 20 / 100; lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 20 / 100; lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 20 / 100; lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 20 / 100; lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 20 / 100; lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 20 / 100; } else if ( lpObj->m_Change == 378 ) { lpObj->m_AddResistance[R_ICE] += (char)255; lpObj->m_AddResistance[R_POISON] += (char)255; lpObj->m_AddResistance[R_LIGHTNING] += (char)255; lpObj->m_AddResistance[R_FIRE] += (char)255; lpObj->m_AddResistance[R_EARTH] += (char)255; lpObj->m_AddResistance[R_WIND] += (char)255; lpObj->m_AddResistance[R_WATER] += (char)255; } if ( lpObj->pInventory[8].m_Type == ITEMGET(13,0) ) { lpObj->AddLife += 50; } if ( lpObj->pInventory[8].m_Type == ITEMGET(13,37) && lpObj->pInventory[8].m_NewOption == 4 && lpObj->pInventory[8].m_Durability > 0.0f ) //Golden Fenrir Attribute { lpObj->AddLife += 200; //Life +200 lpObj->AddMana += 200; //Mana +200 /* //Attack Power Already Coded on zzzitem.cpp lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 33 / 100; //Attack Power +33 lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 33 / 100; //Attack Power +33 lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 33 / 100; //Attack Power +33 lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 33 / 100; //Attack Power +33 */ lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 16 / 100; //Wizardry +16 lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 16 / 100; //Wizardry +16 } int addlife = 0; int addmana = 0; if ( lpObj->pInventory[7].m_Type >= ITEMGET(12,0) && lpObj->pInventory[7].m_Type <= ITEMGET(12,6) || lpObj->pInventory[7].m_Type == ITEMGET(13,30) ) //Third Wings Fix Applied { lpObj->pInventory[7].PlusSpecial(&addlife, 100); lpObj->pInventory[7].PlusSpecial(&addmana, 101); lpObj->pInventory[7].PlusSpecial(&AddLeadership, 105); lpObj->AddLeadership = AddLeadership; lpObj->AddLife += addlife; lpObj->AddMana += addmana; } if ( lpObj->pInventory[8].m_Type == ITEMGET(13,3) ) { lpObj->pInventory[8].PlusSpecial(&lpObj->AddBP, 103 ); } if ( lpObj->Type == OBJ_USER ) { gDarkSpirit[lpObj->m_Index].Set(lpObj->m_Index, &lpObj->pInventory[1]); } lpObj->pInventory[9].PlusSpecialPercentEx(&lpObj->AddBP, lpObj->MaxBP, 173); lpObj->pInventory[10].PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); lpObj->pInventory[11].PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172); CItem * rItem[3]; int comparecount = 0; rItem[0] = &lpObj->pInventory[10]; rItem[1] = &lpObj->pInventory[11]; rItem[2] = &lpObj->pInventory[9]; #define GET_MAX_RESISTANCE(x,y,z) ( ( ( ( (x) > (y) ) ? (x) : (y) ) > (z) ) ? ( ( (x) > (y) ) ? (x) : (y) ) : (z) ) lpObj->m_Resistance[1] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[1], rItem[1]->m_Resistance[1], rItem[2]->m_Resistance[1]); lpObj->m_Resistance[0] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[0], rItem[1]->m_Resistance[0], rItem[2]->m_Resistance[0]); lpObj->m_Resistance[2] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[2], rItem[1]->m_Resistance[2], rItem[2]->m_Resistance[2]); lpObj->m_Resistance[3] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[3], rItem[1]->m_Resistance[3], rItem[2]->m_Resistance[3]); lpObj->m_Resistance[4] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[4], rItem[1]->m_Resistance[4], rItem[2]->m_Resistance[4]); lpObj->m_Resistance[5] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[5], rItem[1]->m_Resistance[5], rItem[2]->m_Resistance[5]); lpObj->m_Resistance[6] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[6], rItem[1]->m_Resistance[6], rItem[2]->m_Resistance[6]); g_kItemSystemFor380.ApplyFor380Option(lpObj); g_kJewelOfHarmonySystem.SetApplyStrengthenItem(lpObj); //BuffEffectC.InitEffect(lpObj); MasterLevelSystem.SetObjEffect(lpObj->m_Index); gItemSocket.ApplyEffect(lpObj->m_Index); GObjExtItemApply(lpObj); gObjSetItemApply(lpObj); gObjNextExpCal(lpObj); if ( (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7) ) || Left->m_Type == ITEMGET(4,17) || Left->m_Type == ITEMGET(4,20) || Left->m_Type == ITEMGET(4,21) || Left->m_Type == ITEMGET(4,22) ) { if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 1 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.03f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.03f + 1.0f); } else if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 2 ) { lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.05f + 1.0f); lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.05f + 1.0f); } } else if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) || (Right->m_Type >= ITEMGET(4,16) && Right->m_Type < ITEMGET(5,0)) ) { if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 1 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.03f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.03f + 1.0f); } else if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 2 ) { lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.05f + 1.0f); lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.05f + 1.0f); } } if ( lpObj->Class == CLASS_KNIGHT || lpObj->Class == CLASS_MAGUMSA || lpObj->Class == CLASS_DARKLORD ) { if ( Right->m_Type != -1 && Left->m_Type != -1 ) { if ( Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(4,0) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(4,0) ) { lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * 55 / 100; lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * 55 / 100; lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * 55 / 100; lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * 55 / 100; } } } if ( lpObj->m_iItemEffectValidTime > 0 ) { g_ItemAddOption.NextSetItemLastEffectForHallowin(lpObj); } if(Helper->m_Type == ITEMGET(13,64)) { lpObj->m_AttackDamageMin += (lpObj->m_AttackDamageMin/100) * 40; lpObj->m_AttackDamageMax += (lpObj->m_AttackDamageMax/100) * 40; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*40) / 100; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*40) / 10; lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*40) / 100; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*40) / 100; lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*40) / 100; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*40) / 100; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } else if(Helper->m_Type == ITEMGET(13,65)) { //lpObj->AddLife += 50; lpObj->m_Defense += lpObj->m_Defense * (30 / 100); } else if(Helper->m_Type == ITEMGET(13,106)) { lpObj->m_Defense += 50; } else if(Helper->m_Type == ITEMGET(13,123)) { lpObj->m_AttackDamageMin += (lpObj->m_AttackDamageMin/100) * 40; lpObj->m_AttackDamageMax += (lpObj->m_AttackDamageMax/100) * 40; lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight/100) * 40; lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight/100) * 40; lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft/100) * 40; lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft/100) * 40; lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin/100) * 40; lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax/100) * 40; lpObj->m_AttackSpeed += 10; lpObj->m_MagicSpeed += 10; } gObjCalcShieldPoint(lpObj); if ( lpObj->iShield > ( lpObj->iMaxShield + lpObj->iAddShield ) ) { lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield ; GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); } /* if(lpObj->m_SkillSwordPowerTime != 0) { lpObj->AddLife = (lpObj->AddLife * lpObj->m_SkillSwordPowerDec)/100; lpObj->m_Defense = (lpObj->m_Defense * lpObj->m_SkillSwordPowerDec)/100; lpObj->AddMana = lpObj->AddMana * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * lpObj->m_SkillSwordPowerInc; lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * lpObj->m_SkillSwordPowerInc; lpObj->m_MagicDamageMin = lpObj->m_MagicDamageMin * lpObj->m_SkillSwordPowerInc; lpObj->m_MagicDamageMax = lpObj->m_MagicDamageMax * lpObj->m_SkillSwordPowerInc; }*/ GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield); GCManaSend(lpObj->m_Index, lpObj->MaxMana + lpObj->AddMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP); }
//005535a0 -> 100% int CMasterLevelSystem::MasterLevelUp(LPOBJ lpObj, __int64 iAddExp, bool bEventMapReward, int iMonsterType) //OK { if( !this->IsMasterLevelUser(lpObj) ) { return false; } int m_maxMasterLevel = GetPrivateProfileInt("Common", "MaxMasterLevel", 200, gDirPath.GetNewPath("MasterSystem.cfg")); int numCoded = 201; if (m_maxMasterLevel >= numCoded || m_maxMasterLevel <= 0){ int m_maxMasterLevel = 200; } // ---- if (lpObj->m_nMasterLevel >= m_maxMasterLevel) { GCServerMsgStringSend(lMsg.Get(1136), lpObj->m_Index, 1); return false; } // ---- if( bEventMapReward ) //-> New { iAddExp = iAddExp; //??? } else { #ifdef GENS if( gGensSystem.IsMapBattleZone(lpObj->MapNumber) ) //-> Original g_GensSystem maybe { iAddExp = iAddExp * (this->m_fAddExpRate + g_MLBattleZoneAddExp); } else { iAddExp = iAddExp * this->m_fAddExpRate; } #else iAddExp = iAddExp * this->m_fAddExpRate; #endif } // ---- if( lpObj->m_MPSkillOpt.MpsPlusExp > 0 ) { iAddExp += iAddExp * lpObj->m_MPSkillOpt.MpsPlusExp / 100; } // ---- if( iAddExp > 0 ) { gObjSetExpPetItem(lpObj->m_Index, iAddExp); // ---- LogAddTD("ML Experience : Map[%d]-(%d,%d) [%s][%s](%d) %I64d %I64d MonsterIndex : %d", //-> Updated lpObj->MapNumber, lpObj->X, lpObj->Y, lpObj->AccountID,lpObj->Name, lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, iAddExp, iMonsterType); // ---- if( iAddExp + lpObj->m_i64MasterLevelExp >= lpObj->m_i64NextMasterLevelExp ) { iAddExp = 0; // ----- int m_masterPointsPerLvl = GetPrivateProfileInt("Common", "MasterPointsPerLvl", 100, gDirPath.GetNewPath("MasterSystem.cfg")); int numCodeds = 101; if (m_maxMasterLevel >= numCodeds) { int m_masterPointsPerLvl = 1; } // ----- lpObj->m_i64MasterLevelExp = lpObj->m_i64NextMasterLevelExp; lpObj->m_nMasterLevel++; lpObj->m_iMasterLevelPoint += m_masterPointsPerLvl; //-> In future can use it for change ml point per level) // ----- gObjCalCharacter(lpObj->m_Index); // ----- lpObj->MaxLife += DCInfo.DefClass[ lpObj->Class ].LevelLife; lpObj->MaxMana += DCInfo.DefClass[ lpObj->Class ].LevelMana; lpObj->Life = lpObj->AddLife + lpObj->MaxLife; lpObj->Mana = lpObj->AddMana + lpObj->MaxMana; // ----- gObjCalcShieldPoint(lpObj); lpObj->iShield = lpObj->iAddShield + lpObj->iMaxShield; // ----- this->gObjNextMLExpCal(lpObj); // ---- gObjCalcMaxLifePower(lpObj->m_Index); gObjSetBP(lpObj->m_Index); GJSetCharacterInfo(lpObj, lpObj->m_Index, 0, 0); this->GCMasterLevelUpInfo(lpObj); GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield); GCManaSend(lpObj->m_Index, lpObj->Mana, 0xFF, 0, lpObj->BP); //-> Original name ->_BP } else { lpObj->m_i64MasterLevelExp += iAddExp; } // ---- GCSendExp_INT64(lpObj->m_Index, 65535, iAddExp, 0, 0); } // ---- return true; }