Skocz do zawartości
Masz już aplikację Sharegon?

Odkryj wszystkie możliwości. Dowiedz się więcej

Sharegon.pl

Zainstaluj aplikację Sharegon i korzystaj z powiadomień push oraz licznika nowych aktywności bezpośrednio z ekranu głównego.

Aby zainstalować tę aplikację na iOS i iPadOS.
  1. Tap the Share icon in Safari
  2. Przewiń menu i stuknij Dodaj do ekranu początkowego.
  3. Stuknij Dodaj w prawym górnym rogu.
Zainstaluj aplikację Sharegon na Androidzie
  1. Otwórz Sklep Google Play na swoim smarfonie.
  2. Wyszukaj „Sharegon” w pasku wyszukiwania.
  3. Stuknij „Zainstaluj”, aby pobrać aplikację.

Szukam nowej zmianki która zmieni wszystkie bonusy oprócz średnich / obrażeń umiejętności

Nieaktywny

Featured Replies

Opublikowano

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

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.

case 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 changeattribute

void 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

Konto

Nawigacja

Skonfiguruj powiadomienia push w przeglądarce.

Chrome (Android)
  1. Stuknij ikonę kłódki obok paska adresu.
  2. Wybierz Uprawnienia → Powiadomienia.
  3. Dostosuj swoje preferencje.
Chrome (Desktop)
  1. Kliknij ikonę kłódki na pasku adresu.
  2. Wybierz Ustawienia witryny.
  3. Znajdź Powiadomienia i dostosuj swoje preferencje.