Opublikowano 25 Stycznia25 Sty Poszukuje gotowego rozwiązania dla zmianki, która zmieni wszystkie bonusy prócz średnich i obrażeń umiejętności gdzieś to latało, ale wyszukać coś nie mogę ktoś to ma może?
Opublikowano 26 Stycznia26 Sty Nie wiem czy istnieje takie rozwiązanie publicznie. Musiałbyś zrobić nowy case w char_item.cpp na podstawie USE_CHANGE_ATTRIBUTE i chyba najlepszym rozwiązaniem byłoby zamiast wprowadzać zmiany wChangeAttribute to myślę że lepiej stworzyć nową funkcję, która ma zmienioną logikę i pobiera te dwa bonusy zapisuje wartość i przywraca podczas zmiany a resztę zmienia standardowo. Tu ci dałem mniej więcej zarys jakbym to zrobił wiadomo robisz sobie nowy use case dla tej zmianki.C++Kod został skopiowanycase USE_CHANGE_ATTRIBUTE_SPECIAL:{ if (item2->GetAttributeSetIndex() == -1) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("속성을 변경할 수 없는 아이템입니다.")); return false; } if (item2->GetAttributeCount() == 0) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("변경할 속성이 없습니다.")); return false; } if (GM_PLAYER == GetGMLevel() && false == test_server) { // Event Flag 를 통해 이전에 아이템 속성 변경을 한 시간으로 부터 충분한 시간이 흘렀는지 검사 // 시간이 충분히 흘렀다면 현재 속성변경에 대한 시간을 설정 DWORD dwChangeItemAttrCycle = quest::CQuestManager::instance().GetEventFlag(msc_szChangeItemAttrCycleFlag); if (dwChangeItemAttrCycle < msc_dwDefaultChangeItemAttrCycle) dwChangeItemAttrCycle = msc_dwDefaultChangeItemAttrCycle; quest::PC* pPC = quest::CQuestManager::instance().GetPC(GetPlayerID()); if (pPC) { DWORD dwNowMin = get_global_time() / 60; DWORD dwLastChangeItemAttrMin = pPC->GetFlag(msc_szLastChangeItemAttrFlag); if (dwLastChangeItemAttrMin + dwChangeItemAttrCycle > dwNowMin) { ChatPacket( CHAT_TYPE_INFO, LC_TEXT("속성을 바꾼지 %d분 이내에는 다시 변경할 수 없습니다.(%d 분 남음)"), dwChangeItemAttrCycle, dwChangeItemAttrCycle - (dwNowMin - dwLastChangeItemAttrMin) ); return false; } pPC->SetFlag(msc_szLastChangeItemAttrFlag, dwNowMin); } } if (item->GetSubType() == USE_CHANGE_ATTRIBUTE2) { int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] = { 0, 0, 30, 40, 3 }; item2->ChangeAttributeIgnored(aiChangeProb); } else if (item->GetVnum() == 76014) { int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] = { 0, 10, 50, 39, 1 }; item2->ChangeAttributeIgnored(aiChangeProb); } else { // 연재경 특수처리 (하드코딩) if (item->GetVnum() == 71151 || item->GetVnum() == 76023) { if (item2->GetType() == ITEM_WEAPON || (item2->GetType() == ITEM_ARMOR && item2->GetSubType() == ARMOR_BODY)) { bool bCanUse = true; for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { if (item2->GetLimitType(i) == LIMIT_LEVEL && item2->GetLimitValue(i) > 40) { bCanUse = false; break; } } if (false == bCanUse) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("적용 레벨보다 높아 사용이 불가능합니다.")); break; } } else { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("무기와 갑옷에만 사용 가능합니다.")); break; } } item2->ChangeAttributeIgnored(); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("속성을 변경하였습니다.")); { char buf[21]; snprintf(buf, sizeof(buf), "%u", item2->GetID()); LogManager::instance().ItemLog(this, item, "CHANGE_ATTRIBUTE", buf); } item->SetCount(item->GetCount() - 1); break;}w item_attribute.cpp dodajesz pod tym oryginalnym changeattributeC++Kod został skopiowanyvoid CItem::ChangeAttributeIgnoring(const int* aiChangeProb){ int iAttributeCount= GetAttributeCount(); if (iAttributeCount== 0) return; std::vector<TPlayerItemAttribute> ignorujbonus; ignorujbonus.reserve(iAttributeCount); for (int i = 0; i < iAttributeCount; ++i) { BYTE bType = GetAttributeType(i); if (bType == APPLY_SKILL_DAMAGE_BONUS || bType == APPLY_NORMAL_HIT_DAMAGE_BONUS) ignorujbonus.push_back(m_aAttr[i]); } ClearAttribute(); TItemTable const* pProto = GetProto(); if (pProto && pProto->sAddonType) { ApplyAddon(pProto->sAddonType); } int iCurrentAttrIndex = GetAttributeCount(); for (const auto& attr : ignorujbonus) { if (iCurrentAttrIndex >= MAX_NORM_ATTR_NUM) break; SetAttribute(iCurrentAttrIndex, attr.bType, attr.sValue); ++iCurrentAttrIndex; } static const int tmpChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] = { 0, 10, 40, 35, 15 }; for (int i = GetAttributeCount(); i < iAttributeCount; ++i) { if (aiChangeProb == NULL) { PutAttribute(tmpChangeProb); } else { PutAttribute(aiChangeProb); } }}
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto