self other hero i funkcje 2396 3

O temacie

Autor DusterHouse

Zaczęty 11.02.2016 roku

Wyświetleń 2396

Odpowiedzi 3

DusterHouse

DusterHouse

Użytkownicy
posty7
  • Użytkownicy
hej
Mam kilka pytań co do moddingu
no to zaczynamy ;d

1. Chodzi o self, other oraz hero. Z tego co widzę po skryptach są to obiekty (instancje) klasy C_NPC, które tam mają swoje pola jak np. id czy inne name, ale nie zbyt wiem jak to się identyfikuje, tzn. jak gra wie o którego npca chodzi jeśli zamieszczone jest self np.

func void  KDF_401_Damarok_WELCOME_Info()
{

AI_GotoNpc (self,hero);
AI_Output (self, other,"KDF_401_Damarok_WELCOME_Info_14_01"); //Niech Ogień rozświetla twe życie!

Corristo_KDFAufnahme = 6;
B_Story_Feueraufnahme();
AI_StopProcessInfos ( self );
};

Z tego co można zauważyć self odnosi się do aktualnego npca, w tym przypadku Damaroka, ale skąd gra o tym wie? hero to jest też obiekt C_NPC który jest chyba w pliku PC_HERO ale tego też nigdzie nie ma.

poza tym

AI_Output (other,self,"DIA_Whistler_RunningPayBack_15_00"); //Nie mogę zdobyć tego miecza. Zwracam ci twoją rudę.Czemu jeśli my zwracamy się do kogoś to jest other,self a nie hero,self? Czym jest w tym przypadku obiektem other?

2. A drugie pytanie bardzo krótkie


PrintDebugNpc (PD_ZS_DETAIL, "...false!");
Co robi ta funkcja bo wszędzie tego pełno a nie widzę żeby gdzieś była zdefiniowana... i to PD_ZS_DETAIL (jakaś stała?).

Poza tym plik externals.d

FUNC INT  Hlp_IsValidItem (VAR C_ITEM item) { return 0; };
// Prüfe ob Item-Instanz gültig und initialisiert ist True/False

Gdzie jest ciało tej funkcji :O? Jest tu tylko info że zwraca 0 i jak ma to działać?

Z góry dzieki za odpowiedzi
 

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1664
Propsy254
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh
// Aktualny Npc i SC
INSTANCE self,other (C_NPC);

// Ofiary w działaniach "świadków "
INSTANCE victim(C_NPC);

// aktualny item
INSTANCE item(C_Item);

// A gracz zawsze jako przykład globalnego
INSTANCE hero(C_NPC);

W sumie te objaśnienia tłumaczyłem translatorem, ale chyba mniej więcej dobrze.
 
Niebawem...Pierdolnę se poradniki do Goticzka. Albo i nie, bo sie mnie nie chce.

Kranek

Kranek

Użytkownicy
posty35
Propsy14
ProfesjaNierób
  • Użytkownicy
Cytuj
1. Chodzi o self, other oraz hero. Z tego co widzę po skryptach są to obiekty (instancje) klasy C_NPC, które tam mają swoje pola jak np. id czy inne name, ale nie zbyt wiem jak to się identyfikuje, tzn. jak gra wie o którego npca chodzi jeśli zamieszczone jest self np.
self i other to zmienne globalne, które co prawda nie są w skryptach zadeklarowane, ale istnieją i są do użytku. A skąd gra wie, no cóż, zwykle sama je ustawia w odpowiednich miejscach, zdaje się przed wywołaniem jakichś funkcji związanych z AI takich jak: "ZS_ReactToDamage" (Gothic 1), która stara się ustalić co się dzieje z npc po otrzymaniu obrażeń i jak ma zareagować, gdzie self to osoba, która obrywa, a other osoba ją atakująca. Też np. taki dialog, gdzie self to osoba z którą gracz rozmawia, a other to osoba, którą zasadniczo sterujemy i rozmawiamy z npc, może być różna od hero, gdzie hero zdaje się trzyma sztywno PC_HERO.

Cytuj
Czemu jeśli my zwracamy się do kogoś to jest other,self a nie hero,self? Czym jest w tym przypadku obiektem other?

Jak wspomniałem, other to postać, którą sterujemy i rozmawiamy z tym npc, nie koniecznie musi być to hero, bo np. moglibyśmy się zmienić w kogoś albo na kodach, albo za pomocą zaklęcia. W przypadku gothica 1 nie porozmawiamy inną postacią (chociaż można to w skryptach zmieniać), a w gothicu 2 jak najbardziej.

Cytuj
Co robi ta funkcja bo wszędzie tego pełno a nie widzę żeby gdzieś była zdefiniowana... i to PD_ZS_DETAIL (jakaś stała?).

Strzelam, że gdy tryb debugowania jest włączony to wypluwa na ekran, albo do jakiejś konsoli odpowiednią wiadomość, tak PD_ZS_DETAIL to stała i równa jet 9 bodajże.

Cytuj
Poza tym plik externals.d
...
Gdzie jest ciało tej funkcji :O? Jest tu tylko info że zwraca 0 i jak ma to działać?

