[G1] Problem z przeniesieniem skryptu samouzdrawiania się NPC-ów z Gothic 2 2312 6

O temacie

Autor Kirgo2

Zaczęty 11.02.2025 roku

Wyświetleń 2312

Odpowiedzi 6

Kirgo2

Kirgo2

Użytkownicy
posty42
Propsy5
ProfesjaGracz
  • Użytkownicy
Cześć

Próbuję przenieść pewną rzecz z Gothic 2 do Gothic 1. Chodzi o to by pobite postacie się regenerowały i uzupełniały podręczną broń po tym jak znikną głównemu bohaterowi z widoku.

Jeżeli dobrze rozumiem, to kluczowy jest plik "B_RefreshAtInsert.d" wzięty z "Gothic II\_work\data\Scripts\Content\AI\AI_Intern".

Trochę edytowałem ten plik i próbowałem go umieścić w różnych miejscach. W pierwszej kolejności rzecz jasna w "Gothic\_work\data\Scripts\Content\AI\AI_Intern". Między innymi zauważyłem, że w "Gothic.src" Gothica Dwójki znajdowała się linijka "AI\AI_Intern\B_RefreshAtInsert.d", więc dodałem analogiczną linijkę w "Gothic.src" Gothica Jedynki.

Gdy to się nie udało próbowałem przekleić treść "B_RefreshAtInsert" do jednego z plików ".d" w folderze "Gothic\_work\DATA\scripts\Content\Story\B". Też kicha.

Próbowałem potem na różne sposoby. Wstawiłem plik "B_RefreshAtInsert.d" do folderu "Gothic\_work\DATA\scripts\Content\AI\B_Human".

Na zabawie metodą prób i błędów zeszło mi kilka godzin - próbując wstawić tą rzecz w różnych konfiguracjach. Niestety na próżno.

Próbowałem też z "ZS_HealSelf.d" (z folderu "D:\Steam\steamapps\common\Gothic\_work\DATA\scripts\Content\AI\ZS_Human") - jako swoistą wersję minimum, żeby chociaż ci z niepełnym HP uzupełniali sobie miksturami i nie stali wykrwawieni do końca gry ale NPC nie chciały tego robić nawet jak byli ranni czy pobici. Zależałoby mi też na tym by pozbawieni broni się jednak uzbrajali jak w Gothic 2.

Dodam, że wszystko ładnie się reparsuje w Spacerze i nie wyskakuje żaden błąd - poza tym, że skrypt nie działa.

Bardzo proszę o pomoc. Wstawiam tu projekt swojej wersji B_RefreshAtInsert i prosiłbym o:
1. Wskazówki co w nim jest ewentualnie źle.
2. Gdzie go wstawić by zadziałał.


func void b_refreshatinsert()
{
var C_NPC her;
if(self.attribute[ATR_HITPOINTS] <= 0)
{
return;
};
her = Hlp_GetNpc(pc_hero);
if((self.guild < GIL_SEPERATOR_HUM) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(her)))
{
self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX];
if(Npc_HasEquippedWeapon(self) == FALSE)
{
if(self.guild == GIL_NONE)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_EBR)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_GRD)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_STT)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_KDF)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_VLK)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_KDW)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_SLD)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_ORG)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_BAU)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_SFB)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_GUR)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_NOV)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
if(self.guild == GIL_TPL)
{
CreateInvItems(self,itmw_1h_sword_03,1);
};
if(self.guild == GIL_BAB)
{
CreateInvItems(self,Itmw_1h_club_01,1);
};
};
};
};

 

frN

frN

Użytkownicy
posty57
Propsy28
ProfesjaGracz
  • Użytkownicy
B_RefreshAtInsert zostało dodane dopiero w Gothicu 2, a wywołanie tej funkcji jest hardkodowane w silniku gry, na końcu oCNpc::Enable.
To, że sobie przekleisz samą funkcję w skryptach z G2 do G1, nic nie zmieni, ponieważ gra i tak nie będzie wiedziała, kiedy ma to wywołać.
 

Kirgo2

Kirgo2

Użytkownicy
posty42
Propsy5
ProfesjaGracz
  • Użytkownicy
Dzięki za odpowiedź. Chyba wiem jak zrobię  :)

Edytowałem opcję "B_RefreshAtInsert" by działała na takiej samej zasadzie jak "B_KillNpc" i nazwałem ją "B_RefreshNpc.

Teraz stworzę osobne funkcje korzystające z funkcji "B_RefreshNpc" dla różnych grup postaci (np. B_RefreshNpcOC, B_RefreshNpcNC, B_RefreshNpcOM, B_RefreshNpcFMC, itd.) gdzie wpakuję wszystkie postacie z danego osiedla.

Potem te osobne funkcje ("obozowe") powiążę albo z jakimiś dialogami, by wywoływały się np. po kliknięciu opcji "Koniec" w rozmowie z ambientowymi postaciami z danego obozu i wtedy pewnie osiągnę z grubsza ten efekt z Gothic 2, który chciałem osiągnąć.

