Wunderwaffe 30 sie 2012, 00:17
Iskra
Łowca
Posty: 480
Rejestracja: 06 mar 2012, 20:43
Ostatnio: 04 lis 2018, 20:43
Lokalizacja: Siedlce
Ulubiona broń: F1 Grenade
Kozaki:
187
Na górę
Post autor: Wunderwaffe  Ostatnio zmieniony 14 wrz 2012, 22:46 przez Wunderwaffe, łącznie zmieniany 1 raz.
Junx chciał się dowiedzieć, jak tworzyć takie questy. Ostrzegam: to są absolutne podstawy i na pewno nie stworzycie z tym tutkiem drugiego Priboia. Zrobicie tylko prostego questa z rozmową z Wilkiem i Sidorowiczem.

A zatem przygotujcie sobie kilka plików.
    \gamedata\config\gameplay\dialogs_escape.xml
    \gamedata\config\gameplay\info_l01escape.xml
    \gamedata\config\gameplay\tasks_escape.xml
    \gamedata\config\gameplay\storyline_info_escape.xml
    \gamedata\config\gameplay\character_desc_escape.xml
    \gamedata\config\text\pol\stable_dialogs_escape.xml
    \gamedata\config\text\pol\stable_storyline_info_escape.xml

Jeśli ich nie macie, to nie róbcie tych questów, gdyż prawdziwy modder ma na dysku rozpakowaną gamedatę.

Zacznijmy od infoportion

Otwórzcie plik info_l01escape.xml. To tam gromadzą się infoportions. Potrzebne nam będą trzy takie. Jeden rozpoczynający zadanie i dwa dla każdego punktu (rozmowa z Wilkiem i z Sidem).

Kod: Zaznacz cały

<info_portion id="start_my_first_task">
   <task>my_first_task</task>
</info_portion>

<info_portion id="player_talked_with_wolf"></info_portion>

<info_portion id="player_talked_with_sidorovich"></info_portion>


Pierwsze aktywuje zadanie "my_fist_task", a dwa pozostałe aktywują nam wymagania.

Robimy zadanie

Zadania zadeklarowane są w plikach tasks_(...).xml. Nasze zaczyna się w Kordonie, więc utworzymy je w tasks_escape.xml.

Kod: Zaznacz cały

<game_task id="my_first_task">
   <title>my_first_task</title>
   <objective>
      <text>my_first_task_0</text>
      <icon>skopiuj tu coś z innego questa, bo pewnie nie masz własnej ikony</icon>
      <infoportion_complete>player_talked_with_wolf</infoportion_set_complete>
      <article>my_first_task_description</article>
   </objective>
   <objective>
      <text>my_first_task_1</text>
      <infoportion_complete>player_talked_with_sidorovich</infoportion_complete>
   </objective>
</game_task>


I tłumaczę już, o co chodzi.

Kod: Zaznacz cały

<game_task id="my_first_task">

Tworzy nowe zadanie.

Kod: Zaznacz cały

<objectve>

Punkt zadania (wymaganie). Spać mi się chce.

Kod: Zaznacz cały

<text>my_first_task_0</text>

Nazwa punktu.

Kod: Zaznacz cały

<icon>skopiuj tu coś z innego questa, bo pewnie nie masz własnej ikony</icon>

Ikona questa. Nie wiem czemu daje się to w <objective>.

Kod: Zaznacz cały

<infoportion_complete>player_talked_with_wolf</infoportion_set_complete>

Infoportion, który powoduje wykonanie punktu.

Kod: Zaznacz cały

<article>my_first_task_description</article>

Opis zadania. Też nie wiem, czemu w <objective>.

I jeszcze inne fajne tagi XML, które możesz wrzucić do zadania.

Kod: Zaznacz cały

<infoportion_fail>...</infoportion_fail>

Aktywowanie takiego infoportion powoduje anulowanie zadania.

Kod: Zaznacz cały

<function_complete>...</function_complete>

Chyba to jest skrypt wywoływany, gdy zadanie się kończy. Chyba.

Kod: Zaznacz cały

<map_location_type hint="...">...</map_location_type>

