Tworzenie gniazd potworów

Niniejszy samouczek opisuje jak utworzyć obszar potyczki (encounter area) z nekkerami, który przestaje generować (spawn) potwory po zniszczeniu ich gniazda za pomocą petardy Kartacz.
Samouczek zakłada, że wiesz jak wygenerować Geralta oraz stworzyć działające Encounters i pomija szczegóły z tym związane.

1. Otwórz Przeglądarkę Zasobów (Asset Browser) i wyszukaj szablon przedmiotu (entity template) "neccer_nest". Umieść gniazdo w swoim poziomie i w jego właściwościach (properties) wprowadź:
  • nestNumber = 1

2. Utwórz obszar potyczki (encounter area) wokół gniazda i jego najbliższej okolicy. Dodaj w jego właściwościach przynajmniej jeden rodzaj potwora (np. game\gameplay\monsters\nekker\nekker.w2ent) i wprowadź tagi:
  • CNode / tags = "nekker_nest_guardians01"

Skonfiguruj pozostałe ustawienia zgodnie z samouczkiem dotyczącym potyczek (encounters) wspomnianym powyżej.

3. Utwórz obszar aktywacji (trigger area) wokół powyższych elementów. Kliknij PPM na ziemi i wybierz Gameplay -> Add Trigger Area. Wprowadź tagi:
  • CNode / tags = "nekker_nest01_trigger"

Twoja lokacja powinna wyglądać podobnie jak na obrazku poniżej:


Obszar aktywacji może być mniejszy bądź większy, w zależności od układu twojego poziomu. Jednak na wszelki wypadek powinien być zawsze większy od obszaru potyczki.

4. Otwórz plik zadania (quest file) i dodaj w nim następujące elementy:

- Flow control -> Pause, wprowadź:
  • Nowy warunek (condition): "CQuestInsideTriggerCondition"
  • tag = "nekker_nest01_trigger", który odnosi się do twojego obszaru aktywacji (patrz punkt 3.).

- Flow control -> Condition, wprowadź:
  • questCondition = "CQuestFactsDBCondition" a następnie:
  • factId = "nekker_nest_1_destroyed" - cyfra 1 odwołuje się do właściwości nestNumber umieszczonego w poziomie przedmiotu "neccer_nest". Jeżeli tworzysz kolejne gniazda, musisz nadawać im postępujące numery i w analogicznych bloczkach Condition wprowadzać factId wg szablonu "nekker_nest_#_destroyed".
  • queryFact = "QF_Sum"
  • value = "1"
  • compareFunc = "CF_Equal"

- Scripting -> Script, wprowadź:
  • functionName = "QEnableEncounters" oraz:
  • encounterTag = "nekker_nest_guardians01", który odnosi się do twojego obszaru potyczki (patrz punkt 2.).
  • enable = "false"

5. Połącz wszystko zgodnie z obrazkiem poniżej:


Ze STARTu do wejścia (In) bloczku PAUSE, z wyjścia (None) bloczku PAUSE do wejścia bloczku CONDITION, z wyjścia TRUE bloczku CONDITION do wejścia bloczku SCRIPT oraz z wyjścia FALSE bloczku CONDITION do wejścia bloczku PAUSE, co zapętla sygnał do momentu aż warunek zostanie spełniony.

Jeżeli teraz wejdziesz do obszaru potyczki, potwory zaczną być generowane. Gdy tylko zniszczysz gniazdo nekkerów do bazy danych (database) zostanie dodany fakt "nekker_nest_1_destroyed" z wartością 1. Gdy gracz wchodzi w aktywator (trigger), sprawdzamy czy fakt ma wartość 0 czy 1. Jeżeli ma wartość 1, to obszar potyczki zostaje zdezaktywowany i potwory przestają być generowane.
Ważne: Należy pamiętać, że gniazda można niszczyć tylko posiadając petardę Kartacz i wiedzę na temat nekkerów. Oznacza to, że postać musi zabić wcześniej około 10 nekkerów bądź przeczytać opisującą je książkę.

Wiedza o potworach: Wiedzę Geralta dotyczącą potworów (pozwalającą na m.in. niszczenie gniazd) można także odblokować z poziomu pliku zadania (quest file). Aby pominąć warunek zabijania 10 potworów/czytania o nich w grze, użyj bloczku FactsDB Change z factID "Knowledge_5_2" oraz value "1".

SPOSÓB ALTERNATYWNY (oryginalny, z gry Wiedźmin 2)

1. Utwórz gniazdo nekkerów według opisu powyżej i otaguj je (np. "nekker_nest01");

2. Jak wyżej;

3. Pomiń tworzenie obszaru aktywacji;

4. Otwórz plik zadania i dodaj w nim następujące elementy:

- Flow control -> Pause, wprowadź:
  • Nowy warunek: "CQuestInteractionCondition"
  • ''interactionName = "destroy_nest_interaction", która to nazwa odnosi się do standardowego Komponentu Interakcji (Interaction Component) z szablonu przedmiotu "neccer_nest".
  • ownerTags = "nekker_nest01", który jest tagiem gniazda umieszczonego w poziomie

- Flow control -> Condition, wprowadź:
  • questCondition = "CQuestActorCondition" a następnie:
  • actorTag = "PLAYER"
  • checkType = "CQCHasItem"
  • item = "Grapeshot"
  • quantity = "1"
  • presenceFlag = "true"

- Flow control -> Pause, wprowadź:
  • questCondition = "CQuestFactsDBCondition" a następnie:
  • factId = "nekker_nest_1_destroyed" - cyfra 1 odwołuje się do właściwości nestNumber umieszczonego w poziomie przedmiotu "neccer_nest". Jeżeli tworzysz kolejne gniazda, musisz nadawać im postępujące numery i w analogicznych bloczkach Condition wprowadzać factId wg szablonu "nekker_nest_#_destroyed".
  • queryFact = "QF_Sum"
  • value = "1"
  • compareFunc = "CF_Equal"

- Scripting -> Script, change:
  • functionName = "QEnableEncounters" oraz:
  • encounterTag = "nekker_nest_guardians01", który odnosi się do naszego obszaru potyczki.
  • enable = "false"

5. Połącz wszystko w następujący sposób:


Ze STARTu do wejścia bloczku PAUSE (Interaction), z wyjścia bloczku PAUSE (Interaction) do wejścia bloczku CONDITION, z wyjścia FALSE bloczku CONDITION z powrotem do wejścia bloczku PAUSE (Interaction) oraz z wyjścia TRUE bloczku CONDITION do wejścia bloczku PAUSE (FactsDB) i ostatecznie z wyjścia bloczku PAUSE (FactsDB) do wejścia bloczku SCRIPT.