Ewentualnie popróbuję z "oCTriggerScript" w Spacerze, by funkcja z uzupełnianiem zdrowia i uzbrojenia mieszkańców danego obozowiska załączała się po wejściu w konkretny obszar.

Pobawię się z tym jeszcze trochę i jak wszystko będzie działać to wstawię skrypty na forum. Dzięki za pomoc.
 

frN

frN

Użytkownicy
posty57
Propsy28
ProfesjaGracz
  • Użytkownicy
Z pomocą Uniona/Ikarusa pewnie dałoby się to zrobić o wiele łatwiej :v
 

Kirgo2

Kirgo2

Użytkownicy
posty42
Propsy5
ProfesjaGracz
  • Użytkownicy
Ikarus to jest chyba wyższa szkoła jazdy a ja nie jestem jeszcze na tak zaawansowanym poziomie jeżeli chodzi o modding. Na razie popróbuję z tymi metodami, które rozumiem :)
 

Gother

Gother

Użytkownicy
Nieskromny Mistrz Gothica
posty457
Propsy260
ProfesjaScenarzysta
  • Użytkownicy
  • Nieskromny Mistrz Gothica
Próbowałem też z "ZS_HealSelf.d" (z folderu "D:\Steam\steamapps\common\Gothic\_work\DATA\scripts\Content\AI\ZS_Human") - jako swoistą wersję minimum, żeby chociaż ci z niepełnym HP uzupełniali sobie miksturami i nie stali wykrwawieni do końca gry ale NPC nie chciały tego robić nawet jak byli ranni czy pobici.

To ciekawe, bo w G1 właśnie poprzez mikstury i jedzenie NPC uzupełniają sobie życie. Robią to o ile mają przedmioty w swoim ekwipunku, więc wsadź im przedmioty lecznicze oznaczone jak pancerz żeby po pobiciu nie obrabowano ich ze wszystkiego.
Co do uzbrajania gdy odebrano im broń to ta opcja z G2 nie podobała mi się zbytnio ze względu na szybkość z jaką znajdowali sobie nowy oręż. Niby kawałek drewna łatwo zdobyć, ale ty chcesz aby uzupełniali ekwipunek też o miecze. W skryptach gry istnieje B_RefreshArmor. Według dokumentacji miał on służyć odziewaniu NPC na drugi dzień po tym jak gracz ukradnie im zbroję. Przestał sprawować tę funkcję po tym jak odebrano możliwość ściągania pokonanym ubrań. Proponuję skorzystanie z tego do uzbrajania jak i uzupełniania pasków życia.
 

Kirgo2

Kirgo2

Użytkownicy
posty42
Propsy5
ProfesjaGracz
  • Użytkownicy
Cytuj
To ciekawe, bo w G1 właśnie poprzez mikstury i jedzenie NPC uzupełniają sobie życie. Robią to o ile mają przedmioty w swoim ekwipunku, więc wsadź im przedmioty lecznicze oznaczone jak pancerz żeby po pobiciu nie obrabowano ich ze wszystkiego.

Sprawdzałem w grze na czystym Gothicu ze Steama i okazuje się, że nie zawsze sobie uzupełniają (nawet jak mają w ekwipunku mikstury i cały sklep spożywczy). Uzupełnianie z ZS_Heal załączy się np. gdy NPC wstaje po walce (gdy zostanie znokautowany) albo gdy przestaje nas gonić - to wtedy się załącza. Jeżeli więc po pobiciu NPC-a się od niego znacznie oddalisz, to po powrocie zastaniesz go bez uzupełnionego zdrowia, choćby miał w ekwipunku mikstury.

Cytuj
Co do uzbrajania gdy odebrano im broń to ta opcja z G2 nie podobała mi się zbytnio ze względu na szybkość z jaką znajdowali sobie nowy oręż. Niby kawałek drewna łatwo zdobyć, ale ty chcesz aby uzupełniali ekwipunek też o miecze.
W Gothic 2 żeby postać "znalazła sobie" nową lagę trzeba było oddalić się na nawet dużą odległość. Można więc sobie wytłumaczyć, że pod naszą nieobecność pobity także poszedł rozejrzeć się za jakimś kijkiem do samoobrony czy nawet kupić sobie broń. W przypadku takiego strażnika miejskiego z Khorinis - zapewne poszedłby do zbrojowni po jakikolwiek miecz, bo drewniana laga u pasa strażnika nie licowałaby z powagą formacji. To samo ze strażnikami i najemnikami z Gothic 1 - zbrojownia.

Wracając jednak stricte do tematu... Zrobiłem jak pisałem wcześniej i na koniec powiązałem to z funkcją "PC_Sleep" w pliku Sleepabit.d (Gothic\_work\DATA\scripts\Content\Story\EVENTS). Wszystko ładnie śmiga i jest nawet zgrabnie wplecione do gry, bo postacie się regenerują w czasie gdy regeneruje się Bezimienny (podczas snu Bezimiennego).

Dzięki za pomoc :)
 


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