Zaznaczenie obiektu zadania na mapie. W hint podajemy jego wewnętrzną nazwę (np. "volk" dla Wilka). Między tagami dajemy green_location albo blue_location. Może jeszcze coś, sprawdźcie sobie w plikach gry, bo mnie się chce. Chce to mi się położyć.

Kod: Zaznacz cały

<object_story_id>...</object_story_id>

Podajemy tutaj kogoś z gamedata\config\game_story_ids.ltx.

Opis zadania

Otwórz gamedata\config\gameplaystoryline_info_escape.xml i wpisz gdzieś:

Kod: Zaznacz cały

<article id="my_first_task_description" name="first_task" article_type="task" group="my_first_task/0">
        <text>first_task_description</text>
</article>


A teraz gamedata\config\gameplay\stable_storyline_info_escape.xml i również wpisz gdzieś:

Kod: Zaznacz cały

<string id="my_first_task_description">
   <text>Sidorowicz wysłał mnie z pytaniem do Wilka i oczekuje przekazania odpowiedzi.</text>
</string>


Aktywacja infoportions

Super, zbliżam się do końca :D! Zrobimy to rozmową. Mam nadzieję, że to umiecie. Jeśli nie, to nie róbcie questów, tylko uczcie się innych rzeczy (np. szycia kowadłem).

1. rozmowa będzie taka:
Naznaczony: Masz dla mnie specjalne zlecenie?
Sidorowicz: Zapytaj Wilka, czy chce wpaść do mnie na kieliszeczek wódeczki.
Naznaczony: OK.

Kod: Zaznacz cały

<dialog id="escape_trader_vodka_task">
 <phrase_list>
   <phrase id="0">
      <text>escape_trader_vodka_task_0</text>
      <next>1</next>
   </phrase>
   <phrase id="1">
      <text>escape_trader_vodka_task_1</text>
      <next>2</next>
   </phrase>
   <phrase id="2">
      <text>escape_trader_vodka_task_2</text>
      <give_info>start_my_first_task</give_info>
   </phrase>
 </phrase_list>
</dialog>


Do części Sidorowicza w character_desc_escape dorzucamy to:

Kod: Zaznacz cały

<actor_dialog>escape_trader_vodka_task</actor_dialog>


Mam nadzieję, że z pisaniem właściwych tekstów do dialogów w stable_dialogs_escape sobie poradzicie, bo to naprawdę proste.

2. rozmowa:
Naznaczony: Mam ci do przekazania wiadomość.
Wilk: O co chodzi?
Naznaczony: Sidorowicz pyta, czy wpadniesz do niego się napić.
Wilk: Oczywiście, że tak!

Kod: Zaznacz cały

<dialog>
 <phrase_list>
   <phrase id="0">
      <text>escape_volk_vodka_task_0</text>
      <next>1</next>
   </phrase>
   <phrase id="1">
      <text>escape_volk_vodka_task_1</text>
      <next>2</next>
   </phrase>
   <phrase id="2">
      <text>escape_volk_vodka_task_2</text>
      <next>3</next>
   </phrase>
   <phrase id="3">
      <text>escape_volk_vodka_task_3</text>
      <give_nfo>player_talked_with_wolf</give_info>
   </phrase>
 </phrase_list>
</dialog>


No i do character_dec_escape w sekcji Wilka:

Kod: Zaznacz cały

<actor_dialog>escape_volk_vodka_task</actor_dialog>


3. rozmowa:
Naznaczony: Wilk się zgodził.
Sidorowicz: To super.

Kod: Zaznacz cały

<dialog id="escape_trader_my_first_task">
 <phrase_list>
  <phrase id="0">
    <text>escape_trader_my_first_task_0</text>
    <next>1</next>
  </phrase>
  <phrase id="1">
    <text>escape_trader_my_first_task_1</text>
  </phrase>
 </phrase_list>
</dialog>




A oto przydatne tagi:

Kod: Zaznacz cały

<action>...</action>

Aktywuje jakiś skrypt. Przydaje się, bo dzięki temu można zrobić np. nagrodę za zadanie (skrypt wrzucający nam do ekwipunku coś).

