Zmiana pancerza zależnie od roździału 3503 7

O temacie

Autor Neck

Zaczęty 3.09.2022 roku

Wyświetleń 3503

Odpowiedzi 7

Neck

Neck

Użytkownicy
posty81
Propsy7
Profesjabrak
  • Użytkownicy
Szukałem podobnego tematu na forum lecz niestety nic nie znalazłem, tak jak w temacie chciałbym zrobić aby z roździałem kilku NPC'om się zmieniał pancerz, próbowałem to zrobić poprzez  rutynę która zmienia się w danym roździale dodając do niej:    CreateInvItems(self,ITAR_SLD_L,1);
AI_EquipArmor(self,ITAR_SLD_L);

Lecz tym sposobem pancerz npctowi zmienia się tylko wtedy gdy zmienimy roździał stojąc obok niego, gdy jesteśmy daleko to pancerz mu się nie zmienia a jedynie dodaje do ekwipunku. Moglibyście może podpowiedzieć w jaki sposób mogę to zrobić aby zadziałało poprawnie?
 

outlander

outlander

Użytkownicy
posty452
Propsy224
ProfesjaReżyser
  • Użytkownicy
Spróbuj dodać te linijki do pliku z rozdziałami. Nie wiem, którą część moddujesz, ale w G1 jest to w pliku scripts\Content\Story\CHAPTERS\B_Kapitelwechsel.d
Pamiętaj, żeby odwołać się bezpośrednio do instancji npc (tj. zastąpić self kodem na npc).
 

frN

frN

Użytkownicy
posty48
Propsy24
ProfesjaGracz
  • Użytkownicy
Ale gdy npc jest poza zasięgiem to chyba nie wykonuje wtedy żadnych akcji z AI i właśnie przez to to nie działa?
Można użyć Mdl_SetVisualBody i wtedy postać ubiera zbroję nawet jeśli jest poza zasięgiem, ale w wielu przypadkach mimo tego, że posiada zbroję założoną (w ekwipunku jest zaznaczona jako aktywna), to wizualnie stoi w samych gaciach i trzeba zapisać/wczytać grę.
Chociaż wydaje mi się, że i na to istniał jakiś fix.
Nie znam się za bardzo, więc mogę się mylić.

Przykład zmiany na podstawie Laresa w Gothic 2, zakłada mu szatę maga
Mdl_SetVisualBody(LARES, "hum_body_Naked0", BODYTEX_N, 0 ,"Hum_Head_Thief", FACE_N_LARES, 0, itar_kdf_l);
Nie wiem jak to wygląda w G1.

//EDIT
Można przerobić funkcję B_RefreshAtInsert(), żeby postać przy spawnie zdejmowała i zakładała ponownie zbroję i razem z Mdl_SetVisualBody powinno dać oczekiwany efekt (można wykorzystać jakiś wolny aivar, żeby sprawdzić czy postać wymaga odświeżenia zbroi)
 

overdriven

overdriven

Użytkownicy
posty6
ProfesjaProgramista
  • Użytkownicy
Cytuj
Można użyć Mdl_SetVisualBody i wtedy postać ubiera zbroję nawet jeśli jest poza zasięgiem, ale w wielu przypadkach mimo tego, że posiada zbroję założoną (w ekwipunku jest zaznaczona jako aktywna), to wizualnie stoi w samych gaciach i trzeba zapisać/wczytać grę.
Też mam z tym problem. Nawet nie wystarczy zapisać/wczytać gry, trzeba jeszcze zapisać/wczytać grę mając w zasięgu widzenia danego NPCa.

Naprawdę nie ma na to lepszego rozwiązania?

Wolałbym uniknąć robienia tego w B_RefreshAtInsert() :/ Zawsze to dodatkowy zbędny kod który będzie się odpalał za każdym razem gdy wyrenderuje się napotkany NPC (nawet jeśli będziemy sprawdzać czy to interesujący nas NPC), więc niezbyt to optymalne.
 

Simon Said

Simon Said

