Bethesda Tutorial Papyrus Events and Properties/pl

From the CreationKit Wiki
Jump to navigation Jump to search

Poradnik Bethesdy - Papyrus - Zdarzenia i własności



RoundPolishFlag.pngStrona w języku polskim
Wymaga poprawek redakcyjnych lub przetłumaczenia linkowanych stron
Poradnik Bethesdy - Papyrus - Zdarzenia i własności
seria: Skypty, rozdział: 4
Powrót do spisu poradników
LeftArrow.png Poprzedni poradnik Następny poradnikRightArrow.png


Przegląd[edit | edit source]

Nauczysz się:

  • Podstawowych informacji o Zdarzeniach Event oraz co je włącza
  • Jak tworzyć i wykorzystywać Własności
  • W jaki sposób gra wpływa na Papyrusa wysyłając mu Zdarzenia
  • W jaki sposób Papyrus wpływa na grę, wykonując działania na Własnościach

W tym poradniku zajmiemy się poziomem grobowca Lokira, który wspólnie utworzyliśmy w serii poradników na temat tworzenia podziemi. Możesz pobrać gotowy plugin Grobowiec Lokira (Lokir's Tomb), ale miej na uwadze, że aby kontynuować tę serię o skryptach, musisz znać wiele rzeczy, o których była mowa przy tworzeniu podziemi, np.:


Plan[edit | edit source]

Obecnie, kiedy wchodzi się do ostatniej komory w grobie Lokira, boss draugr wstaje z sarkofagu i atakuje. Sprawmy, by ta walka była bardziej ekscytująca, wprowadzając pewne unikalne elementy skryptowe. Zaczniemy od dodania dwóch nieumarłych draugrów, by ich reanimować (z pełnymi efektów czarów) gdy boss zacznie wychodzić z grobu.


Zmodyfikowanie sceny[edit | edit source]

Najpierw trzeba na scenie ustawić draugra, którego będziemy wskrzeszać. W edytorze otwórz obszar LokirsTomb i ustaw widok na terenie jaskini, to komnata z bossem. W oknie Object przejdź do Actors > Actor albo użyj filtru, aby znaleźć "LvlDraugrMissileMale" i "LvlDraugrWarlockMale" i wybierz all. Ustaw oba draugry w jaskini.

Aktorzy ze Skyrim, tacy jak te druagry, zaczynają żywi (well, relatively speaking), my zaś chcemy, aby byli martwi. Podwójne kliknij na każdego z nich i w oknie właściwości Reference ustaw zaznaczenie przy Starts Dead.

Achtung.png Uwaga dla modderów, którzy znają poprzednie gry BGS - w Skyrim ustawienie zdrowia na zero nie wystarczy, aby aktor pojawiał się jako martwy. Trzeba w jego właściwościach ustawić "Starts Dead", tak jak opisano powyżej.

Zapisz swój plugin i uruchom go w grze, aby sprawdzić czy wszystko działa tak jak założyliśmy. Dwa martwe Draugr mają leżeć na podłodze w komnacie. O to na razie nam chodziło - ale wróćmy do Creation Kit i spróbujmy te dwa druagry postawić na nogach.


Planowanie zdarzeń[edit | edit source]

Wprowadzenie do Zdarzeń[edit | edit source]

Chcemy wskrzesić Draugry gdy tylko ich szef wyjdzie z grobu. To znaczy, że chcemy, aby tak się stało w odpowiedzi na Zdarzenie. "Zdarzenia" (Event) to działania lub zmiany stanu, o których gra powiadamia Papyrusa. Istnieją dziesiątki różnych zdarzeń, np.:

  • Interakcja z obiektem lub postacią (pociągnięcie za dźwignię, otwieranie drzwi, plądrowanie zwłok).
  • Podnoszenie, wyciąganie lub schowanie do ekwipunku, upuszczanie przedmiotów.
  • Wchodzenie lub wychodzenie z obszarów.
  • Wchodzenie lub wychodzenie z trybu walki, otrzymywanie obrażeń, umieranie.
  • wiele, wiele więcej.

Po prostu - jeśli gracz lub inna postać w grze wykonuje pewne czynności, robi to poprzez zdarzenia.


Wywołanie zdarzenia aktywującego[edit | edit source]

Być może nawet nie zdajesz sobie z tego sprawy, ale nasz przykładowy plugin już korzysta z zdarzenia wysyłanego do Papyrusa. To dzięki niemu boss wie, kiedy wyjść z sarkofagu. Jeśli pamiętasz z poradnika o tworzeniu pułapek - boss wykorzystuje pole wyzwalacza jako swojego aktywującego rodzica (Activate Parent). Kiedy gracz wchodzi do pola wyzwalacza, wyzwalacz aktywuje bossa, zmuszając go żeby powstał.

InDepth.jpg Są tu w użyciu pewne zdefiniowane skrypty działające poza polem widzenia, ale generalnie oto jak to działa:
  • Gracz wchodzi z pole wyzwalacza, co wywołuje zdarzenie onTriggerEnter
  • W odpowiedzi na to skrypt z wyzwalacza wysyła informację, że został aktywowany
  • Draugr boss jest podpięty do pola wyzwalacza jako dziecko, dlatego otrzymuję tę informację o aktywacji
  • Skrypt ustawiony na bossie odpowiada na zdarzenie - aktywację, oraz sprawia że boss się budzi

Możemy użyć tego samego pola wyzwalacza do wysłania zdarzenia Activate (en) do naszych dwóch martwych draugrów ochotników.

Dla każdego z Draugrów:

  1. Dwukrotnie kliknij na Draugra aby otworzyć jego okno właściwości.
  2. Odszukaj i wybierz zakładkę Activate Parents.
  3. Kliknij prawym w pustą listę i wybierz "New". Wskaźnik myszy zmieni się na wskaźnik wyboru obiektu-referencji.
  4. Kliknij na "Select Reference in Render Window"
  5. Gdy pojawi się kursor celownika, kliknij dwukrotnie na pole wyzwalacza.
Achtung.png Jeśli na scenie nie widać pola wyzwalacza, pamiętaj że możesz używać klawisza "M" aby przełączać jego widoczność.

Teraz oba draugry dostaną powiadomienie o zdarzeniu aktywacji, gdy gracz wdepnie w pole wyzwalacza. Na razie właściwie nic się nie stanie, ponieważ draugry nie posiadają odpowiedniego skryptu, który będzie im mówił, co mają zrobić gdy wyzwalacz zostanie aktywowany.


Skrypty sterujące[edit | edit source]

Pierwsze koty za płoty[edit | edit source]

Czas napisać jakiś skrypt. Uruchom swój edytor tekstów (my dostarczamy ustawień, takich jak kolorowania składni, na razie tylko dla edytorów Notepad++ oraz Sublime Text), stwórz nowy plik o nazwie "LokirsDraugrResurrection.psc".

Zacznijmy od nazwania skryptu i wskazania jego rodzaju:

scriptName LokirsDraugrResurrection extends Actor
{Wskrzesza dwa martwe Draugry w grobowcu Lokira.}


InDepth.jpg
  • scriptName LokirsDraugrResurrection - To jest nazwa skryptu. Musi ona dokładnie zgadzać się z nazwą pliku ze skryptem.
  • extends Actor - Ten skrypt zostanie ustawiony na aktorze (Draugrze), więc powinien mieć takie możliwości, jakie posiadają inne skrypty aktorów.
  • {...} - Tekst w nawiasach klamrowych to tylko nasz opis pliku ze skryptem, taki komentarz. Nie jest wymagany, ale dobrze go mieć.


Chcemy teraz sprawić, aby skrypt reagował na zdarzenie aktywowania, czyli onActivate. Aktywacja ma miejsce, gdy inny podmiot, np. gracz lub NPC, próbuje "używać" lub "aktywować" obiekt. W tym przypadku skrypt ustawiony na polu wyzwalacza prześle informację o aktywacji, jeśli nastąpi.

scriptName LokirsDraugrResurrection extends Actor
{Wskrzesza dwa martwe Draugry w grobowcu Lokira.}

Event OnActivate(ObjectReference akActionRef)
   ; Rzuca na Draugra zaklecie wskrzeszenia
EndEvent


Rzucenie zaklęcia[edit | edit source]

Aby wskrzesić Draugry, rzucimy na nie zaklęcie wskrzeszenia. W tym celu wpierw należy utworzyć własność Property. Będzie to własność typu Spell (zaklęcie). Dopiero wtedy edytor będzie wiedział jakiego zaklęcia ma użyć, aby wskrzesić naszych dwóch ochotników z przykładowego pluginu.

NewFeature.jpg Dla osób znających poprzednie języki skryptowe z gier ze stajni BGS jest to bardzo duża zmiana. W Papyrusie nie można tak po prostu napisać Editor ID obiektu, na którym chcesz wykonać jakieś działania. Trzeba posłużyć się własnością (Property). Dzięki temu, jak przekonasz się w przyszłości, używanie skryptów bardziej elastyczne, jeden skrypt można wykorzystywać w wielu miejscach i projektach, ponieważ każda instancja skryptu może mieć różne wartości dla swych własności Property. Na tej stronie znajdziesz informacje o własnościach i zmiennych w Papyrusie. (en)

Zaczniemy od "deklaracji" własności typu zaklęcie - Spell:

scriptName LokirsDraugrResurrection extends Actor
{Wskrzesza dwa martwe Draugry w grobowcu Lokira.}

Spell property reanimateSpell auto

EVENT OnActivate(ObjectReference akActionRef)
   ; Rzuca na Draugra zaklecie wskrzeszenia
EndEVENT


InDepth.jpg
  • Spell - To rodzaj własności. W ten sposób oznaczamy, że chcemy wykorzystać pewne zaklęcie Spell.
  • property - To słowo zastrzeżone. Dzięki niemu Papyrus wie, że ma się spodziewać nowej własności Property.
  • reanimateSpell - To wymyślona przez nas nazwa zmiennej, w której zapiszemy zaklęcie (możesz wpisać własną nazwę, np. zaklecieWskrzeszenia - tylko nie używaj polskich znaków). Papyrus będzie kojarzył to zaklęcie w każdym innymi miejscu, gdy powiemy że chcemy użyć tej własności.
  • auto - Kolejne zastrzeżone słowo. Dzięki niemu Papyrus automatycznie użyje odpowiednich funkcji do pobrania lub ustawienia zmiennej. Na razie nie trzeba się tym przejmować, właściwie prawie nigdy nie trzeba, bo na ogół nie ma znaczenia co dokładnie dzieje się po użyciu słowa auto.
  • ; ... - Średniki w Papyrusie zawsze poprzedzają komentarz. Używaj ich, aby notować co skrypt robi w danym miejscu. Gra będzie ignorować wszystko co jest zapisane w takim komentarzu, cały tekst w linii za znakiem średnika, dlatego możesz wpisywać tam co tylko zechcesz.


Mamy zdefiniowane zaklęcie, ale na razie nic ono nie robi. Zaklęcia można rzucać, własności typu Spell mogą używać funkcji "rzuć zaklęcie", a jest to funkcja Cast. W bloku zdarzenia onActivate możemy zatem dodać nową linię:

scriptName LokirsDraugrResurrection extends Actor
{Wskrzesza dwa martwe Draugry w grobowcu Lokira.}

Spell property reanimateSpell Auto

EVENT OnActivate(ObjectReference akActionRef)
   ; Rzuca na Draugra zaklecie wskrzeszenia
   reanimateSpell.Cast(Self, Self)
EndEVENT

Podobnie jak w przypadku wielu innych funkcji, musimy jej podać jeden lub więcej "argumentów", aby funkcja miała na czym pracować. W przypadku funkcji Cast należy podać źródło (kto rzuca zaklęcie) oraz cel (na kogo jest rzucane zaklęcie). W tym przykładzie założyliśmy, że Draugr będzie rzucał zaklęcie sam na siebie, dlatego podaliśmy argument Self zarówno jako źródło, jak i cel. Self to takie ułatwienie, inaczej musielibyśmy tworzyć nowe własności dla wskrzeszanych Draugrów. Self oznacza "na siebie", Papyrus będzie wiedział, że funkcja Cast ma zostać użyta na tych obiektach, do których cały ten skrypt jest przypisany.

Zapisz i skompiluj skrypt, a następnie powróć do Creation Kit.


Przypisanie skryptu do aktora[edit | edit source]

W edytorze kliknij podwójne na jednym z Draugrów, aby otworzyć okno właściwości, a następnie przejdź do zakładki Scripts (można nacisnąć klawisz 'End', aby przejść na koniec, jest to ostatnia zakładka na liście). To miejsce, gdzie podłączymy nasz skrypt:

  1. Kliknij przycisk Add.
  2. W oknie Add script... wprowadź nazwę naszego nowego skryptu, LokirsDraugrResurrection.
  3. Podwójne kliknij na skrypcie, aby dodać go do Draugra.

Teraz skrypt został przypisany do aktora, ale musimy jeszcze powiedzieć edytorowi którego właściwie zaklęcia chcemy użyć (na razie mamy zdefiniowaną własną, wymyśloną nazwę zaklęcia). Użyjemy zaklęcia dunReanimateSelf. Jest to specjalne zaklęcie, którego gracz nie może używać w grze, a stworzone zostało właśnie specjalnie do przypadków takich jak ten.

  1. Wybierz LokirsDraugrResurrection w zakładce Scripts.
  2. Kliknij na Properties.
  3. Lista, która się pojawi, będzie mieć tylko jedną własność - naszą reanimateSpell.
  4. Wybierz reanimateSpell i kliknij na Edit Value.
  5. Zauważ, że lista ta wyświetla tylko obiekty właściwe dla danego rodzaju obiektów - zaklęcia w tym przypadku.
  6. Wybierz dunReanimateSelf. Kliknij przycisk OK.

Powtórz tę czynność dla drugiego Draugra. Zapisz pracę i przetestuj plugin w grze!


Śledzenie przebiegu działania skryptu[edit | edit source]

Na pierwszy rzut oka wszystko zapewne zadziałało zgodnie z oczekiwaniami. Jednakże, jeśli pograsz trochę dłużej, być może zauważysz, że zmartwychwstanie nastąpi w dowolnej chwili gdy draugr odbierze informację o zdarzeniu aktywowania. Nawet jeśli gracz podejdzie do zwłok draugra i je aktywuje, to draugr powstanie! To dosyć niemiła niespodzianka i wcale nie taki był nasz zamiar! Takie nieoczekiwane błędy można na szczęście wyeliminować, dodając w skrypcie więcej warunków.

Istnieje wiele sposobów, by to naprawić, by mieć pewność że zmartwychwstanie zdarzy się tylko raz - na przykład można użyć zmiennej sterującej. Można również sprawić, aby skrypt pomijał aktywację od gracza, ale nadal może spowodować przypadkowe ponowne zmartwychwstanie np. przez NPC.

Naszą nową własność przyrównany do akActionRef, który jest parametrem ze zdarzenia OnActivate(). Ten parametr jest taką specjalną zmienną, używaną tylko w zdarzeniach aktywacji onActivate. W zmiennej akActionRef Papyrus przechowuje informację kto dokonał aktywacji.

scriptName LokirsDraugrResurrection extends Actor
{Ten skrypt jest dla martwego draugra w grobowcu Lokira. Sprawia ze Draugr powstaje z martwych.}

Spell property reanimateSpell Auto          ; zaklecie uzywane na sobie aby sie wskrzesic
objectReference property myTrigger auto     ; w zmiennej myTrigger czekamy na wlasciwy podmiot, ktory dokona aktywacji

Event OnActivate(ObjectReference akActionRef)
   ; Ktos mnie aktywowal - sprawdz czy to byl moj wyzwalacz.
   if (akActionRef == myTrigger)
      ; Rzuc czar wskrzeszenia na Draugra.
      reanimateSpell.Cast(Self, Self)
   EndIf
EndEvent


InDepth.jpg
  • objectReference - To rodzaj danych naszej nowej własności.
  • myTrigger - To wymyślona przez nas nazwa własności.
  • if - To słowo jest początkiem bloku warunkowego. Jeśli porównanie za tym słowem jest prawdą, to skrypt wykona wszystkie instrukcje z bloku warunkowego, aż do słowa endif.
  • (akActionRef == myTrigger) - To jest porównanie własności, test ich zgodności. W tym przypadku porównanie będzie prawdą tylko jeśli obiekt zapisany w akActionRef (kto dokonał aktywacji aktora) będzie taki sam jak obiekt zapisany w myTrigger (ma to być pole wyzwalacza, za chwilę jeszcze je zdefiniujemy).
  • endIf - To słowo kończące korespondujący blok warunkowy, zapoczątkowany słowem if. Można mieć kilka bloków zagnieżdżonych jeden w drugim. Warto wtedy stosować wcięcia w tekście kodu, aby można było łatwo rozpoznać gdzie zaczyna i kończy się dany blok warunkowy.


Na koniec musimy jeszcze coś wsadzić do naszej własności myTrigger. W edytorze podwójnie kliknij na jednym z Draugrów. Przejdź do zakładki Scripts i wybierz nasz skrypt LokirsDraugrResurrection. Kliknij na Properties. Wtedy wybierz naszą własność myTrigger i kliknij na Edit Value. Wybierz Pick Reference in Render Window. Wreszcie podwójnie kliknij na niebieskie pudło pola wyzwalacza, które powoduje że Draugr boss wychodzi ze swojego grobu.


Zapisz pluga i przetestuj.

Zauważysz że Draugry powstają tylko raz, mimo że gracz może chodzić w tę i nazad przez pole wyzwalacza przy wejściu do komnaty z jaskinią. Dzieje się tak ponieważ własność skryptu przypisanego do pola wyzwalacza używa zmiennej doOnce, która powoduje, że aktywacja jest przesyłana tylko za pierwszym razem gdy gracz wdepnie w pole wyzwalacza. Możesz sprawdzić skrypt przypisany do pola wyzwalacza (defaultActivateSelf) i zobaczyć w jaki sposób przypisywać domyślne lub automatyczne wartości do własności.


LeftArrow.png Poprzedni poradnik Powrót do spisu poradników Następny poradnik RightArrow.png


Language: English  • français • 日本語 • polski