Skocz do zawartości

[Tutorial] Tworzenie przejść (level changer'ów) pomiędzy poziomami gry z wykorzystaniem ACDC oraz skryptu.


Rekomendowane odpowiedzi

I. Dodawanie przejść (level_changer'ów) między poziomami za pomocą ACDC.

 

Tutorial Shoc.

Wprowadzenie.
Tworzenie przejść na inny poziom gry nie jest sprawą skomplikowaną w przypadku spawnowania z wykorzystaniem kompilatora/dekompilatora ACDC. Wystarczy skopiować właściwą sekcję do pliku alife_*ltx (* - nazwa mapy na której spawnujemy przejście) - który powstaje po rozpakowaniu all.spawn'a. Wadą tej metody jest konieczność ingerencji w plik all.spawn, co wymusza na nas obowiązek rozpoczynania nowej gry. Metoda polecana modderom, którzy mają zamiar od podstaw tworzyć moda, gdzie rozpoczynanie nowej gry to zamierzony element rozwoju fabuły. Dodawanie przejść jako elementu fabuły, której postęp umożliwia pojawienie się przejścia - jest realizowane przez skryptowe spawnowanie level_changer'a - omówione w II części poradnika, jednakże zanim stworzono skrypt na spawn level_changer'ów - tworząc własne modyfikacje starałem się uniemożliwić przejście na dany level wykorzystując anomalię przestrzenną (teleport), która cofała nas kilka metrów wstecz - by nie przejść na dany level zanim nie wynikało to z rozwoju fabuły. Później ową anomalię - usuwał skrypt odblokowując drogę. Wracając do clou poradnika - dodawanie przejść pomiędzy poziomami przedstawia się następująco:
 

  • Dekompilujemy plik all.spawn (link do poradnika, część I.).
  • Zbieram współrzędne terenowe tj. koordynaty X,Y,Z oraz game_vertex_id, level_vertex_id : m-ca spawnu tworzonego przejścia, m-ca w które zostanę przeniesiony - w przykładzie Bagna oraz 2 dodatkowych punktów w odl. ok. 10 m od spawnowanego level_changer'a (będą odpowiedzialne za cofnięcie gracza). W tym celu korzystam z narzędzia omówionego w pierwszej części tego poradnika - link.
  • Po procesie dekompilacji - wybieramy plik alife_*ltx na którym będziemy tworzyli level_changer. Ja w przykładzie będę tworzył przejście z Kordonu na Bagna (poziomy dostępne dzięki modyfikacji Stalker Map Pack volume 1 "SMP1" + with Addons - by Kostya), zatem w pliku alife_l01_escape.ltx dodaję sekcję odpowiadającą za przejście (w przykładzie gotowy level_changer) :

    [2053]; cse_abstract propertiessection_name = level_changername = exit_to_marsh_from_escapeposition = -153.525741577148,8.82056427001953,233.211181640625direction = -0.485007017850876,0,0.874510228633881; cse_alife_object propertiesgame_vertex_id = 167distance = 0level_vertex_id = 96916object_flags = 0xffffff3ecustom_data = <<END[pt_move_if_reject]path = esc_to_marsh_way_if_rejectENDstory_id = 11534; cse_shape propertiesshapes = shape0shape0:type = boxshape0:axis_x = 3,0,0shape0:axis_y = 0,3,0shape0:axis_z = 0,0,3shape0:offset = 0,0,0; cse_alife_space_restrictor propertiesrestrictor_type = 3; cse_alife_level_changer propertiesdest_game_vertex_id = 3580dest_level_vertex_id = 528411dest_position = 652.859191894531,7.619056224823,427.879089355469dest_direction = 0,0,0dest_level_name = marsh


    Omówienie parametrów sekcji level_changer'a
    [2053] - kolejny numer dodawanego do pliku obiektu. Ten numer musi być unikalny - nie może się powtórzyć dla całego pliku all.spawn (wszystkie pod-pliki składowe alife_*.ltx). Dodając obiekt do świata gry - należy zadbać o ustalenie numeru ostatniego z obiektów, by nadać numerację wyższą. Ów numer zawsze jest kwestią indywidualną, więc przepisywanie go z przykładu nie jest wskazane! 
    wpis stały charakteryzujący obiekt przenoszący gracza na inny poziom:

    section_name = level_changer

    name - unikalna nazwa dodawanego obiektu, będzie ona wykorzystana w pliku game_story_ids.ltx [gamedataconfig]. 

    position - pozycja X,Y,Z spawnowanego przejścia. 

    direction - obrót obiektu po zespawnowaniu. 

    game_vertex_id, level_vertex_id - współrzędne wierzchołkowe uzyskane dzięki Smartterrain and Waypoint Tools by dez0wave (link). 

    kolejny wpis odpowiada za konfigurację punktu cofnięcia gracza po wybraniu opcji zaniechania przejścia na dany poziom. Gdy zbliżymy się w obszar działania level_changer'a otrzymujemy zapytanie: "Przejść na następny poziom?"

    post-3466-0-88479400-1379254709_thumb.pn

    Wybranie opcji: Nie - skutkuje cofnięciem gracza do punktu zdefiniowanego w pliku way_l01_escape.ltx. Wybór pliku jest zależny od miejsca dodawanego przejścia, ponieważ tworzę level_changer w alife_l01_escape.ltx  odpowiadający mu plik to way_l01_escape.ltx (plik zawierający trasy patrolowe, kierunki patrzenia NPC'ów  i punkty uzupełniające). Mamy zatem wpis

    [pt_move_if_reject]path = esc_to_marsh_way_if_reject

    musimy w pliku way_*.ltx zdefiniować punkty cofnięcia gracza poza obszar działania level_changer'a. Dodaję zebrane uprzednio koordynaty wraz z nadanym identyfikatorem - pokrywającym się z frazą: "esc_to_marsh_way_if_reject" do pliku way_l01_escape.ltx.

    [esc_to_marsh_way_if_reject]points = p0,p1p0:name = name00p0:position = -144.241821289063,5.96699380874634,232.452438354492p0:game_vertex_id = 167p0:level_vertex_id = 106520p0:links = p1(1)p1:name = name01p1:position = -138.745223999023,5.35821628570557,232.173400878906p1:game_vertex_id = 167p1:level_vertex_id = 112647

    Są to dwa punkty na Kordonie w niewielkiej odległości (ok. 1,5 m) od siebie. Po ich dodaniu - zapisujemy zmiany w pliku.

    story_id - jest to parametr zawierający unikalny numer obiektu, zawarty w pliku game_story_ids.ltx [gamedataconfig]. 

    shape0:type = box - definiuje kształt obiektu jako box (graniastosłup prawidłowy czworokątny). Kształt widać projektując level_changer w SDK. Wartości axis_x, axis_y, axis_z - nie zmieniamy

    kolejny parametr to typ ogranicznika: dla tego obiektu wartość zawsze równa 3.

    restrictor_type = 3

    Parametrydest_game_vertex_id, dest_level_vertex_id, dest_position (X,Y,Z) - to punkty na lokacji na którą przenosi nas level_changer. W moim przykładzie docelowa pozycja to Bagna. 

    dest_direction - parametr obrotu aktora po przeniesieniu na lokację. Możemy przyjąć wartości 0,0,0. 

    dest_level_name - poziom gry na który jesteśmy przenoszeni. Nazwy znajdziemy w pliku game_levels.ltx [gamedataconfig].

  • Uzupełniam plik game_story_ids.ltx [gamedataconfig] dodając wpis zgodny z poprzednio zdefiniowanymi parametrami ("name" oraz "story_id") sekcji level_changer'a: 

    11534	    = "exit_to_marsh_from_escape"
  • Kolejny krok to uzupełnienie pliku level_tasks.script [gamedatascripts] o wpis odpowiadający za opis znacznika przejścia na PDA.
    obj = sim:story_object(11534)        if obj then            level.map_add_object_spot(obj.id, "level_changer", "Na Bagna")        end

    wartość 11534 odpowiada wpisowi z pliku omówionego w pkt. 4 poradnika.

  • Kompilujemy zmodyfikowane pliki (link do poradnika) alife_*.ltx, way_*.ltx aby zmiany zostały wprowadzone do pliku all.spawn, który następnie umieszczamy w [gamedataspawns].
  • Rozpoczynamy nową grę by sprawdzić efekt naszej pracy.

 

 

 

II. Dodawanie przejść (level_changer'ów) między poziomami za pomocą skryptu.

 

Tutorial testowany pod Shoc, Solijankę/Dmx'a.

 

Kilka słów wprowadzenia...
Dodawanie przejść z wykorzystaniem ACDC bądź xrSpawner'a stwarza konieczność rozpoczynania nowej gry - by zmiany mogły zostać wprowadzone. Każda modyfikacja pliku all.spawn podlega tej zasadzie. Jeśli chcemy rozwijać daną modyfikację np. Solijankę/DMX'a czy inny mod - tworząc pakiet rozszerzeń w postaci nowych jednostek, obiektów czy przejść (level_changer'ów) jednocześnie nie chcąc ingerować w plik all.spawn - jesteśmy zobligowani do wykorzystania innych - mniej inwazyjnych metod umożliwiających spawn w/w komponentów modyfikacji, innymi słowy - pozostaje nam skorzystać ze spawnowania obiektów za pomocą skryptu, które bez konieczności modyfikowania pliku all.spawn - umożliwia dodawanie w elastyczny sposób tych samych elementów co za pomocą ACDC czy xrSpawnera.
Skryptowe dodawanie obiektów jest jednak w przypadku skomplikowanych elementów (jak np. level changer'y) - zależne od specjalnej konstrukcji skryptu - często dostosowanej do jednej tylko funkcji. Na szczęście powstaje wiele modów wprowadzających szereg innowacji skryptowych - takim modem jest Solijanka. Ów poradnik w części II skupi się na tworzeniu nowych przejść tzw. level_changer'ów, które wymagają zdefiniowania szeregu parametrów by przenoszenie na inny level odbyło się bez wylotu na pulpit oraz wszelkie dane o przejściu zostały zapisane w pliku .sav - jak również na mapie pojawił się znacznik przejścia zawierający opis. Na szczęście w Solijance - z której to plików korzystałem - znajduje się odpowiedni skrypt umożliwiający dodawanie level_changer'ów, - tym plikiem jest level_new.script. Każdemu polecam zapoznać się z jego zawartością - zwłaszcza przy tworzeniu dużej liczby level_changer'ów. Do celów poradnika, wyodrębniłem zawartość z której będziemy korzystać - dzięki temu, każdy będzie mógł wykorzystać pozbawiony Solijaknowych przejść - plik na własne potrzeby.
 

Etap przygotowawczy.
Zbieram współrzędne potrzebne do zespawnowania level_changer'ów oraz docelowej pozycji aktora. Do tego celu - mogę wykorzystać narzędzie opisane pod tym linkiem - w początkowej części poradnika. Ponieważ stworzę 2 przejścia tj. Kordon-Agroprom, Agroprom-Kordon - potrzebuję 4 punktów terenowych w których skład wchodzą: [koordynaty pozycji X,Y,Z, game_vertex_id, level_vertex_id]/pkt.:

a). miejsce spawnu level_changer'a (przejście na Kordonie)

b). miejsce w które zostaję przenoszony (na Agroprom)

c). miejsce spawnu powrotnego level_changer'a (z Agropromu)

d). miejsce w które przenosi mnie level_changer (punkt na Kordonie)

 

Być może powyższa uwaga jest oczywista, jednak mam obowiązek przedstawić wszelkie mogące się przydać informacje - tym bardziej, iż z poradnika może korzystać osoba zaczynająca przygodę z moddowaniem.
Zebrane współrzędne (2 na kordonie, 2 na Agropromie):

! Unknown command:  patrolName=przejscie_na_Agroprom|anim=p1|pos=-280.5696105957,-11.70304775238,-107.6070098877|game=10|level=214* Log file has been saved successfully!! Unknown command:  patrolName=pozycja_docelowa_kordon|pos=-269.89373779297,-14.946743011475,-110.01386260986|game=9|level=2931* Log file has been saved successfully!! Unknown command:  patrolName=przejscie_na_Kordon|pos=185.51370239258,0.013489663600922,-242.2205657959|game=692|level=400584* Log file has been saved successfully!! Unknown command:  patrolName=pozycja_docelowa_agroprom|pos=179.32797241211,0.44028130173683,-239.4962310791|game=692|level=397281

Etap wykonawczy - tworzenie oraz modyfikacje plików.

  • W katalogu [gamedatascripts] tworzę nowy plik skryptu (zmiana rozszerzenia .txt na .script) o dowolnej nazwie. W moim przypadku - będzie to nowy_lc.script. Nazwa jest istotna znacznie później, ponieważ funkcje zawarte w pliku, będą się do niej odwoływały poprzez wpisy

    nowy_lc.create_level_changer

    Aby nie wprowadzać zamieszania podzielę dodawanie sekcji na II części. Pierwsza zawiera bazową funkcję, której parametrów nie należy modyfikować! Druga zawiera funkcje odnoszące się do spawnu konkretnych przejść - dodawanych wg. uznania i te sekcje będziemy modyfikowali wykorzystując zebrane punkty terenowe. Plik jest odpowiednio opisany - zatem dodając w późniejszym etapie funkcje spawnu naszego level_changer'a, warto zapoznać się z treścią komentarzy, by dodać w odpowiednie miejsce tworzoną funkcję.

    Uwaga: Pomimo podziału opisu na części, wszystkie funkcje będą zawarte w jednym pliku! W pliku który utworzyłem - umieszczam funkcję: 

    -- Skrypt wycięty z Narodnaya Soljanka + Dopa 14.08 - zawarty w pliku level_new.script - nieznanego autorstwa.-- Poszczególne parametry zostały opisane za pomocą komentarzy, które nie wpływają na funkcjonowanie pliku (wpisy występujące po --)-- poniższe funkcje stanowią podstawę działania level_changera dodawanego za pomocą skryptu, co umożliwia dodawanie przejść bez konieczności rozpoczynania nowej gry.-- Część I - Funkcje Bazowe - pozostawiamy bez ingerencji w parametry/ początek sekcjifunction create_level_changer(    p_story_id,     -- STORY_ID parametr wykorzystywany później w pliku level_tasks.script    p_position,     -- parametr pozycji nowego level_changer'a po zespawnowaniu.    p_lvertex_id,   -- level_vertex_id  - współrzędne wierzchołkowe poziomu na którym spawnujemy level_changer    p_gvertex_id,   -- game_vertex_id   - współrzędne wierzchołkowe ogólne   	  p_dest_lv,      -- level_vertex_id   - docelowe współrzędne wierzchołkowe      p_dest_gv,      -- game_vertex_id    - docelowe współrzędne ogólne    p_dest_pos,     -- współrzedne na które przenoszona jest postać - pozycja docelowa.    p_dest_dir,     -- obrót po zespawnowaniu w m-cu docelowym    p_dest_level,   -- nazwa poziomu na który będzie przenosił nas nowo utworzony level_changer    p_silent   	 -- jest to tzw. cichy tryb przenoszenia, który nie pokazuje komunikatu "czy chcesz przejść na następny poziom?")    local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)     level.map_add_object_spot(obj.id, "level_changer", "")     local packet = net_packet()    obj:STATE_Write(packet)     -- Cechy obiektu cse_alife_object    local game_vertex_id         = packet:r_u16()    local cse_alife_object__unk1_f32     = packet:r_float()    local cse_alife_object__unk2_u32     = packet:r_u32()    local level_vertex_id         = packet:r_u32()    local object_flags             = packet:r_u32()    local custom_data             = packet:r_stringZ()    local story_id                 = packet:r_u32()    local spawn_story_id        = packet:r_u32()     -- Cechy obiektu cse_shape    local shape_count             = packet:r_u8()    for i=1,shape_count do        local shape_type         = packet:r_u8()        if shape_type == 0 then            -- sphere            local center         = packet:r_vec3()            local radius         = packet:r_float()        else            -- box            local axis_x_x = packet:r_float()            local axis_x_y = packet:r_float()            local axis_x_z = packet:r_float()            local axis_y_x = packet:r_float()            local axis_y_y = packet:r_float()            local axis_y_z = packet:r_float()            local axis_z_x = packet:r_float()            local axis_z_y = packet:r_float()            local axis_z_z = packet:r_float()            local offset_x = packet:r_float()            local offset_y = packet:r_float()            local offset_z = packet:r_float()        end    end     -- Cechy obiektu cse_alife_space_restrictor    local restrictor_type            = packet:r_u8()     -- Cechy obiektu cse_level_changer    local dest_game_vertex_id        = packet:r_u16()      local dest_level_vertex_id       = packet:r_u32()      local dest_position              = packet:r_vec3()    local dest_direction             = packet:r_vec3()    local dest_level_name            = packet:r_stringZ()    local dest_graph_point           = packet:r_stringZ()    local silent_mode                = packet:r_u8()	  packet:w_begin(game_vertex_id)          -- game_vertex_id    packet:w_float(cse_alife_object__unk1_f32)    packet:w_u32(cse_alife_object__unk2_u32)    packet:w_u32(level_vertex_id)           -- level_vertex_id    packet:w_u32( bit_not(193) )            -- object_flags = -193 = 0xFFFFFF3E    packet:w_stringZ(custom_data)    packet:w_u32(p_story_id)           	 -- story_id    packet:w_u32(spawn_story_id)     packet:w_u8(1)           -- parametry określają właściwy kształt obiektu jakim jest level_changer--        packet:w_u8(0)     -- kształt obiektu - sfera--        packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center--        packet:w_float(3.0)    packet:w_u8(1)           -- kształt obiektu - graniastosłup prawidłowy czworokątny.    packet:w_float(2)   	 -- axis_x_x    packet:w_float(0)   	 -- axis_x_y    packet:w_float(0)   	 -- axis_x_z    packet:w_float(0)   	 -- axis_y_x    packet:w_float(4)   	 -- axis_y_y    packet:w_float(0)   	 -- axis_y_z    packet:w_float(0)   	 -- axis_z_x    packet:w_float(0)   	 -- axis_z_y    packet:w_float(4)   	 -- axis_z_z    packet:w_float(0)   	 -- offset_x    packet:w_float(0)   	 -- offset_y    packet:w_float(0)	    -- offset_z     packet:w_u8(3)           -- restrictor_type, taki sam jak przy spawnowaniu z wykorzystaniem ACDC - wartość równa 3.     packet:w_u16(p_dest_gv)              -- docelowy game_vertex_id    packet:w_u32(p_dest_lv)              -- docelowy level_vertex_id    packet:w_vec3(p_dest_pos)       	 -- docelowa pozycja    packet:w_vec3(p_dest_dir)       	 -- kierunek obrotu aktora       packet:w_stringZ(p_dest_level)       -- docelowy poziom gry    packet:w_stringZ("start_actor_02")   -- wartość stała.    packet:w_u8(p_silent)           	 -- tryb cichy tzn. brak komunikatu o zmianie poziomu gry, wartość równa 1. Dla wartości 0 pojawia się zapytanie "czy chcesz przejść na następny poziom?".     packet:r_seek(0)    obj:STATE_Read(packet, packet:w_tell())--  poniższy wpis jest dostępny (odkomentowany) tylko wtedy, jeśli skonfigurujemy skrypty (plik news_manager.script) do otrzymywania wiadomości sms - tak jak zostało to wykonane w Solijance. Informacja o aktywnym przejściu.--    news_manager.send_tip(db.actor, "Nowa droga", nil, nil, 30000)end-- / koniec sekcji bazowej

     

    Powyższa część stanowi podstawę działania level_changer'a. Warto przyjrzeć się całości, ponieważ opisy parametrów funkcji zostały dodane poprzez za-komentowanie wiersza lub jego części. Jeśli ktoś wcześniej nie modyfikował skryptu przypomnę, iż podwójne poziome kreski -- w skrypcie służą wstawianiu komentarzy do opisu funkcji. Oznacza to, iż tekst znajdujący się poza wstawionymi znakami nie jest przez skrypt wykorzystywany (dotyczy plików .script. Komentowanie .xml czy .ltx zawiera inny zestaw znaków).

  • W tym samym pliku skryptu tj. nowy_lc.script dodaję funkcję odpowiadającą za spawn określonych przejść. Modyfikacja tej części jest uzależniona od naszego zapotrzebowania na level_changer. Jak wspominałem powyżej - tworzę 2 przejścia, dlatego funkcja tutaj zawarta przyjmuje postać następującą:
    -- Część II - Funkcje dodatkowe, zawierające konkretny (unikalny) Level_Changer (LC) stworzony na potrzeby własnej modyfikacji.function spawn_lc_agro()	 -- funkcja tworzy przejście z Kordonu na Agroprom    if (not has_alife_info(    "level_esc_agro" )) thennowy_lc.create_level_changer(6000, vector():set(-280.5696105957,-11.70304775238,-107.6070098877),214, 10,397281, 692,	    vector():set(179.32797241211,0.44028130173683,-239.4962310791 ),	    vector():set(0,0,0),"l03_agroprom",0)	    db.actor:give_info_portion("level_esc_agro")    end    -- funkcja tworzy przejście z Agropromu na Kordon    if (not has_alife_info(    "level_agro_esc" )) thennowy_lc.create_level_changer(6001, vector():set(185.51370239258,0.013489663600922,-242.2205657959),400584, 692,2931, 9,	    vector():set(-269.89373779297,-14.946743011475,-110.01386260986),	    vector():set(0,0,0),"l01_escape",0)	    db.actor:give_info_portion("level_agro_esc")    endend
    Opis funkcji i jej parametrów:
    level_esc_agro, level_agro_esc - odnosi się do infoportion, czyli wpisu warunkującego dodanie przejścia po uzyskaniu konkretnej informacji, dostosowanej do właściwego momentu fabuły lub realizacji całości kryteriów danego zadania. Wpisy te zostały opisane w pkt. 4, części II poradnika (znajdują się w pliku info_l01escape.xml określającym zbiór infoportion z Kordonu - w przykładzie) Ów wpis został tak dobrany, aby informacja została dodana tylko raz, tzn. poprzez warunek

    not has_alife_info

    czyli poprzez brak informacji o przejściu mamy możliwość spawnu tegoż przejścia, ale funkcja podczas procesu dodawania level_changer'a poprzez wpis

    db.actor:give_info_portion

    jednocześnie dodaje informację, zatem jej zaistnienie stoi w sprzeczności z pierwszym warunkiem tj. not has_alife_info, dlatego level_changer nie może zostać dodany drugi raz (opcja zostaje zablokowana). Infoportion musi być jednorazowe by wykluczyć możliwość ciągłego spawnowania tego samego level_changer'a, która skutkowałoby wylotem na pulpit. 

    poprzez wpis:

    nowy_lc.create_level_changer

    funkcja create_level_changer zawarta w nowy_lc.script (rozszerzenia pliku nie wpisuje się w skrypcie) spawnuje przejście na inną lokację. 

    wartość 6000 odnosi się do pliku level_tasks.script, w którym zawarty jest opis przejścia - omówione w pkt. 5, części II poradnika. (wartość uzależniona jest od znajdujących się tam numeracji, tzn. nie dublujemy numeru tylko nadajemy unikalny).

    kolejne współrzędne to koordynaty miejsca w którym tworzymy przejście (kolejność jest istotna, została omówiona zgodnie zapisanymi parametrami):

    X: -280.5696105957Y: -11.70304775238Z: -107.6070098877level_vertex_id: 214game_vertex_id : 10

    poniższe współrzędne odpowiadają za punkty terenowe - w miejscu na które jesteśmy przenoszeni - pozycja docelowa (w przykładzie Agroprom).

    level_vertex_id: 397281game_vertex_id : 692X: 179.32797241211Y: 0.44028130173683Z: -239.4962310791

    współrzędne:

    (0,0,0)

    odpowiadają za obrót po przejściu - direction (tych wartości nie trzeba modyfikować).

    l03_agroprom - poziom na który jesteśmy przenoszeni. Spis poziomów - plik game_levels.ltx [gamedataconfig] Ustalając współrzędne zawarte w drugiej funkcji - kierujemy się analogią j/w. Kolejność jest tutaj bardzo istotna (taka sama dla wszystkich tworzonych funkcji). Analizując funkcję pod kątem występujących parametrów w pierwszej kolejności występują: identyfikator (wykorzystywany również w pliku level_tasks.script - pkt.5 cz. II poradnika), następnie koordynaty poziomu na którym umieszczamy level_changer - kolejno [X,Y,Z, level_vertext_id, game_vertext_id] po nich wpisujemy level_vertext_id, game_vertext_id poziomu na który zmierzamy docelowo - dalej występują koordynaty [X,Y,Z] pozycji na którą zostaniemy przenoszeni - na końcu zaś - obrót po przejściu (0,0,0) oraz poziom gry na który zmierzamy. 

     

    W/w plik uzupełniony o omówione wpisy jest kluczowy dla działania nowego przejścia - jednak nie wystarczy by nowy level_changer został zespawnowany. Musimy wywołać funkcję:

    spawn_lc_agro()

    najlepiej tworząc dialog. Ponieważ tworzenie dialogów oraz infoportions to temat innego poradnika, toteż do niego odsyłam - Link. Jest to pozycja obowiązkowa dla osób, które tworzą questa po raz pierwszy co ma znaczenie z uwagi na infoportion.  
     

  • Funkcję aktywujemy wprowadzając do drzewa dialogowego wpis następujący:

    <action>nowy_lc.spawn_lc_agro</action>
    W/w wpis oznacza, iż dialog aktywuje poprzez <action> </action> w pliku o nazwie nowy_lc.script funkcję: spawn_lc_agro, która odpowiada za pojawienie się naszych przejść (opis w pkt.2, cz.II poradnika). Ja umieściłem wpis w pliku dialogs_escape.xml [gamedataconfiggameplay] - ponieważ informacja o nowym przejściu będzie nagrodą za wykonanie zadania dla Wilka ("dostarczenie kanistra do agregatu"). Ponieważ wcześniej opisywałem jak stworzyć zadanie z wykorzystaniem skryptu - [link], skorzystam z wprowadzonych tam dialogów oraz dodam nową funkcję. Oczywiście - to w jakim momencie fabuły i przez jaką postać otrzymamy informację o przejściu - zależy od naszej wyobraźni, od fabuły którą jako modder kreujemy. Uzupełniająco radzę przeczytać poradnik nt. tworzenia zadań lub konstrukcji dialogów wraz z infoportion i powtarzam to nie bez kozery.
     
  • Następny krok to dodanie infoportions zgodnego z wpisami umieszczonymi w pliku nowy_lc.script (część II). - patrz pkt. 2 frazy: level_esc_agro oraz level_agro_esc. Wpisy dodaję do [gamedataconfiggameplay] pliku info_l01escape.xml  
    <!-- Tutorial level_changer -->    <info_portion id="level_esc_agro"></info_portion>    <info_portion id="level_agro_esc"></info_portion>    <!-- Tutorial level_changer -->

    <!-- ów zestaw znaków służy komentowaniu plików .xml - dzięki niemu możemy dodawać dowolną informację i oznaczać ważne sekcje. Tekst wpisany jako komentarz nie jest wykorzystywany.

  • Aby znacznik na mapie został odpowiednio opisany - uzupełniam plik level_tasks.script [gamedatascripts], dodając wpisy: 
       	 -- nowy Level_changer        obj = sim:story_object(6000)        if obj then            level.map_add_object_spot(obj.id, "level_changer", "Na Agroprom")        end        obj = sim:story_object(6001)        if obj then            level.map_add_object_spot(obj.id, "level_changer", "Na Kordon")        end

    Gdy przejście zostanie zespawnowane po raz pierwszy - marker reprezentujący przejście będzie opisany jako no hint, jednakże po zmianie lokacji nastąpi korekta nazwy na zadaną w skrypcie np. "Na Agroprom", "Na Kordon"

  • Zapisujemy zmiany w plikach - sprawdzając rezultat.

 

Efekt finalny prezentuje się następująco:

 

http://www.youtube.com/watch?v=fNpdMGoVRhA

 

Jeśli znajdą się osoby chcące zapoznać się z konstrukcją niniejszej modyfikacji - w załączeniu przesyłam folder gamedata. Jest to zmodyfikowana postać zadania stanowiącego przedmiot tego poradnika (link), dzięki jego realizacji - otrzymujemy informację o nowym przejściu. Testowano na Shoc 1.0004. Polecam w celu wyodrębnienia różnic - użyć programu WinMerge, zestawiając pliki z ich niemodyfikowaną wersją. Prócz plików których modyfikacje opisywałem w niniejszym poradniku - znajdziemy tam również pliki dialogów, infoportion i configi jako istotne uzupełnienie w kontekście aktywacji wykorzystywanego skryptu.

nowy level_changer.7z

 

Prawa autorskie na podstawie regulaminu, pkt.1.6. - The Emperor, wyłączność: StalkerTeam.

 

_________________________

Autor: The Emperor dla StalkerTeam

  • Dodatnia 6
Odnośnik do komentarza
Udostępnij na innych stronach

  • Meta zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z tej strony, zgadzasz się na nasze Warunki użytkowania.