BOOL CItem380System::ApplyFor380Option(LPOBJ lpObj) { ITEMOPTION_FOR380ITEM_EFFECT * pItemEffect = &lpObj->m_ItemOptionExFor380; this->InitEffectValue(pItemEffect); int iItemIndex = 0; for ( iItemIndex = 0; iItemIndex < INVETORY_WEAR_SIZE ; iItemIndex++) { CItem * pItem = &lpObj->pInventory[iItemIndex]; if ( pItem->IsItem() && pItem->m_IsValidItem && this->Is380OptionItem(pItem) == TRUE ) { BYTE iOption1, iOption2; WORD iValue1, iValue2; iOption1 = this->m_itemOption[pItem->m_Type ].m_Option1; iValue1 = this->m_itemOption[pItem->m_Type ].m_Value1; iOption2 = this->m_itemOption[pItem->m_Type ].m_Option2; iValue2 = this->m_itemOption[pItem->m_Type ].m_Value2; BOOL bResult = FALSE; bResult = this->_CalcItemEffectValue(iOption1, iValue1, pItemEffect); bResult |= this->_CalcItemEffectValue(iOption2, iValue2, pItemEffect); } } lpObj->AddLife += pItemEffect->OpAddMaxHP; lpObj->iAddShield += pItemEffect->OpAddMaxSD; return TRUE; }
BOOL TMonsterSkillElement::ApplyElementDurability(int iIndex, int iTargetIndex) { LPOBJ lpObj = &gObj[iIndex]; LPOBJ lpTargetObj = &gObj[iTargetIndex]; if ( lpTargetObj->Type != OBJ_USER ) return FALSE; int iEquipmentPos = rand()%6+2; // Armors CItem * lpEquipment = &lpTargetObj->pInventory[iEquipmentPos]; if ( lpEquipment == NULL || lpEquipment->IsItem() == FALSE ) return FALSE; int iDurEquipment = (int)(lpEquipment->m_Durability); int iIncDecValue = 0; if ( this->m_iIncAndDecType != MSE_INCDEC_TYPE_NONE ) { if ( this->m_iIncAndDecType < MSE_INCDEC_TYPE_CONSTANTINC ) { iIncDecValue = iDurEquipment * this->m_iIncAndDecValue / 100; if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_PERCENTDEC ) iIncDecValue = -iIncDecValue; } if ( this->m_iIncAndDecType >= MSE_INCDEC_TYPE_CONSTANTINC ) { iIncDecValue = this->m_iIncAndDecValue; if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_CONSTANTDEC ) iIncDecValue = -iIncDecValue; } } iDurEquipment += iIncDecValue; if ( lpEquipment ) { lpEquipment->m_Durability = (float)iDurEquipment; if ( lpEquipment->m_Durability < 0.0f ) lpEquipment->m_Durability = 0; GCItemDurSend(lpTargetObj->m_Index, iEquipmentPos, (BYTE)lpEquipment->m_Durability, 0); } return FALSE; }
void ClassCalc::GetAttackDamage(LPOBJ lpUser) { #if (ENABLETEST_ZTLUA == 1) ZTLuaManager* LuaMng = new ZTLuaManager(FILE_LUA_CHARACTERBASICS); ZTLuaUnit::Bind(LuaMng->getLua()); ZTLuaItem::Bind(LuaMng->getLua()); LuaMng->Call("setAttackDamage", lpUser->m_Index); ZTLuaManager::Delete(LuaMng); #else CItem* Right = &lpUser->pInventory[0]; CItem* Left = &lpUser->pInventory[1]; int Strength = lpUser->Strength + lpUser->AddStrength; int Dexterity = lpUser->Dexterity + lpUser->AddDexterity; int Vitality = lpUser->Vitality + lpUser->AddVitality; int Energy = lpUser->Energy + lpUser->AddEnergy; WORD Class = lpUser->Class; // ---- if( Class == CLASS_WIZARD || Class == CLASS_KNIGHT ) { lpUser->m_AttackDamageMinRight = Strength / this->m_Data[Class].AttackDamageMinRightDiv1; lpUser->m_AttackDamageMaxRight = Strength / this->m_Data[Class].AttackDamageMaxRightDiv1; lpUser->m_AttackDamageMinLeft = Strength / this->m_Data[Class].AttackDamageMinLeftDiv1; lpUser->m_AttackDamageMaxLeft = Strength / this->m_Data[Class].AttackDamageMaxLeftDiv1; } else if( Class == 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) || Left->m_Type == ITEMGET(4,25) || Right->m_Type == ITEMGET(4,26) || Left->m_Type == ITEMGET(4,27)) { if( (Right->IsItem() && !Right->m_IsValidItem) || (Left->IsItem() && !Left->m_IsValidItem) ) { lpUser->m_AttackDamageMinRight = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMinRightDiv3; lpUser->m_AttackDamageMaxRight = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMaxRightDiv3; lpUser->m_AttackDamageMinLeft = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMinLeftDiv3; lpUser->m_AttackDamageMaxLeft = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMaxLeftDiv3; } else { lpUser->m_AttackDamageMinRight = (Dexterity / this->m_Data[Class].AttackDamageMinRightDiv1) + (Strength / this->m_Data[Class].AttackDamageMinRightDiv2); lpUser->m_AttackDamageMaxRight = (Dexterity / this->m_Data[Class].AttackDamageMaxRightDiv1) + (Strength / this->m_Data[Class].AttackDamageMaxRightDiv2); lpUser->m_AttackDamageMinLeft = (Dexterity / this->m_Data[Class].AttackDamageMinLeftDiv1) + (Strength / this->m_Data[Class].AttackDamageMinLeftDiv2); lpUser->m_AttackDamageMaxLeft = (Dexterity / this->m_Data[Class].AttackDamageMaxLeftDiv1) + (Strength / this->m_Data[Class].AttackDamageMaxLeftDiv2); } } else { lpUser->m_AttackDamageMinRight = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMinRightDiv3; lpUser->m_AttackDamageMaxRight = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMaxRightDiv3; lpUser->m_AttackDamageMinLeft = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMinLeftDiv3; lpUser->m_AttackDamageMaxLeft = (Dexterity + Strength) / this->m_Data[Class].AttackDamageMaxLeftDiv3; } } else if( Class == CLASS_MAGUMSA || Class == CLASS_DARKLORD ) { lpUser->m_AttackDamageMinRight = (Strength / this->m_Data[Class].AttackDamageMinRightDiv1) + (Energy / this->m_Data[Class].AttackDamageMinRightDiv2); lpUser->m_AttackDamageMaxRight = (Strength / this->m_Data[Class].AttackDamageMaxRightDiv1) + (Energy / this->m_Data[Class].AttackDamageMaxRightDiv2); lpUser->m_AttackDamageMinLeft = (Strength / this->m_Data[Class].AttackDamageMinLeftDiv1) + (Energy / this->m_Data[Class].AttackDamageMinLeftDiv2); lpUser->m_AttackDamageMaxLeft = (Strength / this->m_Data[Class].AttackDamageMaxLeftDiv1) + (Energy / this->m_Data[Class].AttackDamageMaxLeftDiv2); } else if( Class == CLASS_SUMMONER ) { lpUser->m_AttackDamageMinRight = ((Strength + Dexterity) / this->m_Data[Class].AttackDamageMinRightDiv1); lpUser->m_AttackDamageMaxRight = ((Strength + Dexterity) / this->m_Data[Class].AttackDamageMaxRightDiv1); lpUser->m_AttackDamageMinLeft = ((Strength + Dexterity) / this->m_Data[Class].AttackDamageMinLeftDiv1); lpUser->m_AttackDamageMaxLeft = ((Strength + Dexterity) / this->m_Data[Class].AttackDamageMaxLeftDiv1); } else if( Class == CLASS_FIGHTER ) { lpUser->m_AttackDamageMinRight = Vitality / this->m_Data[Class].AttackDamageMinRightDiv1 + Strength / this->m_Data[Class].AttackDamageMinRightDiv2; lpUser->m_AttackDamageMaxRight = Vitality / this->m_Data[Class].AttackDamageMaxRightDiv1 + Strength / this->m_Data[Class].AttackDamageMaxRightDiv2; lpUser->m_AttackDamageMinLeft = Vitality / this->m_Data[Class].AttackDamageMinLeftDiv1 + Strength / this->m_Data[Class].AttackDamageMinLeftDiv2; lpUser->m_AttackDamageMaxLeft = Vitality / this->m_Data[Class].AttackDamageMaxLeftDiv1 + Strength / this->m_Data[Class].AttackDamageMaxLeftDiv2; } else { lpUser->m_AttackDamageMinRight = Strength / 8; lpUser->m_AttackDamageMaxRight = Strength / 4; lpUser->m_AttackDamageMinLeft = Strength / 8; lpUser->m_AttackDamageMaxLeft = Strength / 4; } #endif }
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); }
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); }