Plik eksternals jeśli dobrze pamiętam nawet nie jest przez grę kompilowany, można to sprawdzić edytując plik Gothic.src. Externals generalnie służy temu, by powiedzieć skrypterowi, że prócz funkcji normalnie zadeklarowanych w skryptach, są jeszcze pewne istniejące w silniku gry, do ciała których nie masz dostępu. Zatem:

Cytuj
FUNC INT     Hlp_IsValidItem         (VAR C_ITEM item)               { return 0; };
// Prüfe ob Item-Instanz gültig und initialisiert ist True/False

Mówi ci, że istnieje sobie funkcja Hlp_IsValidItem, która przyjmuje takie i takie argumenty. W komentarzu po niemiecku, bo gra niemiecka (:P) powinien być opis co ta funkcja robi.

Polecam Ci zaopatrzyć się w notepada++, choćby dlatego, że ma świetną opcje wyszukiwania w plikach. Można sobie ustawić np. folder Content w Scripts, filtrowanie po plikach *.d i szukać danej frazy, obsługuje też wyrażenia regularne. Może dzięki temu łatwiej będzie Ci znaleźć odpowiedzi na następne pytania.
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Zmienne C_NPC self, other i hero są ustawiane poprzez silnik gry.
Hero to zawsze gracz, nieważne czy grasz jako Lord Hagen, Xardas, jakiś obywatel, czy bezimienny.
Self jest ustawiany poprzez silnik w niektórych funkcjach gry. Self zawsze odpowiada za cel, to znaczy, jeśli jest dialog, self to będzie osoba, z którą rozmawiasz, jeśli jest to walka, to self jest przeciwnikiem.
Other jest troszkę bardziej skomplikowany, bo jest to osoba zaczepiająca, jeśli chodzi o dialog. W walce jest to osoba, która zaczęła bójkę.

W dialogach other jest przypisany do osoby, która wybiera kwestie dialogowe. W tym przypadku, other w dialogach to zawsze (albo i przeważnie) hero, czyli gracz.

PrintDebugNpc    zapisuje pozycję w funkcji w zSpy, żeby lepiej było znaleźć przyczynę błędu.
Przykład: PrintDebugNpc   (PD_ZS_DETAIL, "...false!") dodane w linijce pierwszej funkcji będzie pokazywało w zSpy napis "...false!" przez co będziesz wiedział, że rozpoczęła się funkcja.
Można tego także użyć, żeby sprawdzać, czy dane warunki się spełniają w funkcjach, albo żeby po prostu sprawdzać, gdzie się popełniło błąd.
Przykład:
PrintDebugNpc   (PD_ZS_DETAIL, "Sprawdzam czy npc ma przedmioty");
if (npc_hsaitems(hero, itmi_gold, 150)
{...};
na czerwono zaznaczyłem błąd. Teraz włączam grę, wywali mi błąd i nie wiem gdzie jest. Włączam zSpy i sprawdzam, gdzie jest błąd. Pojawił się zaraz po informacji "Sprawdzam czy npc ma przedmioty", czyli wiem, gdzie popełniłem błąd i jestem w stanie go bez problemu naprawić.

Externals.d jest zbiorem "wszystkich" nazw funkcji (tak naprawdę nie ma tam wszystkich).
Funkcje są tam dla pomocy, gra nie czyta tego pliku. Jest tam zapisane nazwa funkcji, oraz potrzebne do niej zmienne oraz co zwraca.

FUNC INT     Hlp_IsValidItem         (VAR C_ITEM item)               { return 0; };
// Prüfe ob Item-Instanz gültig und initialisiert ist True/False

Nazwa funkcji. W sumie to niepotrzebnie piszę.
Wymagana zmienna, czyli tutaj wpisujemy instance przedmiotu, albo zmienną C_ITEM przedmiotu.
Funkcja zawsze zwraca 0, ale jeśli funkcja dostanie ID (instance / zmienną) broni, która jest dostępna w grze, zwróci 1

Jak to działa w praktyce?

func int nazwa (var int zmienna)
{
      if (zmienna == 1)
      {
            return 1;
      };
      return 0;
};

Jeśli zmienna będzie wynosiła 1, funkcja zwróci wartość 1 i zakończy się. Jeśli zaś zmienna nie będzie wynosiła 1, funkcja zwróci 0.

return zawsze kończy funkcję, czyli jeśli dasz w jakieś funkcji zaraz po pierwszej { return; to funkcja się wcale nie rozpocznie.

return też wygląda nie zawsze tak samo. W "func int" czyli funkcjach numerycznych (? nie wiem jak to nazwać) zwraca numer, jakikolwiek, może też być -38745983745 (return -38745983745;). W "func string" czyli funkcjach z napisami (tej raczej nie znajdziesz w oryginalnym Gothic) zwraca napis, czyli np. "Placki lubią być jedzone" (return "Placki lubią być jedzone";). W "func void" czyli funkcjach, które nie są używane w warunkach, nic nie zwracają i return wygląda: return;
Funkcji takich jest więcej, ale w zasadzie starczy Ci tylko int i void, bo innych się raczej nie używa.

W razie pytań pisz.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.


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