Moderator
Nilfgaard
posty6459
Propsy3027
ProfesjaTester
  • Moderator
  • Nilfgaard
A nie lepiej zrobić nowego NPC, który będzie miał nowy pancerz?
 
http://chomikuj.pl/gothicwarrior

https://www.youtube.com/watch?v=UCMTYnPVyFu



overdriven

overdriven

Użytkownicy
posty6
ProfesjaProgramista
  • Użytkownicy
To by może i rozwiązało problem, ale to trochę przesada i wprowadziłoby inne problemy: jeśli mod był instalowany w połowie gry to oryginalny NPC mógł teoretycznie posiadać itemy, które otrzymał w trakcie gry, więc przy podmianie NPców by je stracił. Tak samo jeśli inny mod coś zmienia temu oryginalnemu NPCowi nie wiem czy byłoby to kompatybilne.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Wolałbym uniknąć robienia tego w B_RefreshAtInsert() :/ Zawsze to dodatkowy zbędny kod który będzie się odpalał za każdym razem gdy wyrenderuje się napotkany NPC (nawet jeśli będziemy sprawdzać czy to interesujący nas NPC), więc niezbyt to optymalne.
B_RefreshAtInsert jest wywoływane tylko przy dodaniu npc do listy aktywnych obiektów, czyli wtedy kiedy gracz zbliży się na określoną odległość do waypointa wpisanego w jego rutynie. Wpływ na wydajność jest niemal zerowy. Rutyny i percepcja npc mają największy wpływ na wydajność i jakoś nikt się tym nie przejmuje.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

overdriven

overdriven

Użytkownicy
posty6
ProfesjaProgramista
  • Użytkownicy
Dobra. Zrobiłem to w B_RefreshAtInsert. Podaję rozwiązanie jak by ktoś miał ten sam problem, albo do oceny jeśli jest coś do poprawy. Poniższy kod wymusi ubranie NPCa (Nadii) w dowolny armor (itar_vlkbabe_h) jeśli się do niej zbliżymy i zrobi to tylko jeden raz dzięki zapisywaniu/sprawdzaniu aivara i sprawdzaniu, czy ma już założone podane ubranie. Pewnie można byłoby pominąć jeden z tych dwóch warunków, ale dla pewności oba nie zaszkodzą. Dzięki trzymaniu tego w funkcji można używać wiele razy na dowolnym NPC.

Użycie funkcji w B_RefreshAtInsert:
func void B_RefreshAtInsert()
{
B_RefreshAtInsert_old();
// force outfit change on already started game
var C_NPC npcNadja; npcNadja = Hlp_GetNpc(VLK_435_NADJA);
EquipArmor(self, npcNadja, itar_vlkbabe_h);
}

Sama funkcja:
func void EquipArmor (var C_NPC CURRENT_NPC, var C_NPC NPC, var INT ARMOR)
{
// aivar 93 = is already wearing new armor
if(!CURRENT_NPC.aivar[93] && (Hlp_GetInstanceID(NPC) == Hlp_GetInstanceID(CURRENT_NPC)))
{
var c_item currentArmor; currentArmor = Npc_GetEquippedArmor(CURRENT_NPC);
if(Hlp_GetInstanceID(currentArmor) != ARMOR)
{
   if(!Npc_GetInvItem(CURRENT_NPC, ARMOR))
   {
       CreateInvItem(CURRENT_NPC, ARMOR);
   };
   AI_EquipArmor(CURRENT_NPC, ARMOR);
};
CURRENT_NPC.aivar[93] = true;
};
};

Używam aivar 93, bo gram z Returningiem, ale w niezmodowanej grze może to być dowolny aivar pomiędzy 89-99.

Edit: jak tak o tym myślę to chyba by jednak przydało się pominąć tego aivara, bo jeśli po odpaleniu tej funkcji jakiś zewnętrzny kod z powrotem jej zmieni ubranie na inne to ten aivar nigdy nie zmieni się z powrotem na false i funkcja się już więcej nie odpali.
 


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