Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

SRC Prawdopodobnie fix skoków hp.


Evor.

Rekomendowane odpowiedzi

Opublikowano

Witam.

Ostatnio "pewna" osoba zapytała mnie jak naprawić skoki hp przy używaniu szarży, wsiadaniu/zsiadaniu z/na wierzchowca i tak dalej.

Postanowiłem przyjrzeć się temu problemowi i o to co "udało" mi się wytworzyć.

 

Pracujemy TYLKO w pliku char.cpp

Pierw, zorientujmy się jak działa funkcja ApplyPoint, więc przejdźmy do niej.

 

 

Szukamy następnie linijki:

case APPLY_MAX_HP:
		case APPLY_MAX_HP_PCT:
			{
				int i = GetMaxHP(); if(i == 0) break;
				PointChange(aApplyInfo[bApplyType].bPointType, iVal);
				float fRatio = (float)GetMaxHP() / (float)i;
				PointChange(POINT_HP, GetHP() * fRatio - GetHP());
			}
			break;

		case APPLY_MAX_SP:
		case APPLY_MAX_SP_PCT:
			{
				int i = GetMaxSP(); if(i == 0) break;
				PointChange(aApplyInfo[bApplyType].bPointType, iVal);
				float fRatio = (float)GetMaxSP() / (float)i;
				PointChange(POINT_SP, GetSP() * fRatio - GetSP());
			}
			break;
// jest to wycinek z Novaline, lecz wiem, iż wiele osób "wykorzystywało" ten sposób.

Jest on błędny, gdyż nadpisuje dodane ówcześnie hp

(tworzy poniekąd bug, gdyż zamiast uznawać że wartość została już wcześniej dodana, mimo braku zwiększenia MAX_HP, wykonuje działanie "odnawiające hp").

Edytujemy powyższy kod, aby wyglądał "mniej więcej" tak:

case APPLY_MAX_HP:
		case APPLY_MAX_HP_PCT:
			{
				if(GetMaxHP() == 0) break;
				PointChange(aApplyInfo[bApplyType].bPointType, iVal);
			}
			break;

		case APPLY_MAX_SP:
		case APPLY_MAX_SP_PCT:
			{
				if(GetMaxSP() == 0) break;
				PointChange(aApplyInfo[bApplyType].bPointType, iVal);
			}
			break;
Dobrze, zakończyliśmy edytować tę sekcję, przejdźmy teraz do PointChange ( w tym samym pliku ).

 

PointChange:

 

Szukamy case POINT_MAX_HP: oraz POINT_MAX_SP i edytujemy je w następujący sposób:

case POINT_MAX_HP:
			{
                            
				SetPoint(type, GetPoint(type) + amount);
                                int curMaxHP = GetMaxHP();
				int hp = GetRealPoint(POINT_MAX_HP);
				int add_hp = MIN(3500, hp * GetPoint(POINT_MAX_HP_PCT) / 100);
				add_hp += GetPoint(POINT_MAX_HP);
				add_hp += GetPoint(POINT_PARTY_TANKER_BONUS);
				SetMaxHP(hp + add_hp);
                                float fRatio = (float)GetMaxHP() / (float)curMaxHP;
                                PointChange(POINT_HP, GetHP() * fRatio - GetHP());
				val = GetMaxHP();
			}
			break;

		case POINT_MAX_SP:
			{
				SetPoint(type, GetPoint(type) + amount);
                                int curMaxSP = GetMaxSP();
				int sp = GetRealPoint(POINT_MAX_SP);
				int add_sp = MIN(800, sp * GetPoint(POINT_MAX_SP_PCT) / 100);
				add_sp += GetPoint(POINT_MAX_SP);
				add_sp += GetPoint(POINT_PARTY_SKILL_MASTER_BONUS);
				SetMaxSP(sp + add_sp);
                                float fRatio = (float)GetMaxSP() / (float)curMaxSP;
                                PointChange(POINT_SP, GetSP() * fRatio - GetSP());
				val = GetMaxSP();
			}
			break;
Właściwa kalkulacja powinna zacząć się właśnie w PointChange, a nie w apply_point, gdyż po zweryfikowaniu CZY NIE NAKŁADAMY affectu wykonywany jest PointChange, który dyktuje następną poprawkę hp.

 

 

 

Pozdrawiam i proszę o testy,

Evor.

 

 

PS.

Pozdrawiam osoby, które chciały to naprawić, a wynikiem był bug szarży. (char_skill.cpp RemoveAffect...)

 

@update

Jakieś tam kosmetyczne poprawki.

Opublikowano

Przy każdym update są odbierane afekty z nałożonych bonusów np. od biologa i nakładane od nowa, a więc to nie załatwia sprawy. Poprawcie mnie, jeżeli się mylę. :P

Your superman is here, bitch!

Opublikowano

Przy każdym update są odbierane afekty z nałożonych bonusów np. od biologa i nakładane od nowa, a więc to nie załatwia sprawy. Poprawcie mnie, jeżeli się mylę. :P

Sprawdź :) Testowane na starych, affectowych petach.

 

PS.

Rozwiązanie przewiduje używanie itemów, które dodają hp jako potów :)

Opublikowano

 

PS.

Pozdrawiam osoby, które chciały to naprawić, a wynikiem był bug szarży. (char_skill.cpp RemoveAffect...)

Dokładnie chodzi o affect.add_hair z tego co pamiętam. Mi na game 2089 przy każdym zejściu z wierzchowca, zmianie zbroi, broni etc, usuwa się bonus hp z petów po czym od razu się dodaje. Niby to nic nie zmienia, ale jak ktoś ma autopoty to trochę leci. 

ZcWbjGf.png


Serdecznie zapraszam :)

Nowicjusz
Opublikowano

taki bug wystepuje równiez na game 34083 po wgraniu  zlego difa  na  100 % hp pow staniu  bugowala sie przez to szarza :) 

  • 1 rok później...
  • 3 tygodnie później...
Opublikowano

Po wgraniu tego fixa fakt nie skacze HP przy użyciu szarży np u wojownika lecz dodaje mu hp coś jak MAGIC SKILL REVORVERY

To c*****o to wgrałeś.

 

  • 3 lata później...
Opublikowano

Nie jestem pewny, czy to wina tego fixa, czy może źle go dodałem, ale przy użyciu szarży dodaje mi 100% hp, jakieś porady?

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...