Kod: Zaznacz cały

<give_info>...</give_info>

Aktywuje infoportion. Przyda wam się również teraz.

Kod: Zaznacz cały

<has_info>...</has_info>

Opcja dialogowa pojawia się tylko, gdy aktywowano podany infoportion.

Kod: Zaznacz cały

<dont_has_info>...</dont_has_info>

Opcja dialogowa pojawia się tylko, gdy nie aktywowano podanego infoportion.

Próbujcie coś zrobić. Na odpowiedzi, poprawki i uzupełnienia będzie czas jutro. Dobranoc!
Obrazek
Postawili kozaka za ten post (3):
Czyste Niebo
ModderModder
Posty: 2341
Rejestracja: 15 kwie 2008, 09:39
Ostatnio: 25 maja 2026, 22:52
Lokalizacja: Na co Ci to :)
Ulubiona broń: Sniper Rifle SVDm2
Kozaki:
358
Na górę
Post autor: Junx 
Dzięki wielkie, żeby nie robić nowego tematu w CoP napiszę tutaj. Jak wiadomo w podstawie mamy jako pierwsze zadania przeszukać helikoptery a ja chce jako takie zadanie "Dostań się do Skadowska" i co muszę zrobić?

Niby edytowałem tm_zaton.ltx [gamedata\configs\misc] zostawiając tylko:

Kod: Zaznacz cały

[zat_a2_reach_base]
icon = ui_inGame2_Bezopasnoe_mesto
prior = 104
storyline = true
title = zat_a2_reach_base_name
descr = zat_a2_reach_base_text
target = zat_a2_sr_noweap
condlist_0 = {=actor_in_zone(zat_a2_sr_noweap)} complete


Lecz coś nie wyszło lub coś nie dodałem...
Ryzen 5600x || 32gb DDR4 || RTX 2080 Super
Iskra
Łowca
Posty: 480
Rejestracja: 06 mar 2012, 20:43
Ostatnio: 04 lis 2018, 20:43
Lokalizacja: Siedlce
Ulubiona broń: F1 Grenade
Kozaki:
187
Na górę
Post autor: Wunderwaffe 
Nigdy nie modowałem Zewu Prypeci, więc nie pomogę. Tamtejsza konstrukcja zadań to dla mnie czarna magia :).
Obrazek
Czyste Niebo
ModderModder
Posty: 2341
Rejestracja: 15 kwie 2008, 09:39
Ostatnio: 25 maja 2026, 22:52
Lokalizacja: Na co Ci to :)
Ulubiona broń: Sniper Rifle SVDm2
Kozaki:
358
Na górę
Post autor: Junx 
A czy zasada nie jest ta sama jak w każdej części?


Edit: Przy zmianie miejsca do nowej gry [inna mapa] wywala mnie coś takiego:

Kod: Zaznacz cały

FATAL ERROR
 
[error]Expression    : no_assert
[error]Function      : CALifeStoryRegistry::add
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cpp
[error]Line          : 30
[error]Description   : Specified story object is already in the Story registry!
 

stack trace:


Coś trzeba jeszcze gdzieś zmienić?
Ryzen 5600x || 32gb DDR4 || RTX 2080 Super
Iskra
Łowca
Posty: 480
Rejestracja: 06 mar 2012, 20:43
Ostatnio: 04 lis 2018, 20:43
Lokalizacja: Siedlce
Ulubiona broń: F1 Grenade
Kozaki:
187
Na górę
Post autor: Wunderwaffe 
Czy od ostatniego uruchomienia gry zmieniałeś TYLKO I WYŁĄCZNIE spawn gracza?
Obrazek
Czyste Niebo
ModderModder
Posty: 2341
Rejestracja: 15 kwie 2008, 09:39
Ostatnio: 25 maja 2026, 22:52
Lokalizacja: Na co Ci to :)
Ulubiona broń: Sniper Rifle SVDm2
Kozaki:
358
Na górę
Post autor: Junx 
No tak. Jako podstawa jest Szkielet Mod dodałem swoje pliki "wywalenia" fabuły i wtedy poszło bez problemu, więc wyłączyłem grę zmieniłem miejsce spawnu spakowałem plik all.spawn i przy nowej grze mam w/w błąd.
Ryzen 5600x || 32gb DDR4 || RTX 2080 Super
Iskra
Łowca
Posty: 480
Rejestracja: 06 mar 2012, 20:43
Ostatnio: 04 lis 2018, 20:43
Lokalizacja: Siedlce
Ulubiona broń: F1 Grenade
Kozaki:
187
Na górę
Post autor: Wunderwaffe 
To nie jest w takim razie pytanie do tego tematu, tylko do jakiegoś o spawnie.
Obrazek
Kacper777
Konto usunięte
Na górę
Post autor: Kacper777 
Mam pytanie. Jak to jest z tymi infoportions? Skąd gra wie, że np. przy zadaniu garbage_meet_stalker infoportion "garbage_meet_stalker_done" to wykonanie danego punktu. Albo np. w Zewie Monolitu, że przy zadaniu "Oczyść dolne kondygnacje Sarkofagu z burerów" - infoportion "kill_burer_done" jest wtedy gdy zabijemy te burery, skąd gra o tym wie? To jest gdzieś zapisane? Bo chyba nie można tworząc własne zadania nazywać infoportiony tak jak chcemy tylko tak żeby gra je rozpoznała, więc jakby nie patrzeć możemy tworzyć tylko zadania, które mają taką konstrukcję jak te co już są do tej pory. Więc jesli komuś wpadnie jakiś pomysł do głowy jakiś pomysł ciekawy to nie będzie mógł tego zrobić. To jest w jakiś skryptach zapisane czy coś? Sorry jeśli bredzę, nie jestem modderem, po prostu staram się jakoś logicznie wnioskować. Z góry dzięki za odpowiedź.

Jak np. zrobić takie zadanie i czy w ogóle się da?
Tytuł: Zdobądź wyposażenie dla stalkerów w wiosce kotów
W opisie dam, że stalkerzy potrzebują broni do walki z najemnikami. Zleceniodawcą będzie Wilk. Wiem jak zrobić te rzeczy bo jest poradnik Wunderwaffe. Ale teraz przejdę do sedna. Jak zrobić te punkty?

1. Porozmawiaj z Woroninem (w sumie to jest w poradniku)
2. Znajdź broń w wagonie w Dolinie Mroku
3. Zabierz broń dla stalkerów (5 kałachów z optyką)
4. Porozmawiaj z Barmanem (w sumie to też jest w poradniku)
W tym momencie dostajemy zadanie od Barmana na znalezienie pięciu LR-300, w nagrodę za ich oddanie dostajemy kasę i jeden z nich
5. Dostarcz znalezione bronie (kałachy i LR do Wilka)
6. Porozmawiaj z Wilkiem (no wiem jak to)

Chodzi mi jak to zrobić, ale zwłaszcza jakie dać infoportiony. W przypadku rozmów to wiem, że player_talked_with_... ale przy innych punktach?

Albo inne zadanie:
Udziel pomocy rannemu stalkerowi (Tolik)
Aktywuje się automatycznie po pierwszej rozmowie z Wilkiem o bandytach

1. Oczyść teren (w promieniu dwudziestu metrów) wokół stalkera z mutantów (wiem, że nietypowe i dziwne, właśnie o to mi chodzi czy da się takie robić, albo czy da się zrobić, że zabij jakiegoś stalkera określoną bronią i inne dziwaczne dziwostki)
2. Udziel pomocy (apteczka)
3. Porozmawiaj z Tolikiem
Zrobiłem wszystko według poradnika, ale coś nie wyszło. Gra nie odpala się i wyskakuje log

Kod: Zaznacz cały

FATAL ERROR
 
[error]Expression    : false
[error]Function      : CXml::Init
[error]File          : E:\stalker\sources\trunk\xrXMLParser\xrXMLParser.cpp
[error]Line          : 87
[error]Description   : XML file:gameplay\dialogs_escape.xml value: errDescr:Error reading end tag.
 

stack trace:
Czyste Niebo
ModderModder
Posty: 2341
Rejestracja: 15 kwie 2008, 09:39
Ostatnio: 25 maja 2026, 22:52
Lokalizacja: Na co Ci to :)
Ulubiona broń: Sniper Rifle SVDm2
Kozaki:
358
Na górę
Post autor: Junx 
Nie zamknąłeś dialogu, sprawdź czy masz poprawnie otwarte jak i zamknięte dialogi.
Ryzen 5600x || 32gb DDR4 || RTX 2080 Super
Weteran
Posty: 655
Rejestracja: 23 mar 2010, 15:12
Ostatnio: 21 maja 2025, 23:10
Kozaki:
189
Na górę
Post autor: Plaargath 
Cytowany przez Ciebie błąd mówi, że gdzieś nie domknąłeś tagów w .xml'u. (któregoś z wyrażeń zaczynających się od "<" a kończących się na ">")

I tak, infoportiony skryptami można dowolnie rozdawać i zabierać.
W pliku xr_logic od linijki 578 jest odpowiedź na Twoje pytanie - w nieco innym języku :)

A tu przystępna odpowiedź na przykładzie:
Zobacz sobie do pliku %\gamedata\config\gameplay\dialogs_bar.xml, linijka 1855
[SYNTAX="xml"]<action>bar_dialogs.professor_for_resque</action>[/SYNTAX]
to między tagami <action> a </action> oznacza wywołanie funkcji ze skryptu, tutaj funkcji "professor_for_resque" ze skryptu %\gamedata\scripts\bar_dialogs.script,
w tymże skrypcie w linii 219 masz tę funkcję, która zarządza tym, co się stanie podczas dialogu w zależności czy masz infoportion:
[SYNTAX="lua"]
function professor_for_resque(npc, actor)
if not has_alife_info("rostok_kruglov_give_flash") then
dialogs.relocate_item_section(npc, "bar_ecolog_flash", "in")
db.actor:give_info_portion("rostok_kruglov_give_flash")
end
end
[/SYNTAX]
konkretnie, jeśli nie ma jeszcze infoportion "rostok_kruglov_give_flash", wtedy NPC (Krugłow) da Ci przedmiot "bar_ecolog_flash" (pendrive), a logika podaruje ten infoportion. Dzięki temu, nawet jeśli dialog miałby się powtórzyć, drugi raz nie dostaniesz, bo jest warunek "if", a infoportion już dostałeś.

Innymi słowy, na przykład w dialogach uruchamiają się skrypty. I to skrypty obsługują przepływ infoporcji.

Pooglądaj sobie dialogi, poszukaj dokąd odsyłają tagi <action> i więcej stanie się zrozumiałe.

Podobnie działa <precondition> w dialogu - odsyła do skryptu na zasadzie "jeśli ta akcja już była, to lecimy z tym dialogiem". Przykład:
plik %\gamedata\config\gameplay\dialogs_bar.xml, linijka 1105
[SYNTAX="xml]<precondition>bar_dialogs.actor_have_research</precondition>[/SYNTAX]
żeby zrozumieć, co to za warunek, musisz spojrzeć do bar.dialogs.script i znaleźć funkcję "actor_have_research", jest ona tam w linijce 145:
[SYNTAX="lua"]
function actor_have_research(first_speaker, second_speaker)
return first_speaker:object("bar_ecolog_flash") ~= nil
end
[/SYNTAX]
mówi, że nie jest nieprawdą (~= nil), że gość nie ma pendrive'a ("bar_ecolog_flash"), czyli w uproszczeniu, że pena już masz. Jeśli tak, to dialog leci dalej, wypowiada się kwestia "bar_bar_barman_ecolog_flash_done_0" i potem leci funkcja actor_transfer_research ze skrytpu bar_dialogs.script, jest w linijce 148:
[SYNTAX="lua"]
function actor_transfer_research(first_speaker, second_speaker)
dialogs.relocate_item_section(second_speaker, "bar_ecolog_flash", "out")
if has_alife_info("bar_rescue_research_reward") then
dialogs.relocate_money(second_speaker, 5000, "in")
end
end
[/SYNTAX]
oddajesz pendrive'a rozmówcy i jeśli dostałeś infoporcję "bar_rescue_research_reward" to dostajesz w nagrodę pięć koła.

Poszperaj sobie też searchem po plikach
a) szukając nazw konkretnych nazw infoporcji z dialogów - znajdziesz konkretne funkcje z nimi związane,
b) na wyrażenia "has_info", "has_alife_info", "dont_has_info", "give_info_portion", "give_info_portion_via_pda", "disable_info_portion", - znajdziesz m.in. funkcje z infoporcjami związane.

I pytaj dalej, jeśli coś niezrozumiałe/niewyczerpujące.

EDIT:
Aha jeszcze dwie kwestie, o które pytałeś, na przykładzie:

Spójrz sobie w %\gamedata\config\gameplay\game_tasks.xml, linia 31
[syntax="xml"]<infoportion_complete>yan_labx16_switcher_3_off</infoportion_complete>[/syntax]
taki tag Ci mówi o tym, otrzymanie jakiej infoporcji oznacza zaliczenie wykonania zadania.
ED3, więc w przypadku o którym pytasz, w pliku %\gamedata\config\gameplay\tasks_garbage.xml w linii 7 jest

Kod: Zaznacz cały

<infoportion_complete>garbage_meetstalker_done</infoportion_complete>
I druga rzecz - tworzoną infoporcję możesz sobie nazywać jak chcesz, dowolnie. Natomiast musisz (chyba, nie jestem pewien jak to w SoCu jest) zaanonsować jej istnienie w którymś z configów z tagiem "<game_information_portions>", przykładowo zajrzyj do %\gamedata\config\gameplay\info_l01escape.xml, jak to jest zrobione.

ED2:
Tworzenie infoporcji na stalker-game.com
Logika na stalker-game.com


ED4:
A ja od siebie mam pytanie do mądrzejszych, jak dokładnie działa parametr "prio" w znaczniku <game_task>?
Na stalker mod portal czytam, że:

Kod: Zaznacz cały

prio = "" defines the priority of the task. The higher the priority, the higher the likelyhood that the current quest marker will be switched to ours. 
ale tego nie kumam.
Obrazek Obrazek

Merkantylizm, srerkantylizm.
Postawili kozaka za ten post (1):
Gość
Kacper777
Konto usunięte
Na górę
Post autor: Kacper777 
Pytanie nr 1
Skąd gra wie, w jakim pliku jest skrypt definiujący dany infoportion? Wiem, że pokazałeś na przykładzie, że jest ścieżka do tego pliku podana, ale np. w Zewie Monolitu sprawdzałem przy zadaniach i są tylko nazwy infoportionu bez podanej przed nią nazwy pliku, gdzie jest skrypt odnoszący się do tegoż infoportionu. A skryptów jest tyle, że nie wiem gdzie szukać. Jest jakiś sposób żeby to znaleźć?

Pytanie nr 2
Czy mogę sobie np. stworzyć nowy plik script, nazwać go jak chcę i w nim napisać jakie chcę skrypty i później tworzyć zadania wykorzystujące te skrypty? I czy gra automatycznie będzie wiedziała, że skrypt odnoszący się do danego infoportionu jest w moim pliku, czy trzeba podać ścieżkę czy cuś (znowu powraca pytanie 1)?
ModderModder
Posty: 2550
Rejestracja: 22 sty 2010, 19:01
Ostatnio: 29 maja 2026, 00:49
Lokalizacja: Londyn / Bielsko-Biała
Kozaki:
1080
Na górę
Post autor: Cromm Cruac 
1. Przeszukaj katalog pod względem szukanego tekstu (nazwy infoportiona). N++ ma taką funkcję.

2. Możesz tworzyć własne skrypty. Odwołujesz się do nich przez podanie jego nazwy przed funkcją lub zmienną. Np. moj_skrypt.moja_zmienna
Obrazek

"Twoja opowieść mnie znudziła albowiem nie była o mnie" - Król Julian
Postawili kozaka za ten post (1):
Gość
Odpowiedz

Podobne tematy