Naprawa błędu Czarowanego Ostrze - utrata HP zamiast kradzieży życia podczas dobijania potworów

image.png

Cześć, 🖐️

Właśnie rozpoczynam odbudowę starych tematów. Jak mnie pamięć nie myli wtedy chyba też rozpocząłem od tej poprawki.

Opis problemu

Gracz mający aktywną umiejętność czarowane ostrze dobijając potwory może tracić punkty życia zamiast je odzyskiwać. Przy kolejnym trafieniu potwora z hp poniżej zera kradzież życia przyjmuje ujemną wartość i odejmuje życie graczowi zamiast je regenerować. Problem dotyczy dokładnie bonusu, który jest w umiejętności czarowanego ostrza czyli kradzież życia ten problem dotyczy również bonusu kradzieży energii choć nie kojarzę żeby był wykorzystywany.

Przykład

Gracz ma 12% kradzieży życia przy ostrzu na P i zadaje potworowi 500 obrażeń, a potwór przed trafieniem miał 126 HP, więc jego życie spada do -374. Zanim serwer zakończy obsługę śmierci potwora, gracz może trafić go ponownie. I tu jest kulminacyjny punkt bo kradzież życia zostaje wtedy obliczona na podstawie ujemnego HP potwora zamiast zadanych obrażeń. W efekcie gracz utraci 44 punktów życia podstawiając pod odzysk −374 x 12 / 100 = −44 PŻ pomijając części ułamkowe.

Prezentacja problemu

2026-10-18 10-14-39.mp4

Rozwiązanie

📂game -> char_battle.cpp

🔍Szukaj

// 칠 때마다 HP회복
if (pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) && number(0, 4) > 0) // 80% 확률
{
	int i = MIN(dam, iCurHP) * pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) / 100;

	if (i)
	{
		CreateFly(FLY_HP_SMALL, pAttacker);
		pAttacker->PointChange(POINT_HP, i);
	}
}

🔄Zamień

// 칠 때마다 HP회복
if (pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) && number(0, 4) > 0) // 80% 확률
{
	const int recoveryBase = (iCurHP >= 0) ? std::min(dam, iCurHP) : dam;
	const int recoveredHP = recoveryBase * pAttacker->GetPoint(POINT_HIT_HP_RECOVERY) / 100;

	if (recoveredHP > 0)
	{
		CreateFly(FLY_HP_SMALL, pAttacker);
		pAttacker->PointChange(POINT_HP, recoveredHP);
	}
}

🔍Szukaj

// 칠 때마다 SP회복
if (pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) && number(0, 4) > 0) // 80% 확률
{
	int i = MIN(dam, iCurHP) * pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) / 100;

	if (i)
	{
		CreateFly(FLY_SP_SMALL, pAttacker);
		pAttacker->PointChange(POINT_SP, i);
	}
}

🔄Zamień

if (pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) && number(0, 4) > 0) // 80%
{
	const int recoveryBase = (iCurHP >= 0) ? std::min(dam, iCurHP) : dam;
	const int recoveredSP = recoveryBase * pAttacker->GetPoint(POINT_HIT_SP_RECOVERY) / 100;

	if (recoveredSP > 0)
	{
		CreateFly(FLY_SP_SMALL, pAttacker);
		pAttacker->PointChange(POINT_SP, recoveredSP);
	}
}

Prezentacja rozwiązania

2026-10-18 10-37-37.mp4

Świetny poradnik, właśnie się zastanawiałem jak naprawić błąd Czarowanego Ostrze - otratę HP zamiast kradzieży życia podczas dobijania potworów.

Właśnie tak przeczuwałem że potrzebujesz tego poradnika. 😄