Samoczynna regeneracja zdrowia 3419 8

O temacie

Autor DonClapeyron

Zaczęty 6.05.2020 roku

Wyświetleń 3419

Odpowiedzi 8

DonClapeyron

DonClapeyron

Użytkownicy
posty4
Propsy1
Profesjabrak
  • Użytkownicy
Tak jak w temacie, chciałbym stworzyć pierścień, który będzie zapewniał regenerację zdrowia. Czy wie ktoś jak to zrobić? Sam próbowałem zrobić rekurencję, ale wtedy wywaliło mi grę.
Pomocy!!!
 

Parzival

Parzival

Użytkownicy
CEO (Itharu Team)
posty104
Propsy25
ProfesjaProducent
  • Użytkownicy
  • CEO (Itharu Team)
Ja mam taki pierścień zrobiony. Ale regeneruje on czasowo. Później trzeba go "naładować" magiczną energią.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Można użyć pakietu Lego, ewentualnie bawić się z ticktockiem.
Z rekurencją jest taki problem, że po chyba 32000 wywołań przepełnia się stos i brak pamięci. Więc należy unikać nieskończonych rekurencji w Gothicu.

bogu9821

bogu9821

Użytkownicy
posty406
Propsy185
ProfesjaProgramista
  • Użytkownicy
Najłatwiej po prostu użyć już regeneracji, która jest w silniku.
Wystarczy pobawić się npc.attribute[6] i [7].
Jeżeli nie działa poprawnie to ticktock/framefunction z lego/Union i hook na oCNpc::ProccessNpc, jezeli chcesz aby każdy mógł ten pierścień założyć i by mu regenerowało życie, lub po prostu w game_loop, jeżeli tylko dla hero.
 
while(false) Do();

DonClapeyron

DonClapeyron

Użytkownicy
posty4
Propsy1
Profesjabrak
  • Użytkownicy
Może sprecyzuje o co mi chodzi. Mianowicie zrobiłem taki skrypt:
FUNC VOID Equip_RING_rege()
{
if(self.attribute [ATR_HITPOINTS]<self.attribute [ATR_HITPOINTS_MAX])
{
PrintDebugNpc (PD_ITEM_MOBSI, "UseHealthPotion");
Npc_ChangeAttribute (self, ATR_HITPOINTS, 1);
Equip_RING_rege();
};

};
i on faktycznie regeneruje mi całe życie, ale tylko w momencie założenia pierścienia, a ja chciałbym, żeby odradzał zawsze gdy przedmiot jest noszony i żeby odradzał np. 1 punkt życia co sekundę, a nie jak w tej funkcji - natychmiast do maxa.
Co do ticktocka to też próbowałem; napisałem takie coś:
func void tick_tock()
{
self.attribute [ATR_HITPOINTS] = self.attribute [ATR_HITPOINTS] + 1;
};
żeby odradzał 1 hp co 0.125 sekundy, ale po zranieniu hp w ogóle się nie odradzało.

Post połączony: 2020-05-07, 15:48
bogu9821 nie do końca rozumiem co napisałeś :D Czym jest ten game_loop i oCNpc::ProccessNpc i czy to dotyczy Gothica 1?
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Tak jak w temacie, chciałbym stworzyć pierścień, który będzie zapewniał regenerację zdrowia. Czy wie ktoś jak to zrobić? Sam próbowałem zrobić rekurencję, ale wtedy wywaliło mi grę.
Pomocy!!!

Rekurencja ci nie pomoże, bo blokuje ona główny wątek.
Regeneracja musi się wykonywać z pewnym opóźnieniem czasowym (np: co sekundę).
Co to oznacza? Tak jak reszta osób przede mną mówiła, możesz wykorzystać specjalne pakiety skryptów (Ikarus i LeGo), które pozwolą ci przeprowadzić interakcje z silnikem, lub trochę pohackować grę.

Game_Loop to kawałek kodu, który zajmuje się wszystkim tym, co robi gra "na bieżąco".
Czyli np: renderowaniem, ale to nie jest takie proste.
Ilość FPS'ów określa, ile taka funkcja razy wykona się na sekundę.

Mocno tu upraszczam masę rzeczy, dlatego najlepiej będzie jak zapoznasz się na początek z tym, czym jest Game_Loop, Render function, czy jakbyś to chciał nazwać.

Potem, będziesz musiał poczytać o samym Ikarusie i "Hookach", hooki pozwalają wykonać twój kod, gdy wykonuje się kod gry.
Czyli dla przykładu: Gra wykonuje funkcje X gdy klikniesz jakiś klawisz na klawiaturze.
Chcesz przechwycić ten moment i wykonać coś swojego, po to właśnie są hooki.

Za pomocą wyżej wymienonych pakietów skryptowych da się takowe hooki w daedalusie (język skryptowy gry) nakładać.

Spróbuj poczytać trochę o tym co pisałem powyżej, może uda ci się do czegoś dojść, na sporo pytań na TM już została odpowiedź udzielona ;).

@Edit

Ewentualnie jeśli nie chcesz się bawić Ikarusem/LeGo (czytaj, hakowaniem pamięci gry), możesz poczytać o TickTockach.
 

lucki666

lucki666

Użytkownicy
posty133
Propsy65
ProfesjaSkrypter
  • Użytkownicy
Ja w swojej modyfikacji użyłem już istniejącej w gothicu regeneracji, bo ona istnieje, lecz nie została wykorzystana, gdyż przepełnia pamięć gry.

dodałem u bohatera PC_Hero linijkę pod etrybutami:

   attribute[ATR_REGENERATEHP]       = 10;
co powoduje regenerację 1 życia co 10 sekund. Można przyspieszać to odejmując wartości czy to przedmiotami czy nawet miksturami.

Możesz użyć, aby twój pierścień ustalał wartość na jaką chcesz. Działa też z maną.
 

Splash

Splash

Moderator
posty4208
Propsy3411
ProfesjaNierób
  • Moderator
Z tego co pamiętam to ta regeneracja jest zbugowana. Włączenie regeneracji życia powodowało natychmiastowe regenerowanie many
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

DonClapeyron

DonClapeyron

Użytkownicy
posty4
Propsy1
Profesjabrak
  • Użytkownicy
Zrobiłem to ostatecznie tick tockiem
 func void tick_tock()
{
if(hero.attribute[ATR_HITPOINTS]>0)
{
if(i>0)
{
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS] + 1;
if (hero.attribute[ATR_HITPOINTS]>hero.attribute[ATR_HITPOINTS_max])
  {
hero.attribute[ATR_HITPOINTS]=hero.attribute[ATR_HITPOINTS_max];
  };
};
};
};
Taki wykrzesałem skrypcik, a w skrypcie zakładania pierścienia dałem, że i staje się jakąś dużą liczbą, więc regeneracja włącza się tylko jak mam ten pierścień założony, i wszystko dobrze działa.

Dziękuję wszystkim za pomoc.
Temat do zamknięcia.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry