#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Item.h" using namespace Item; // -------------------------------------------------------------------------------------- // Desc : InstallSocket - ¼ÒÄÏ¿¡ º¸¼®À» ¹Ú´Â ¼ø¼­. // // 1. º¸¼®À» ã´Â´Ù. // 2. Àåºñ¸¦ ã´Â´Ù. // 3. Àåºñ¿¡ º¸¼®À» ¹Ú´Â´Ù. // 4. º¸¼®À» ¾ø¾Ø´Ù. // 5. ij¸¯ÅÍ ´É·ÂÄ¡¸¦ Àç°è»êÇÑ´Ù. // -------------------------------------------------------------------------------------- CEquipment::EQUIPMENT_ERROR CEquipment::InstallSocket(CItem& Gem) { using namespace Item; // ¾ÆÀÌÅÛÀÌ º¸¼®ÀÌ ¸Â´Â°¡ È®ÀÎ unsigned short usGemTypeID = Gem.GetPrototypeID(); // edith 2008.08.10 À¯·á ¼ÒÄÏ º¸¼® ó¸® // 8¹ø ¼ÒÄÏ ¿ÀÇ º¸¼®À̸é.. if(usGemTypeID == EtcItemID::GEM_MAXSOCKET_ID) { // º¸¼® °³¼ö È®ÀÎ if (0 == Gem.GetNumOrDurability()) { return E_GET_GEM_FAILED; } if(m_cUpgradeLevel != EquipmentInfo::MAX_UPGRADE_LEVEL) { return E_SOCKET_NOT_MAX; } // ¼ÒÄÏ ¹øÈ£°¡ 7¹øÀÌ ¾Æ´Ï¸é. if(m_cMaxSocket != EquipmentInfo::MAX_SOCKET_NUM-1) { return E_SOCKET_NOT_MAX; } // ÃÖ´ë ¼ÒÄÏÀ» 1°³ Áõ°¡½ÃŲ´Ù. ++m_cMaxSocket; if(m_cMaxSocket >= EquipmentInfo::MAX_SOCKET_NUM) m_cMaxSocket = EquipmentInfo::MAX_SOCKET_NUM; Gem.SetNumOrDurability(Gem.GetNumOrDurability() - 1); return S_SUCCESS; } // UnInstall Socket º¸¼®À̸é. if(usGemTypeID == EtcItemID::GEM_UNSOCKET_ID) { // º¸¼® °³¼ö È®ÀÎ if (0 == Gem.GetNumOrDurability()) { return E_GET_GEM_FAILED; } // ÀνºÅçµÈ ¼ÒÄÏÀÌ ¾ø´Ù. if(m_cSocketNum == 0) { return E_SOCKET_NOT_INST; } m_cSocketNum = 0; std::fill_n(m_cSocket, int(EquipmentInfo::MAX_SOCKET_NUM), 0); ApplyGemAttribute(REMOVE); InitializeGemAttribute(); ApplyGemAttribute(APPLY); Gem.SetNumOrDurability(Gem.GetNumOrDurability() - 1); // ±×·¹À̵å/°¡°Ý Àç°è»ê CalculateItemGrade(); CalculateItemPrice(); // 3Â÷ ¹ë·±½º ÆÐÄ¡ (S±×·¹ÀÌµå ¾ÆÀÌÅÛ Á¦ÇѼ± º¸Á¤) RevisionLimit(); return S_SUCCESS; } // ÇöÀç ¾ÆÀÌÅÛ¿¡ ³²¾Æ ÀÖ´Â ¼ÒÄÏ °³¼ö °Ë»ç. ¼ÒÄÏÀÌ ÀüºÎ Â÷¸é ´õ ¸ø ¹Úµµ·Ï ÇÑ´Ù. if (EquipmentInfo::MAX_SOCKET_NUM < m_cMaxSocket || m_cMaxSocket <= m_cSocketNum) { return E_OVER_MAX_SOCKET; } // ÆÛÆåÆ® º¸¼®Àº ÇöÀç ¼ÒÄÏ¿¡ ¸ø¹Ú°Ô ¼öÁ¤ÇÑ´Ù. if (usGemTypeID < EtcItemID::GEM_START_ID || EtcItemID::GEM_RUNE_END_ID < usGemTypeID) { return E_NOT_GEM; } // ·éº¸¼®ÀÌ¸é ¹ÚÀ»¼ö ÀÕ´Â Àåºñ¸¦ °Ë»öÇÑ´Ù. if(EtcItemID::GEM_RUNE_START_ID <= usGemTypeID) { // ·éº¸¼®Àº ¹ÚÀ»¼ö ÀÖ´Â Àåºñ°¡ Á¤ÇØÁ® ÀÖ´Ù. CEquipment* lpEquip = CEquipment::DowncastToEquipment(this); if (NULL == lpEquip) return E_NOT_GEM; // ·éÀº Çï¸ä°ú ¾Æ¸Ó¸¸ ÇÑ´Ù. switch (Item::CItemType::GetEquipType(lpEquip->GetItemInfo().m_DetailData.m_dwFlags)) { case Item::CItemType::HELM_TYPE: case Item::CItemType::ARMOUR_TYPE: // À̰ÅÀ϶© ·éº¸¼®À» ¹ÞÀ»¼ö ÀÖ´Ù. break; default: // Àú2°³À̿ܿ¡´Â º¸¼®À» ¹ÚÀ»¼ö ¾ø´Ù. return E_NOT_GEM; } } // º¸¼® °³¼ö È®ÀÎ if (0 == Gem.GetNumOrDurability()) { return E_GET_GEM_FAILED; } unsigned char cGemType = usGemTypeID - EtcItemID::GEM_START_ID; // Áª ¼Ó¼º ¾ò±â ApplyGemAttribute(REMOVE); // cGemTypeÀÌ 0ÀÏ ¼ö Àֱ⠶§¹®¿¡, +1À» ÇØ¼­ ³Ö¾îÁØ´Ù. AddSocket(cGemType + 1); InitializeGemAttribute(); ApplyGemAttribute(APPLY); Gem.SetNumOrDurability(Gem.GetNumOrDurability() - 1); // ±×·¹À̵å/°¡°Ý Àç°è»ê CalculateItemGrade(); CalculateItemPrice(); // 3Â÷ ¹ë·±½º ÆÐÄ¡ (S±×·¹ÀÌµå ¾ÆÀÌÅÛ Á¦ÇѼ± º¸Á¤) RevisionLimit(); // edith »õ·Î¿î Àåºñ·Î ¼³Á¤. if(0 == GetSeasonRecord()) SetNewEquip(); return S_SUCCESS; } CEquipment::EQUIPMENT_ERROR CEquipment::InstallRuneSocket(CItem& Rune, bool bEquip, unsigned char cLevel) { // ¾ÆÀÌÅÛÀÌ ·é ¾ÆÀÌÅÛÀÌ ¸Â´Â°¡ È®ÀÎ. unsigned short usRuneTypeID = Rune.GetPrototypeID(); if(usRuneTypeID < EtcItemID::RUNE_START_ID || EtcItemID::RUNE_END_ID < usRuneTypeID) { return E_NOT_RUNE; } // ·é ¾ÆÀÌÅÛÀ» ÀåÂø °¡´ÉÇÑÁö üũ. unsigned char cRuneSlot = GetRuneEquipable(); if(!cRuneSlot) { return E_NOT_RUNE_SLOT; } // ·é ¾ÆÀÌÅÛ¿¡ ÀåÂøÁ¦ÇÑ Ã¼Å©(·¹º§Á¦ÇÑ). if(bEquip) { const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(usRuneTypeID); if(itemInfo) { if(itemInfo->m_UseLimit.m_cLimitStatus==Item::StatusLimit::LEVEL) { if(cLevelm_UseLimit.m_wLimitValue) { return E_NOT_RUNE_LEVEL_LIMIT; } } } else { return E_NOT_RUNE_SCRIPT_INFO; } } // ·é °³¼ö È®ÀÎ if(!Rune.GetNumOrDurability()) { return E_GET_RUNE_FAILED; } unsigned short usRuneType = usRuneTypeID - EtcItemID::RUNE_START_ID; // ·éÀ» ¿ì¼±Á¦¿Ü // AddAttribute(Item::Attribute::Type::RUNE, usRuneType); Rune.SetNumOrDurability(Rune.GetNumOrDurability() - 1); // ±×·¹À̵å/°¡°Ý Àç°è»ê CalculateItemGrade(); CalculateItemPrice(); // 3Â÷ ¹ë·±½º ÆÐÄ¡ (S±×·¹ÀÌµå ¾ÆÀÌÅÛ Á¦ÇѼ± º¸Á¤) RevisionLimit(); // edith »õ·Î¿î Àåºñ·Î ¼³Á¤. if(0 == GetSeasonRecord()) SetNewEquip(); return R_SUCCESS; } CEquipment::EQUIPMENT_ERROR CEquipment::UnInstallRuneSocket(CItem& Rune, bool bEquip, unsigned char cLevel, unsigned short usSkillPoint) { // ¾ÆÀÌÅÛÀÌ ·é ¾ÆÀÌÅÛÀÌ ¸Â´Â°¡ È®ÀÎ. unsigned short usRuneTypeID = Rune.GetPrototypeID(); if(usRuneTypeID < EtcItemID::RUNE_START_ID || EtcItemID::RUNE_END_ID < usRuneTypeID) { return E_NOT_RUNE; } // ¼Ò¸ê ·éÀÎÁö üũ. if(usRuneTypeID!=EtcItemID::DESTRUCTION_RUNE) { return E_NOT_RUNE; } // »èÁ¦ °¡´ÉÇÑÁö üũ (½ºÅ³Æ÷ÀÎÆ®). if(bEquip) { if(usSkillPointm_EquipAttribute.m_usAttributeValue[Attribute::SKILL_POINT]; } } return usRune; } bool Item::CEquipment::GetRuneCheckSkill(CCharacter* lpCharacter, Item::ItemPos itemPos, bool bChk) { // ·é ¾ÆÀÌÅÛÀÌ ÀåÂø µÇ¾î ÀÖÀ¸¸é ½ºÅ³ Æ÷ÀÎÆ® üũ. Item::CEquipment* lpDstEquipment = Item::CEquipment::DowncastToEquipment(lpCharacter->GetItem(itemPos)); unsigned short usRuneSkillPoint = GetAllRuneSkillPointCheck(); SKILL skill = lpCharacter->GetSkill(); if(usRuneSkillPoint) { short sSkillPoint = lpCharacter->GetStatus().m_StatusInfo.m_wSkillPoint - skill.GetSkillNum(); if(sSkillPoint<0) { ERRLOG1(g_Log, "CID:0x%08x »ç¿ëÇÑ ½ºÅ³Æ÷ÀÎÆ®°¡ ÃÖ´ë ½ºÅ³Æ÷ÀÎÆ®º¸´Ù Ŭ °æ¿ì", lpCharacter->GetCID()); return false; } if(lpDstEquipment && bChk) { unsigned short usDstRuneSkillPoint = lpDstEquipment->GetAllRuneSkillPointCheck(); if(usDstRuneSkillPoint) { usRuneSkillPoint = std::max(usRuneSkillPoint, usDstRuneSkillPoint) - std::min(usRuneSkillPoint, usDstRuneSkillPoint); } } if(usRuneSkillPoint>sSkillPoint) { return false; } } return true; } CEquipment::EQUIPMENT_ERROR CEquipment::UpgradeItem(CItem& Mineral_InOut, unsigned long dwCurrentGold_In, unsigned long& dwUsedGold_Out, unsigned char& cValue_Out) // cValue_Out ³»±¸µµ ´Ù¿îÀ¸·Î »ç¿ë. { dwUsedGold_Out = 0; // edith 2009.09.17 ÄÚ¾î½Ã½ºÅÛ Ãß°¡ if(Mineral_InOut.GetPrototypeID() == EtcItemID::AWAKENCORE) { enum CoreArrayType { CORE_PERSENT_SUCCESS_AWAKEN = 0, CORE_PERSENT_FAIL_LEVEL_KEEP = 1, CORE_PERSENT_FAIL_LEVEL1_DOWN = 2, CORE_PERSENT_FAIL_DUR_DOWN = 3, CORE_MINERAL_NUM = 4, MAX_CORE_ROW = 5 }; // ±èÀ翬 Á¦·Ã ¼º°øÀ² static const unsigned short s_UpgradeCoreTable[EquipmentInfo::MAX_CORE_LEVEL][MAX_CORE_ROW] = { // ¼º°øÈ®À² ´Ù¿îÈ®·ü(0) ´Ù¿îÈ®·ü(-1) ³»±¸´Ù¿îÈ®À² ±¤¹° °³¼ö { 50, 100, 0, 60, 1 }, { 50, 100, 0, 60, 1 }, { 35, 100, 0, 60, 1 }, { 19, 100, 0, 60, 1 }, { 3, 100, 0, 60, 1 } }; // °¢¼ºÀÇ Äھ 100ÆÛ¼¾Æ® ¼º°ø if(GetSeasonRecord() == 3 && m_cCoreLevel >= 5) // °¢¼ºÀÇ ½ÃÁð·¹ÄÚµåÀ̸é. { // ÀÌ¹Ì °¢¼ºµÈ ¾ÆÀÌÅÛÀÌ¸é ´Ù½Ã °¢¼ºÇÒ¼ö ¾ø´Ù. return E_NOT_UPGRADE_AWAKEN; } // µ·Àº ÃæºÐÇѰ¡? unsigned long dwNeedGold = GetUpgradePrice(); if (dwCurrentGold_In < dwNeedGold) { return E_NOT_ENOUGH_MONEY; } // ³»±¸µµ´Â ÃæºÐÇѰ¡. unsigned char cMaxDur = GetMaxNumOrDurability(); if(cMaxDur <= 10) { return E_NOT_UPGRADE_MINENDURANCE; } // °³¼ö´Â ÃæºÐÇѰ¡? int nDiffMineralNum = static_cast(Mineral_InOut.GetNumOrDurability() - 1); if (nDiffMineralNum < 0) { return E_NOT_ENOUGH_MINERAL; } // ±¤¹°¿¡ ¸ÂÃç ¼º°ø È®·üÀ» °áÁ¤ unsigned short wSuccessPercent = s_UpgradeCoreTable[m_cCoreLevel][CORE_PERSENT_SUCCESS_AWAKEN];; switch(m_GradeInfo.m_eItemGrade) { case Item::EquipType::S_GRADE: case Item::EquipType::AAA_GRADE: case Item::EquipType::AA_GRADE: case Item::EquipType::A_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*0.7f); break; case Item::EquipType::B_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent); break; case Item::EquipType::C_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*1.2f); break; case Item::EquipType::D_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*1.6f); break; case Item::EquipType::F_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*2.2f); break; default: break; } // ±¤¹° Á¦°Å, µ· Á¦°Å Mineral_InOut.SetNumOrDurability(nDiffMineralNum); dwUsedGold_Out = dwNeedGold; // Á¦·Ã ¼º°øÀ² Á¶Á¤ wSuccessPercent = (unsigned short)((float)wSuccessPercent*(CServerSetup::GetInstance().GetRefineDefault() / 100.0f)); // Á¦·Ã ¼º°ø if (wSuccessPercent > Math::Random::ComplexRandom(100)) { // °¢¼ºÀÇ ½ÃÁð·¹ÄÚµå·Î ¼öÁ¤ÇÑ´Ù. if(3 != GetSeasonRecord()) { SetNewEquip(3); m_cCoreLevel = 1; } else m_cCoreLevel++; } // Á¦·Ã ½ÇÆÐ else { unsigned char cLevelDownNum = 0; unsigned char cPersent = static_cast(Math::Random::ComplexRandom(100)); if (cPersent < s_UpgradeCoreTable[m_cCoreLevel][CORE_PERSENT_FAIL_LEVEL_KEEP]) { // ·¹º§ ´Ù¿î ¾øÀ½ cLevelDownNum = 0; } else { cPersent -= s_UpgradeCoreTable[m_cCoreLevel][CORE_PERSENT_FAIL_LEVEL_KEEP]; if (cPersent < s_UpgradeCoreTable[m_cCoreLevel][CORE_PERSENT_FAIL_LEVEL1_DOWN]) { // 1·¹º§ ´Ù¿î cLevelDownNum = 1; } else { // 2·¹º§ ´Ù¿î cLevelDownNum = 2; } } // ·¹º§À» ´Ù¿î½ÃŲ´Ù. if(3 == GetSeasonRecord()) { for(int i = 0; i < cLevelDownNum; ++i) { if(m_cCoreLevel > 0) --m_cCoreLevel; } if(m_cCoreLevel == 0) SetNewEquip(); } unsigned char cPersent2 = static_cast(Math::Random::ComplexRandom(100)); // ÇöÀç 30À̶õ°ªÀÌ µé¾îÀÖ´Ù. Áï 30ÇÁ·Î·Î ³»±¸µµ°¡ °¨¼ÒÇÑ´Ù. if (cPersent2 < s_UpgradeCoreTable[m_cCoreLevel][CORE_PERSENT_FAIL_DUR_DOWN]) { // edith 2008.07.03 Á¦·Ã ½ÇÆÐ½Ã ÃÖ´ë ³»±¸µµ °¨¼Ò unsigned char cMaxDur = GetMaxNumOrDurability(); unsigned char cDownDur = 0; // ¹«Á¶°Ç 10¾¿ °¨¼Ò. cDownDur = 10; if(cMaxDur-cDownDur <= 0) SetMaxNumOrDurability(1); else SetMaxNumOrDurability(cMaxDur-cDownDur); SetNumOrDurability(1); } cValue_Out = GetMaxNumOrDurability(); } // ±×·¹À̵å/°¡°Ý Àç°è»ê CalculateItemGrade(); CalculateItemPrice(); // 3Â÷ ¹ë·±½º ÆÐÄ¡ (S±×·¹ÀÌµå ¾ÆÀÌÅÛ Á¦ÇѼ± º¸Á¤) RevisionLimit(); return S_SUCCESS; } else if(Mineral_InOut.GetPrototypeID() == EtcItemID::ENDURANCESTONE) { // ³»±¸µµ ȸº¹ ¾ÆÀÌÅÛÀº 100ÆÛ¼¾Æ® ¼º°ø // µ·Àº ÃæºÐÇѰ¡? unsigned long dwNeedGold = GetUpgradePrice(); if (dwCurrentGold_In < dwNeedGold) { return E_NOT_ENOUGH_MONEY; } // °³¼ö´Â ÃæºÐÇѰ¡? int nDiffMineralNum = static_cast(Mineral_InOut.GetNumOrDurability() - 1); if (nDiffMineralNum < 0) { return E_NOT_ENOUGH_MINERAL; } // ³»±¸µµ´Â ÃæºÐÇѰ¡. unsigned char cMaxDur = GetMaxNumOrDurability(); if(cMaxDur >= 100) { return E_NOT_UPGRADE_ENDURANCE; } // edith 2008.07.03 ÃÖ´ë ³»±¸µµ º¹±¸ ¾ÆÀÌÅÛ »ç¿ë¼º°ø. unsigned char cCurDur = GetNumOrDurability(); // ±¤¹° Á¦°Å, µ· Á¦°Å Mineral_InOut.SetNumOrDurability(nDiffMineralNum); dwUsedGold_Out = dwNeedGold; cMaxDur = cMaxDur+100; if(cMaxDur >= 150) cMaxDur = 150; SetMaxNumOrDurability(cMaxDur); SetNumOrDurability(cCurDur); cValue_Out = GetMaxNumOrDurability(); // ±×·¹À̵å/°¡°Ý Àç°è»ê CalculateItemGrade(); CalculateItemPrice(); // 3Â÷ ¹ë·±½º ÆÐÄ¡ (S±×·¹ÀÌµå ¾ÆÀÌÅÛ Á¦ÇѼ± º¸Á¤) RevisionLimit(); if(0 == GetSeasonRecord()) SetNewEquip(); return S_SUCCESS; } // edith ¾ÆÀÌÅÛ ¾÷±×·¹À̵å enum ArrayType { PERSENT_SUCCESS_SILVIN = 0, PERSENT_SUCCESS_MITHRIL = 1, PERSENT_SUCCESS_ITERNIUM = 2, PERSENT_SUCCESS_SOULMETAL = 3, PERSENT_SUCCESS_ANTONIUM = 4, PERSENT_SUCCESS_ANCIENTMETAL = 5, PERSENT_FAIL_LEVEL_KEEP = 6, PERSENT_FAIL_LEVEL1_DOWN = 7, PERSENT_FAIL_DUR_DOWN = 8, MINERAL_NUM = 9, MAX_ROW = 10 }; // edith 2010.01.23 ¾ÆÀÌÅÛ Á¦·Ã ½ÇÆÐ½Ã ¾ÆÀÌÅÛ ·¹º§ ´Ù¿î±×·¹À̵å È®À² ÁöÁ¤. // ±èÀ翬 Á¦·Ã ¼º°øÀ² static const unsigned short s_UpgradeTable[EquipmentInfo::MAX_UPGRADE_LEVEL][MAX_ROW] = { // ¼º°øÈ®·ü(½Çºó) ¼º°øÈ®·ü(¹Ì½º¸±) ¼º°øÈ®·ü(ÀÌÅÍ´Ï¿ò) ¼º°øÈ®·ü(¼Ö¸ÞÅ») ¼º°øÈ®·ü(¶óŸ¸®À³) ¼º°øÈ®·ü(°í´ëÀÇ µ¹) ´Ù¿îÈ®·ü(0) ´Ù¿îÈ®·ü(-1) ³»±¸´Ù¿îÈ®À² ±¤¹° °³¼ö { 50, 60, 70, 80, 0, 0, 80, 20, 30, 1 }, { 50, 60, 70, 80, 0, 0, 80, 20, 30, 1 }, { 50, 60, 70, 80, 0, 0, 80, 20, 30, 1 }, { 50, 60, 70, 80, 0, 0, 80, 20, 30, 1 }, { 50, 60, 70, 80, 0, 0, 80, 20, 30, 1 }, { 35, 43, 51, 59, 0, 0, 80, 20, 30, 1 }, { 27, 35, 43, 51, 0, 0, 80, 20, 30, 1 }, { 19, 27, 35, 43, 0, 0, 80, 20, 30, 1 }, { 11, 19, 27, 35, 0, 0, 80, 20, 30, 1 }, { 3, 11, 19, 27, 0, 0, 80, 20, 30, 1 } }; // ¾÷±×·¹À̵带 ÇѰè±îÁö Çß´ÂÁö È®ÀÎ if (EquipmentInfo::MAX_UPGRADE_LEVEL <= m_cUpgradeLevel) { return E_UPGRADE_LEVEL_IS_FULL; } // S±×·¹À̵åÀÌ¸é ¾÷±×·¹ÀÌµå ºÒ°¡´ÉÇÏ°Ô ÇÑ´Ù. if(m_GradeInfo.m_eItemGrade == Item::EquipType::S_GRADE) { return E_UPGRADE_LEVEL_IS_FULL; } // µ·Àº ÃæºÐÇѰ¡? unsigned long dwNeedGold = GetUpgradePrice(); if (dwCurrentGold_In < dwNeedGold) { return E_NOT_ENOUGH_MONEY; } // ³»±¸µµ´Â ÃæºÐÇѰ¡. unsigned char cMaxDur = GetMaxNumOrDurability(); if(cMaxDur <= 10) { return E_NOT_UPGRADE_MINENDURANCE; } // ±¤¹°¿¡ ¸ÂÃç ¼º°ø È®·üÀ» °áÁ¤ unsigned short wSuccessPercent = 0; float fSuccessLimitGrade = 1.0f; unsigned char cType = 0; switch (Mineral_InOut.GetPrototypeID()) { case EtcItemID::SILVIN: wSuccessPercent = s_UpgradeTable[m_cUpgradeLevel][PERSENT_SUCCESS_SILVIN]; fSuccessLimitGrade = 0.3f; break; case EtcItemID::MITHRIL: wSuccessPercent = s_UpgradeTable[m_cUpgradeLevel][PERSENT_SUCCESS_MITHRIL]; fSuccessLimitGrade = 0.5f; break; case EtcItemID::ITERNIUM: wSuccessPercent = s_UpgradeTable[m_cUpgradeLevel][PERSENT_SUCCESS_ITERNIUM]; fSuccessLimitGrade = 0.8f; break; case EtcItemID::SOULMETAL: wSuccessPercent = s_UpgradeTable[m_cUpgradeLevel][PERSENT_SUCCESS_SOULMETAL]; break; case EtcItemID::ANTONIUM: wSuccessPercent = s_UpgradeTable[m_cUpgradeLevel][PERSENT_SUCCESS_ANTONIUM]; break; case EtcItemID::ANCIENTMETAL: wSuccessPercent = s_UpgradeTable[m_cUpgradeLevel][PERSENT_SUCCESS_ANCIENTMETAL]; break; } switch(m_GradeInfo.m_eItemGrade) { case Item::EquipType::S_GRADE: case Item::EquipType::AAA_GRADE: case Item::EquipType::AA_GRADE: case Item::EquipType::A_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*fSuccessLimitGrade); break; case Item::EquipType::B_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent); break; case Item::EquipType::C_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*1.2f); break; case Item::EquipType::D_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*1.6f); break; case Item::EquipType::F_GRADE: wSuccessPercent = (unsigned short)(wSuccessPercent*2.2f); break; default: break; } if (0 == wSuccessPercent) { return E_NOT_MATCH_MINERAL_TYPE; } // °³¼ö´Â ÃæºÐÇѰ¡? int nDiffMineralNum = static_cast(Mineral_InOut.GetNumOrDurability()) - static_cast(s_UpgradeTable[m_cUpgradeLevel][MINERAL_NUM]); if (nDiffMineralNum < 0) { return E_NOT_ENOUGH_MINERAL; } // °í´ëÀÇ µ¹¿¡ °æ¿ì. if(Mineral_InOut.GetPrototypeID()==EtcItemID::ANCIENTMETAL) { if(m_cUpgradeCnt==Item::MAX_UPGRADE_COUNT) { return E_NOT_UPGRADE_AS_OVER; } else { m_cUpgradeCnt++; } } else { /* if( Mineral_InOut.GetPrototypeID()==EtcItemID::SILVIN || Mineral_InOut.GetPrototypeID()==EtcItemID::ITERNIUM || Mineral_InOut.GetPrototypeID()==EtcItemID::SOULMETAL || Mineral_InOut.GetPrototypeID()==EtcItemID::MITHRIL) */ // ANTONIUM Á¦¿Ü (100% È®À²À̱⠶§¹®¿¡) if(Mineral_InOut.GetPrototypeID()!=EtcItemID::ANTONIUM) { m_cUpgradeCnt = 0; } } // ±¤¹° Á¦°Å, µ· Á¦°Å Mineral_InOut.SetNumOrDurability(nDiffMineralNum); dwUsedGold_Out = dwNeedGold; // Á¦·Ã ¼º°øÀ² Á¶Á¤ wSuccessPercent = (unsigned short)((float)wSuccessPercent*(CServerSetup::GetInstance().GetRefineDefault() / 100.0f)); /* #ifdef _DEBUG wSuccessPercent = 100; #endif */ // Á¦·Ã ¼º°ø if (wSuccessPercent > Math::Random::ComplexRandom(100)) { ++m_cUpgradeLevel; // ¿É¼Ç °­È­ if (m_cUpgradeLevel <= MAX_LEVEL_OPTION_UPGRADE) { ApplyUpgradeAttribute(REMOVE); InitializeUpgradeAttribute(); ApplyUpgradeAttribute(APPLY); } // ¼ÒÄÏ Áõ°¡ else { ++m_cMaxSocket; } } // Á¦·Ã ½ÇÆÐ else { unsigned char cLevelDownNum = 0; unsigned char cPersent = static_cast(Math::Random::ComplexRandom(100)); if (cPersent < s_UpgradeTable[m_cUpgradeLevel][PERSENT_FAIL_LEVEL_KEEP]) { // ·¹º§ ´Ù¿î ¾øÀ½ cLevelDownNum = 0; } else { cPersent -= s_UpgradeTable[m_cUpgradeLevel][PERSENT_FAIL_LEVEL_KEEP]; if (cPersent < s_UpgradeTable[m_cUpgradeLevel][PERSENT_FAIL_LEVEL1_DOWN]) { // 1·¹º§ ´Ù¿î cLevelDownNum = 1; } else { // 2·¹º§ ´Ù¿î cLevelDownNum = 2; } } // // s±×·¹À̵å Á¦·Ã ½ÇÆÐ½Ã ·¹º§´Ù¿î ¾øÀ½ // ¼Ó¼º ÃÖ¼Ò°ª¿¡ÇØ´çÇÏ¸é ·¹º§´Ù¿îÀ» ½ÃµµÇÏÁö ¾Ê´Â´Ù. for (unsigned char cIndex = 0; cIndex < Item::Attribute::MAX_ATTRIBUTE_NUM; ++cIndex) { if (true == CheckAttributeLimit(static_cast(cIndex), cType)) { cLevelDownNum = 0; break; } } unsigned char cPersent2 = static_cast(Math::Random::ComplexRandom(100)); // ÇöÀç 30À̶õ°ªÀÌ µé¾îÀÖ´Ù. Áï 30ÇÁ·Î·Î ³»±¸µµ°¡ °¨¼ÒÇÑ´Ù. if (cPersent2 < s_UpgradeTable[m_cUpgradeLevel][PERSENT_FAIL_DUR_DOWN]) { // edith 2008.07.03 Á¦·Ã ½ÇÆÐ½Ã ÃÖ´ë ³»±¸µµ °¨¼Ò unsigned char cMaxDur = GetMaxNumOrDurability(); unsigned char cDownDur = 0; // ¹«Á¶°Ç 10¾¿ °¨¼Ò. cDownDur = 10; if(cMaxDur-cDownDur <= 0) SetMaxNumOrDurability(1); else SetMaxNumOrDurability(cMaxDur-cDownDur); cValue_Out = GetMaxNumOrDurability(); SetNumOrDurability(1); } else { // ³»±¸µµ °¨¼Ò ¾øÀ½. cValue_Out = 0; } for (unsigned char cIndex = 0; cIndex < cLevelDownNum; ++cIndex) { if (0 < m_cUpgradeLevel) { // ¿É¼Ç ´Ù¿î if (m_cUpgradeLevel <= MAX_LEVEL_OPTION_UPGRADE) { --m_cUpgradeLevel; ApplyUpgradeAttribute(REMOVE); InitializeUpgradeAttribute(); ApplyUpgradeAttribute(APPLY); } // ¼ÒÄÏ °¨¼Ò else { // ¼ÒÄÏ¿¡ ¸ðµÎ º¸¼®ÀÌ ¹ÚÇôÀÖ´Â °æ¿ì ¼ÒÄϰú ÇÔ²² º¸¼® È¿°úµµ ¾ø¾ÖÁØ´Ù. if (m_cSocketNum == m_cMaxSocket) { --m_cSocketNum; m_cSocket[m_cSocketNum] = 0; } ApplyGemAttribute(REMOVE); InitializeGemAttribute(); ApplyGemAttribute(APPLY); --m_cMaxSocket; --m_cUpgradeLevel; } } } } // edith 2009.08.31 Á¦·Ã½Ã ¼ÒÄÏÀÇ ÀÌ»óÀ¯¹«¸¦ È®ÀÎÇØ¼­ ó¸®ÇÑ´Ù. if (m_cUpgradeLevel <= MAX_LEVEL_OPTION_UPGRADE) { // ¾÷±×·¹ÀÌµå ·¹º§ÀÌ 5 ÀÌÇÏÀ϶§ Àý´ë ¼ÒÄÏÀÌ 2°³ ÀÌ»óÀÌ µÉ¼ö ¾ø´Ù. if(m_cMaxSocket >= 3) { // ÀÌ°Ç ÀÌ»óÇÑ ¾ÆÀÌÅÛÀÌ´Ù. ¼ÒÄÏÀ» 0À¸·Î ¸¸µé¾î¶ó. m_cMaxSocket = 0; m_cSocketNum = 0; ZeroMemory(m_cSocket, sizeof(m_cSocket)); } } else { if(m_cMaxSocket >= EquipmentInfo::MAX_SOCKET_NUM) { m_cMaxSocket = EquipmentInfo::MAX_SOCKET_NUM-1; if (m_cSocketNum >= m_cMaxSocket) { m_cSocketNum = m_cMaxSocket; m_cSocket[m_cSocketNum] = 0; } } } // ±×·¹À̵å/°¡°Ý Àç°è»ê CalculateItemGrade(); CalculateItemPrice(); // 3Â÷ ¹ë·±½º ÆÐÄ¡ (S±×·¹ÀÌµå ¾ÆÀÌÅÛ Á¦ÇѼ± º¸Á¤) RevisionLimit(); if(0 == GetSeasonRecord()) SetNewEquip(); return S_SUCCESS; } bool CUseItem::UseCashItem(CCharacter* lpSender, CCharacter* lpRecver, Item::ItemPos itemPos, unsigned short& wError) { using namespace ItemType; if (0 == lpSender->GetStatus().m_nNowHP) { ERRLOG1(g_Log, "CID:0x%08x Á×Àº ij¸¯ÅͰ¡ ¾ÆÀÌÅÛÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", lpSender->GetCID()); return false; } char* szErrorString = NULL; switch (m_ItemInfo.m_DetailData.m_cItemType) { case CASH_ITEM: { if (false == lpSender->UseCashItem(lpSender->GetCID(), lpRecver->GetCID(), itemPos, (unsigned short)m_ItemInfo.m_UseItemInfo.m_dwAmount, wError)) { szErrorString = "ij½¬¾ÆÀÌÅÛ"; wError = PktUI::USE_FAILED; } break; } default: szErrorString = "¾ÆÀÌÅÛ"; break; } if (NULL == szErrorString) { // ij½¬¾ÆÀÌÅÛÀº °á°ú¸¦ ¹ÞÀºÈÄ ³»±¸µµ¸¦ ÁÙÀδÙ. if (m_ItemData.m_cNumOrDurability <= 0) { ERRLOG5(g_Log, "CID:0x%08x %sÀ»(¸¦) »ç¿ëÇϴµ¥ ½ÇÆÐÇß½À´Ï´Ù.(³»±¸µµ:0) " "ItemProtoTypeID : %d, SkillID : 0x%04x, LockCount : %d", lpSender->GetCID(), szErrorString, m_ItemData.m_usProtoTypeID, m_ItemInfo.m_UseItemInfo.m_usSkill_ID, m_ItemInfo.m_UseItemInfo.m_usSkill_LockCount); return false; } } else { ERRLOG5(g_Log, "CID:0x%08x %sÀ»(¸¦) »ç¿ëÇϴµ¥ ½ÇÆÐÇß½À´Ï´Ù. " "ItemProtoTypeID : %d, SkillID : 0x%04x, LockCount : %d", lpSender->GetCID(), szErrorString, m_ItemData.m_usProtoTypeID, m_ItemInfo.m_UseItemInfo.m_usSkill_ID, m_ItemInfo.m_UseItemInfo.m_usSkill_LockCount); return false; } return true; } bool CUseItem::Use(CCharacter* lpSender, CCharacter* lpRecver, Item::ItemPos itemPos, unsigned short& wError) { using namespace ItemType; if (0 == lpSender->GetStatus().m_nNowHP) { ERRLOG1(g_Log, "CID:0x%08x Á×Àº ij¸¯ÅͰ¡ ¾ÆÀÌÅÛÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", lpSender->GetCID()); return false; } char* szErrorString = NULL; switch (m_ItemInfo.m_DetailData.m_cItemType) { case AMMO: { if (false == lpSender->UseAmmo(this)) { szErrorString = "źȯ"; wError = PktUI::USE_FAILED; } break; } case POTION: { if (false == UsePotion(lpSender, lpRecver)) { szErrorString = "Æ÷¼Ç ¾ÆÀÌÅÛ"; wError = PktUI::USE_FAILED; return false; } break; } case FIRE_CRACKER: case SKILL_ITEM: { if (false == UsePotion(lpSender, lpRecver)) { szErrorString = "Æ÷¼ÇÀ̳ª ÆøÁ×, ¶Ç´Â ½ºÅ³ ¾ÆÀÌÅÛ"; wError = PktUI::USE_FAILED; } break; } case EXP_BOOK: { if (false == lpSender->IncrementExp(m_ItemInfo.m_UseItemInfo.m_dwAmount)) { szErrorString = "°æÇèÄ¡ ÄíÆù"; wError = PktUI::USE_FAILED; } break; } case CASH_BOOK: { unsigned long dwSrcGold = lpSender->GetGold(); if (false == lpSender->AddGold(m_ItemInfo.m_UseItemInfo.m_dwAmount, true)) { szErrorString = "ij½¬¹é"; wError = PktUI::USE_FAILED; } else { GAMELOG::LogTakeGold(*lpSender, dwSrcGold, lpSender->GetGold(), m_ItemInfo.m_UseItemInfo.m_dwAmount, TakeType::TS_INVEN, TakeType::TS_INVEN, GAMELOG::sTakeGoldLogV2::USE_CASHBAG, 0); } break; } case EVENT_LOTTERY: { if (false == lpSender->UseLottery(m_ItemData.m_usProtoTypeID)) { szErrorString = "º¹±Ç"; wError = PktUI::USE_FAILED; } break; } case PORTAL: { if (false == CCharRespawnMgr::GetInstance().SendRespawnInfo(lpSender->GetCID())) { szErrorString = "Æ÷Å»(À§Ä¡ ¼±ÅÃÇü)"; wError = PktUI::USE_FAILED; } break; } case SKILL_BOOK: { unsigned short SkillID = GetItemInfo().m_UseItemInfo.m_usSkill_ID; if(SkillID >= 0x8000) { if (false == lpSender->SkillCreate(this)) { szErrorString = "½ºÅ³ºÏ"; wError = PktUI::USE_FAILED; } } else if(0x1000 <= SkillID && SkillID < 0x2000) { if (false == lpSender->AbilityCreate(this)) { szErrorString = "¾îºô¸®Æ¼ºÏ"; wError = PktUI::USE_FAILED; } } break; } case FIXED_PORTAL: { SERVER_ID serverID; serverID.dwID = CServerSetup::GetInstance().GetServerID(); if(m_ItemInfo.m_UseItemInfo.m_cZone!=serverID.GetZone()) { // ±æµåÀü ±Í¼Ó, ±¹°¡Àü ±Í¼Ó üũ if (CGameTimeMgr::GetInstance().IsGuildWarTime() && (lpSender->GetGuildWarFlag() == Creature::WAR_ON || lpSender->GetGuildWarFlag() == Creature::WAR_INSTANCE)) { szErrorString = "±æµåÀüÀïÁß Æ÷Å»(À§Ä¡ °íÁ¤Çü)"; wError = PktUI::USE_FAILED; break; } // ÄÁÅÙÃ÷ : ´ÙÅ© Ä«³ª¹ø ±¹°¡ ÀüÀï if (true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE)) { if ((CGameTimeMgr::GetInstance().IsRealmWarReadyTime() || CGameTimeMgr::GetInstance().IsRealmWarTime()) && (lpSender->GetRealmWarFlag() == Creature::WAR_ON || lpSender->GetRealmWarFlag() == Creature::WAR_INSTANCE)) { szErrorString = "¼®»óÀüÀïÁß Æ÷Å»(À§Ä¡ °íÁ¤Çü)"; wError = PktUI::USE_FAILED; break; } } POS Pos; Pos.fPointX = m_ItemInfo.m_UseItemInfo.m_Pos.m_fPointX; Pos.fPointY = m_ItemInfo.m_UseItemInfo.m_Pos.m_fPointY; Pos.fPointZ = m_ItemInfo.m_UseItemInfo.m_Pos.m_fPointZ; lpSender->MoveZone(Pos, m_ItemInfo.m_UseItemInfo.m_cZone, -1); break; } if (false == lpSender->MovePos(m_ItemInfo.m_UseItemInfo.m_Pos, m_ItemInfo.m_UseItemInfo.m_cZone, false)) { szErrorString = "Æ÷Å»(À§Ä¡ °íÁ¤Çü)"; wError = PktUI::USE_FAILED; } break; } case CAMP_KIT: { if (false == lpSender->UseStartKit(Siege::CAMP, wError)) { szErrorString = "±æµå ¿ä»õ ½ºÅ¸Æ®Å¶"; } break; } case WORLDWEAPON_K_KIT: { if (false == lpSender->UseStartKit(Siege::KARTERANT_WEAPON, wError)) { szErrorString = "ÄÜ¶óÆ¾ ¿ÕÀÇ ±ÇÀ§ ½ºÅ¸ÅÍŶ"; } break; } case WORLDWEAPON_M_KIT: { if (false == lpSender->UseStartKit(Siege::MERKADIA_WEAPON, wError)) { szErrorString = "»ý¸í ÃßÃâ±â ½ºÅ¸ÅÍŶ"; } break; } case MINERAL_KIT: break; case SHORT_RANGE_ARMS_KIT: { if (false == lpSender->UseStartKit(Siege::SHORT_RANGE_SIEGE_ARMS, wError)) { szErrorString = "±Ù°Å¸® °ø¼ºº´±â ½ºÅ¸Æ®Å¶"; } break; } case LONG_RANGE_ARMS_KIT: { if (false == lpSender->UseStartKit(Siege::LONG_RANGE_SIEGE_ARMS, wError)) { szErrorString = "¿ø°Å¸® °ø¼ºº´±â ½ºÅ¸Æ®Å¶"; } break; } case AIRSHIP_KIT: { if (false == lpSender->UseStartKit(Siege::AIRSHIP, wError)) { szErrorString = "ºñ°øÁ¤ ½ºÅ¸Æ®Å¶"; } break; } case QUEST_ITEM: { Quest::QuestNode* lpQuestNode = NULL; lpQuestNode = CQuestMgr::GetInstance().GetQuestNode(m_ItemInfo.m_UseItemInfo.m_wQuestID); if (lpQuestNode) { if (lpQuestNode->IsPartyQuest() && NULL != lpSender->GetParty()) { CCharacterParty* lpParty = reinterpret_cast(lpSender->GetParty()); if (lpParty) { lpParty->StartQuest(lpQuestNode, lpSender->GetCurrentPos(), 0); } } else { if (true == lpSender->CheckQuest(lpQuestNode, wError)) { if (false == lpSender->GiveQuest(lpQuestNode)) { wError = PktUI::FAIL_FULL_QUEST; szErrorString = "Äù½ºÆ® ¾ÆÀÌÅÛ"; } else { CGameClientDispatch* lpDispatch = lpSender->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharStartQuest(lpDispatch->GetSendStream(), lpSender->GetCID(), 0, lpQuestNode->m_wQuestID, PktBase::NO_SERVER_ERR); lpSender->StartPhase(lpQuestNode->m_wQuestID, 1); } } } else { wError = PktUI::FAIL_QUEST_LEVEL; szErrorString = "Äù½ºÆ® ¾ÆÀÌÅÛ"; } } } else { wError = PktUI::NOT_EXIST_QUEST; szErrorString = "Äù½ºÆ® ¾ÆÀÌÅÛ"; } break; } default: szErrorString = "¾ÆÀÌÅÛ"; break; } if (NULL == szErrorString) { if (0 < m_ItemData.m_cNumOrDurability) { --m_ItemData.m_cNumOrDurability; } } else { ERRLOG5(g_Log, "CID:0x%08x %sÀ»(¸¦) »ç¿ëÇϴµ¥ ½ÇÆÐÇß½À´Ï´Ù. " "ItemProtoTypeID : %d, SkillID : 0x%04x, LockCount : %d", lpSender->GetCID(), szErrorString, m_ItemData.m_usProtoTypeID, m_ItemInfo.m_UseItemInfo.m_usSkill_ID, m_ItemInfo.m_UseItemInfo.m_usSkill_LockCount); return false; } return true; } bool CUseItem::UsePotion(CCharacter* lpSender, CCharacter* lpRecver) { AtType attackType; attackType.m_wType = m_ItemInfo.m_UseItemInfo.m_usSkill_ID; attackType.m_cSkillLockCount = m_ItemInfo.m_UseItemInfo.m_usSkill_LockCount; attackType.m_cSkillLevel = 0; unsigned short usSpellID = 0; switch(attackType.m_wType) { case 0x8D12: usSpellID = Skill::SpellID::CD_8D12; break; case 0x8D14: usSpellID = Skill::SpellID::CD_8D14; break; case 0x8D16: usSpellID = Skill::SpellID::CD_8D16; break; case 0x99A1: usSpellID = Skill::SpellID::CD_99A1; break; case 0x99A2: usSpellID = Skill::SpellID::CD_99A2; break; case 0x99A3: usSpellID = Skill::SpellID::CD_99A3; break; } if(usSpellID != 0) { // À§¿¡¼­ °ËÃâµÈ m_wType ¿¡ ÇØ´çÇÏ´Â ½ºÅ³¿¡¼­ ÇØ´ç ½ºÅ³ÀÇ ¹öÇÁ°¡ Á¸ÀçÇϸé // Æ÷¼Ç»ç¿ëÀÌ ½ÇÆÐÇÑ´Ù. CSpell* pSpell = lpSender->GetSpellMgr().GetAffectedInfo().GetSpell(usSpellID); if (NULL != pSpell) // ÀÌ ¹öÇÁ°¡ ¾ø¾îÁ®¾ß¸¸ »ç¿ë°¡´ÉÇÏ´Ù. return false; } unsigned char cOffencerJudge = ClientConstants::Judge_SkillItem; unsigned char cDefenserJudge = 0; unsigned short wOffencerMPHeal = 0; unsigned short wDefenserMPHeal = 0; unsigned short wError = PktBase::NO_SERVER_ERR; unsigned short wDamage = lpRecver->ApplyDamage(attackType, lpSender, cOffencerJudge, cDefenserJudge, wOffencerMPHeal, wDefenserMPHeal, wError); CCell* lpCell = lpRecver->GetCellPos().m_lpCell; if (NULL != lpCell) { DefenserNode node; node.m_wDamage = wDamage; node.m_dwCharID = lpRecver->GetCID(); node.m_sCurrHP = lpRecver->GetStatus().m_nNowHP; node.m_sCurrMP = lpRecver->GetStatus().m_nNowMP; node.m_wMaxHP = lpRecver->GetStatus().m_StatusInfo.m_nMaxHP; node.m_wMaxMP = lpRecver->GetStatus().m_StatusInfo.m_nMaxMP; node.m_wMPHeal = wDefenserMPHeal; node.m_cJudge = cDefenserJudge; lpCell->SendAttackInfo(lpRecver->GetCID(), attackType, 1, &node); } if(usSpellID != 0) { // ÄðŸÀÓ¿¡ °ü·ÃµÈ ¹öÇÁ¸¦ °É¾îÁØ´Ù. const Skill::ProtoType* lpProtoType = CSkillMgr::GetInstance().GetSkillProtoType(attackType.m_wType); if (NULL != lpProtoType) { unsigned short wResult = Skill::CAddSpell(CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, lpSender, Skill::SpellType::PAYBUFF_SPELL, usSpellID, attackType.m_cSkillLockCount, lpProtoType->m_dwCoolDownTime/1000))(lpRecver); } } CGameClientDispatch* lpDispatch = lpRecver->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharAttacked(lpDispatch->GetSendStream(), lpSender, lpRecver, attackType, 0, wDamage, cDefenserJudge, wDefenserMPHeal, wError); } return true; }