Skocz do zawartości

Diegtiariow

Zasłużony
  • Postów

    4879
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    381

Odpowiedzi opublikowane przez Diegtiariow

  1. @LisKot Na AMK w "Справочник вылетов" taki znalazłem opis wylotu:

    Cytat
    Expression    : no_assert
    Function    : CXML_IdToIndex<class CCharacterInfo>::GetById
    File        : e:\stalker\patch_1_0004\xr_3da\xrgame\xml_str_id_loader.h
    Line        : 112
    Description    : item not found, id
    Arguments    : amk_artem_kulinar

    Przyczyna: Gra nie znajduje id jakiegoś profilu... lub dialogu... lub zadania. Wskazany id jest w pliku .xml.

    LeczenieSprawdźcie czy nazwa identyfikatora jest prawidłowa lub dodajcie ją jeśli jej nie ma.

     

    Podobny problem też był tutaj: https://otvet.mail.ru/question/211854026

    I problemem jest przedmiot - albo nieprawidłowo ukazany, albo infoportion w skrypcie jest zepsuty. I jako leczenie wylotu trzeba sprawdzić, czy id nie ma spacji/został nie prawidłowo napisany.

    • Dodatnia 1
  2. 11 godzin temu, LisKot napisał(a):

    W jaki sposób odebrać zamówienie?

    Jeśli się nie mylę, to w asortymencie podczas handlowania będzie ten przedmiot. A gdy wybierzemy ponownie pierwszą opcję dialogową, to będzie można zmienić zamówiony towar (oczywiście uiszczając drobną opłatę za zmianę towaru).

    • Dzięki! 1
  3. NAZWA: Lekcje i przydatne funkcje od Panzyuza
    AUTOR: Panzyuza

     

    Istnieją proste funkcje, które pomogą w moddingu. Coś na początek.

     

    OPIS:

    Spoiler

    Wielu napotkało potrzebę zdobycia portion podczas przeszukiwania zwłok NPC lub mutanta o unikalnej nazwie. Ci, którzy coś robią z all.spawn, po prostu korzystają ze standardu gry, dodając do logicznego schematu w spawnie:

    [know_info]
    infoportion

    Ale dlaczego tylko infoportion? Po co pisać jeszcze kody dla wyłowienia infoportions podczas przeszukiwania? Jest na to prosty i niezawodny sposób.

    Musisz otworzyć skrypt xr_motivator.script za pomocą notatnika i znaleźć tam następujący kod:

    function motivator_binder:use_callback(obj, who)
         if self.object:alive() then
          xr_use.notify_on_use(obj, who)
          if self.st.active_section then
           xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
          end
         else
          --//выдача дефолтных тайников
                        treasure_manager.get_treasure_manager():use(self.object)
         end
    end

    Po linii treasure_manager.get_treasure_manager():use(self.object) wstawiamy nazwa_skryptu.dead_use(victim, who).

    Powinno to wyglądać mniej więcej tak:

    function motivator_binder:use_callback(obj, who)
         if self.object:alive() then
          xr_use.notify_on_use(obj, who)
          if self.st.active_section then
           xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
          end
         else
          --//выдача дефолтных тайников
                        treasure_manager.get_treasure_manager():use(self.object)
                        mod.dead_use(victim, who)
         end
    end

    Tak więc, jeśli gracz po śmierci NPC go przeszuka, to oprócz wydania schowka, zostanie wywołany jego własny skrypt.

    Tworzymy skrypt i wklejamy następujący kod:

    ----------------------------------------------------------------------------------------------------
    -- Funkcja przeszukiwania trupów NPC
    -- W motivatorze, use callback wstawić nazwa_skryptu.dead_use(obj, who)
    ----------------------------------------------------------------------------------------------------
    function dead_use(victim, who)
    if not (victim and who) then return end --/>fix
    local name = victim:name()
    if victim and who and who:id() == db.actor:id() then
    if string.find(name, "bandit_resp_veteran_dead_bor") then --nazwa NPC
    db.actor:give_info_portion("PORTION") --lub wywołanie skryptowych funkcji
    elseif string.find(name, "esc_lager_volk") then --przeszukanie
    db.actor:give_info_portion("PORTION")
    return false --powtórnego wydania nie będzie
    else
    return true
    end
    end
    end

    Musisz jedynie znać nazwę NPC, która jest mu nadawana podczas spawnowania. Przykład. Jeśli stworzyłeś NPC i przypisałeś mu sekcję w spawn_sections, to jego nazwa będzie nazwą sekcji, którą ustawiłeś podczas spawnowania.

    To samo możesz zrobić z mutantami. Ale jest trudniej. Musisz w binderze mutantów dodać use_callback i podobnie z binderem NPC.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1184-uroki-i-poleznye-funkcii-ot-panzyuza/

  4. NAZWA: Ekwipunek i jego funkcje [SoC]
    AUTOR: ?

     

    ROZMIESZCZENIE PRZEDMIOTÓW W EKWIPUNKU, JEDEN PO DRUGIM, JAK W BUILDACH:

    Spoiler

    Otwórz za pomocą Notatnika lub innego edytora tekstu plik inventory_new.xml w gamedata\config\ui.

    Znajdziemy w tym pliku taką strukturę:

    <dragdrop_bag x="22" y="33" width="310" height="442"
    cell_width = "41" cell_height="41" rows_num="10" cols_num="7"
    unlimited="1" group_similar="1"/>

    Jest to ustawienie komórek głównego plecaka w ekwipunku bohatera. Oznacza to całkowitą przestrzeń ekwipunku (plecaka).

    Znajdźmy tę samą linię w tej konstrukcji:

    unlimited="1" group_similar="1"/>

    Teraz w linii group_similar="1" zmieniamy wartość "1" na "0".

    To samo robimy w podobnym pliku inventory_new_16.xml w gamedata\config\ui. Jest to plik odpowiedzialny za ustawienie interfejsów ekwipunku na prostokątnym ekranie (16:9).

    Teraz szukamy innego pliku, aby przypisać grupowanie przedmiotów jeden po drugim w oknach handlu (plecak GG, plecak handlarza\NPC oraz okna sprzedaży i zakupu.

    Szukamy pliku o nazwie trade.xml w tym samym katalogu.

    Tam znajdujemy następujące struktury:

    <dragdrop_list x="29" y="37" width="266" height="410"
    cell_width = "41" cell_height="41" rows_num="10" cols_num="6"
    group_similar="1" unlimited="1"/>
    <dragdrop_list x="18" y="35" width="262" height="410"
    cell_width = "41" cell_height="41" rows_num="10" cols_num="6"
    group_similar="1" unlimited="1"/>

    Pierwsze dwie konstrukcje odpowiadają za okno asortymentu gracza i okno asortymentu kupca\NPC.

    <dragdrop_list x="31" y="37" width="303" height="164"
    cell_width = "41" cell_height="41"
    rows_num="4" cols_num="7"
    group_similar="1" unlimited="1"/>
    <dragdrop_list x="31" y="37" width="303" height="164"
    cell_width = "41" cell_height="41"
    rows_num="4" cols_num="7"
    group_similar="1" unlimited="1"/>

    Dwie ostatnie struktury odpowiadają za ustawienie okien sprzedaży i kupna.

    Teraz we wszystkich tych konstrukcjach należy zmienić linię group_similar="1" na group_similar="0".

    To samo należy zrobić w pliku trade_16.xml dla szerokoformatowych monitorów. Wszystko jest tam takie samo.

    No cóż, żeby wszystko było jak w buildzie i przy przeszukiwaniu zwłok i schowków musimy ustawić 0 zamiast jedynki we wszystkich liniach group_similar="1" w pliku carbody_new.xml i jego kopii dla monitorów prostokątnych carbody_new_16.xml.

    Teraz elementy są grupowane jeden po drugim w całym graficznym inwentarzu.

    Jak to więc wyglądało na przykład w buildzie 1842?

    Spoiler

    y_4fc85c64.jpg

     

    Jak to wyglądało w handlu w buildzie 2205-2215?

    Spoiler

    y_fb4fc75d.jpg

    Jak to wyglądało w ekwipunku GG w buildach 2205-2232?

    Spoiler

    y_66813500.jpg

    Jak wyglądało przeszukiwanie zwłok w buildach 2232 i 2205?

    Spoiler

    y_46bd5897.jpg

    Tak to wygląda finalnie ze starym inwentarzem

    Spoiler

    z_8a6060a3.jpgz_da509c03.jpg

    *Stary ekwipunek można pobrać oddzielnie z forum AMK (temat Сброс Инвенторя). Jest także w Shadows Add-on, Phantoms Zone, Paradise lost, KV38 addon, Альфа Обливион мод 1.0 демо, Priboi story (opcjonalnie).

     

    OGÓLNA POPRAWKA EKWIPUNKU. PODSTAWY:

    Spoiler

    *Artykuł został zaczerpnięty ze strony Stalker-Inside.

    Do pracy nad interfejsem ekwipunku potrzebne są następujące pliki:

    • ui_inventory.dds i ui_inventory2.dds (folder textures\ui\)
    • inventory_new.xml dla normalnych ekranów lub inventory_new_16.xml dla ekranów 16:9 (znajduje się w gamedata\config\ui\).

    Uwaga: <!--text--> - to są komentarze w plikach xml.

     

    Dowolny plik opisujący interfejs gry (nie licząc plików skryptowych) zaczyna się od następujących linii:

    <?xml version='1.0' encoding="UTF-8"?>
    <w>

    i kończy się:

    </w>

     

    Tekstura slotów inwentarza:

    <properties_box>
    <texture>ui_cb_listbox</texture> <!--tekstura inwentarza--></properties_box>

     

    Tekstura pasu:

    <belt_slots x="0" y="80" width="1024" height="172"> <!--х, у – współrzędne tekstury na ekranie, width – szerokość, height - wysokość-->
    <texture>ui_slots_belt</texture> <!--tekstura-->
    </belt_slots>

    <main x=0 y=0 width=1024 height=768> <!--punkt odniesienia tekstury, jej rozmiar (rozdzielczość ekranu)-->

     

    Tekstura plecaka, ikonki aktorów, opisy przedmiotów:

    <back x="10" y="243" width="1005" height="483"> <!--punkt odniesienia tekstury, rozmiar, х, у – współrzędne tekstury na ekranie, width – szerokość, height - wysokość-->
    <texture>ui_inventory_main</texture> <!--tekstura-->
    </back>
    Dalej podobnie, zmieniają się nazwy tekstur i współrzędne.

     

    Parametry slotów:

    - Plecak

    <dragdrop_bag x="22" y="33" width="310" height="442" <!--punkt początkowy, rozmiar, x, y - współrzędne na ekranie, width - szerokość, height - wysokość w plecaku-->
    cell_width = "41" cell_height="41" rows_num="10" cols_num="7" <!--szerokość i wysokość komórki, rows_num - liczba wierszy, cols - liczba kolumn-->
    unlimited="1" group_similar="1"/> <!--nie analizowane-->
    Uwaga: jeśli trzeba zwiększyć lub zmniejszyć ilość wierszy i kolumn, 
    to zmieniamy parametr cell_width = "41" cell_height="41" rows_num="10" cols_num="7" na potrzebne,
     dalej potrzebna jest liczba cell_width * cols_num = width - zapisujemy otrzymaną wartość, najlepiej,
     aby wlazło w tekstury slotu plecaka. Do wylotu nie prowadzi, ale jeśli jest więcej lub mniej wygląda niezbyt ładnie.
     Wartości autora: <dragdrop_bag x="22" y="33" width="290" height="420"cell_width = "35" cell_height="35" rows_num="12"
     cols_num="8" unlimited="1" group_similar="1"/>

     

    - Pas

    <dragdrop_belt x="645" y="136" width="410" height="60"
    cell_width = "60" cell_height="60" rows_num="1" cols_num="5" />

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1316-soc-inventar-i-ego-osobennosti/

  5. NAZWA: Lekcja odnośnie tworzenia punktu respawn dla mutantów [SoC]
    AUTOR: ins33

     

    Od twórcy: "Prędzej czy później każdy modder zastanawia się nad respawnem. Pierwsze próby stworzenia respawnera zakończyły się częściowym sukcesem. O pechu przeczytasz na końcu. Męcząc respawnera przez kilka dni, odłożyłem tę lekcję na najdalszą półkę. I nadszedł czas, ale tym razem musiałem zespawnować mutanty. I okazało się to dużo łatwiejsze!"

     

    NIEZBĘDNE OPERACJE:

    Spoiler

    Najpierw stwórzmy smarta, z jedną pracą:

    Tworzymy pliki alife_l01_escape_test.ltx i way_l01_escape_test.ltx w folderze ACDC\all. Zrobimy to dla wygody, przy pakowaniu wszystko dodane będzie w plikach lokacji.

    W acdc\all\all.ltx dodajemy pliki alife_l01_escape_test.ltx i way_l01_escape_test.ltx.

    Dodajemy smarta do alife_l01_escape_test.ltx:

    [number]
    ; cse_abstract properties
    section_name = smart_terrain
    name = esc_boar_weak_smart ; nazwa smartu
    position = -132.06704711914,-3.5775165557861,-79.952697753906 ; X,Y,Z
    direction = 0,0,0
    version = 118
    script_version = 6
    
    ; cse_alife_object properties
    game_vertex_id = 72 ; GV
    distance = 3
    level_vertex_id = 119229 ; LV
    object_flags = 0xffffff3e
    custom_data = <<END
    [smart_terrain]
    type = esc_boar_weak_smart ; nazwa smartu
    cond = 100 ; warunki istnienia smartu. {+info –info ! function =function}
    capacity = 3 ; pojemność smartu
    END
    
    ; cse_shape properties
    shapes = shape0
    shape0:type = sphere
    shape0:offset = 0,0,0
    shape0:radius = 1
    
    ; cse_alife_space_restrictor properties
    restrictor_type = 0
    
    ; se_smart_terrain properties

    Stworzyliśmy smart terrain, dodajmy moba dla tego smarta:

    [number]
    ; cse_abstract properties
    section_name = boar_weak
    name = esc_boar_weak_test_0000
    position = -126.9560546875,-4.6784887313843,-95.063812255859
    direction = 0,0,0
    version = 118
    script_version = 6
    
    ; cse_alife_object properties
    game_vertex_id = 72
    distance = 3
    level_vertex_id = 125542
    object_flags = 0xffffffbf
    custom_data = <<END
    [smart_terrains]
    esc_boar_weak_smart = true ; wskazujemy do jakiego smartu należy to zwierzę.
    END
    
    ; cse_visual properties
    visual_name = monsters\mutant_boar\mutant_boar
    
    ; cse_alife_creature_abstract properties
    g_team = 0
    g_squad = 0
    g_group = 0
    health = 2
    dynamic_out_restrictions =
    dynamic_in_restrictions =
    
    ; cse_alife_monster_abstract properties
    
    ; cse_ph_skeleton properties
    
    ; cse_alife_monster_base properties
    
    ; se_monster properties
    upd:health = 2
    upd:timestamp = 0
    upd:creature_flags = 0
    upd:position = -126.9560546875,-4.6784887313843,-95.063812255859
    upd:o_torso = 0,0,0

    Zwierze dodane, dodajmy ścieżki.

    Otwieramy way_l01_escape_test.ltx:

    [esc_boar_weak_smart_home]
    points = p0
    p0:name = wp00
    p0:position = -123.97886657715,-4.0969734191895,-92.151412963867
    p0:game_vertex_id = 72
    p0:level_vertex_id = 128790

    Uwaga! Nazwa punktu ścieżki zaczyna się od nazwy smarta!

    Teraz musimy stworzyć logikę i warunki pracy. Dlatego tworzymy gamedata\config\misc\gulag_escape_test.ltx.

    W gulag_task.ltx rejestrujemy nowy gułag #include "gulag_escape_test.ltx" i piszemy prostą logikę w gulag_escape_test.ltx:

    [logic@esc_boar_weak_smart_0000]
    active = mob_home@esc_boar_weak_smart_0000
    
    [mob_home@esc_boar_weak_smart_0000]
    path_home = home ; WSKAZUJEMY NAZWĘ ŚCIEŻKI, BEZ NAZWY SMARTA!!! esc_boar_weak_smart_home
    home_min_radius = 20
    home_max_radius = 30

    Napisaliśmy logikę, teraz dodamy warunek.

    Tworzymy skrypt gulag_escape_test.script, rejestrujemy go w xr_gulag.script dodając do level_gulags = {*, gulag_escape_test}.

    W gulag_escape_test.script zapisujemy:

    local t = {}
    
    function load_job(sj, gname, type, squad, groups)
    --'--------------------------------------------------------------------------
    --' ESCAPE
    --'--------------------------------------------------------------------------
    --' Кабаны не далеко от вагончика
    
    if type == "esc_boar_weak_smart" then
    t = { section = "logic@esc_boar_weak_smart_0000",
    idle = 0,
    prior = 5, state = {0},
    in_rest = "", out_rest = ""
    }
    table.insert(sj, t)
    end
    end
    
    function load_states(gname, type)
    
    if type == "esc_boar_weak_smart" then
    return function(gulag)
    return 0
    end
    end
    end
    
    function load_ltx(gname, type)
    return nil
    end
    
    function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
    end
    
    function checkMonster(npc_community, gulag_type)
    
    if gulag_type == "esc_boar_weak_smart" then
    return npc_community == "boar"
    end
    
    return false
    end

    Zrobione. Teraz mamy smarta z jednym zwierzątkiem. Sprawdźmy, czy nasz smart działa. Uruchamiamy grę i przejchodzimy do wagonika znajdującego się obok rannego. Spotkaliśmy dzika, dodamy teraz respawner.

    W alife_l01_escape_test.ltx dodajemy:

    [number]
    
    ; cse_abstract properties
    section_name = respawn
    name = esc_boar_weak_respawner ; nazwa respawnera
    position = -146.0726776123,-3.4645113945007,-73.943954467773
    direction = 0,0,0
    
    version = 118
    script_version = 6
    
    ; cse_alife_object properties
    game_vertex_id = 70
    level_vertex_id = 104106
    object_flags = 0xffffff3e
    custom_data = <<END
    [respawn]
    respawn_section = boar_weak ; sekcje respawnu
    max_spawn = 1 ; Maks ilość mobów w przeciągu jednego respawnu.
    idle_spawn = often ; rodzaj respawnera, odnosi się do prędkości zadziałania.
    END
    
    ; cse_shape properties
    shapes = shape0
    shape0:type = sphere
    shape0:offset = 0,0,0
    shape0:radius = 3.35619974136353
    
    ; cse_alife_space_restrictor properties
    restrictor_type = 0
    
    ; se_respawn properties

    Respawner zrobiony. Byłoby wspaniale nie czekać, aż samo zadziała, ale sprawić, by zadziałało, kiedy tego potrzebujemy. Dlatego zrobimy spacerestryktor.

    W pobliżu wejścia do bunkra Sidorowicza, który wywoła respawner:

    [number]
    
    ; cse_abstract properties
    section_name = space_restrictor
    name = esc_boar_weak_restrictor
    position = -250.60289001465,-19.588600158691,-127.29279327393
    direction = 0,0,0
    version = 118
    script_version = 6
    
    ; cse_alife_object properties
    game_vertex_id = 8
    level_vertex_id = 9843
    object_flags = 0xffffff3e
    custom_data = <<END
    [logic]
    active = sr_idle@esc_boar_weak_restrictor_start
    
    [sr_idle@esc_boar_weak_restrictor_start]
    on_actor_inside = {=gulag_empty(esc_boar_weak_smart)} sr_idle@esc_boar_weak_restrictor_out %=respawner_spawn(esc_boar_weak_respawner)%
    ; ф-ия =gulag_empty(name_smart) sprawdza czy to smart.
    ; ф-ия =respawner_spawn(name_smart) wywołuje wymuszony respawn
    [sr_idle@esc_boar_weak_restrictor_out]
    on_actor_outside = sr_idle@esc_boar_weak_restrictor_start
    END
    
    ; cse_shape properties
    shapes = shape0
    shape0:type = sphere
    shape0:offset = 0,0,0
    shape0:radius = 3.35619974136353
    
    ; cse_alife_space_restrictor properties
    restrictor_type = 3

    Zbieramy all.spawn, uruchamiamy nową grę, zabijamy dzika, wracamy do wejścia do bunkra, schodzimy po schodach i wracamy do smartu dzika.

    Gratulacje, udało się zrobić respawner!

     

    PRACA DOMOWA:

    Spoiler

    Zrobić smarta dla 3 dzików i respawner dla tego smarta. Zespawnować 3 NPC-ów pod mostem, obok wagonu.

    Współrzędne:

    character_profile = sim_stalker_master
    position = -35.753692626953,-10.425220489502,-72.881172180176
    direction = 0,0,0
    game_vertex_id = 111
    distance = 3
    level_vertex_id = 242232
    character_profile = sim_stalker_veteran
    position = -41.189788818359,-10.432260513306,-77.327095031738
    direction = 0,0,0
    game_vertex_id = 77
    distance = 3
    level_vertex_id = 237361
    character_profile = sim_stalker_master
    position = -41.189788818359,-10.432260513306,-77.327095031738
    direction = 0,0,0
    game_vertex_id = 77
    distance = 3
    level_vertex_id = 237361

    Stworzyć dla tych NPC trzy logiki walker. Nazwy ścieżek, biorąc pod uwagę fakt, że później te NPC będą pod smartem.

    Powtarzam: N.B.! Nazwa punktu ścieżki musi zaczynać się od nazwy smarta!!!

    Współrzędne:

    way_1

    position = -48.911376953125,-10.037826538086,-66.358123779297
    game_vertex_id = 77
    level_vertex_id = 230506

    look_1

    position = -47.987903594971,-10.038272857666,-63.149391174316
    game_vertex_id = 77
    level_vertex_id = 231168

     

    way_2

    position = -47.224723815918,-10.038061141968,-65.55248260498
    game_vertex_id = 77
    level_vertex_id = 232424

    look_2

    position = -47.987903594971,-10.038272857666,-63.149391174316
    game_vertex_id = 77
    level_vertex_id = 231168

     

    way_3

    position = -47.224723815918,-10.038061141968,-65.55248260498
    game_vertex_id = 77
    level_vertex_id = 232424

    look_3

    position = -50.319923400879,-10.042634963989,-63.688987731934
    game_vertex_id = 77
    level_vertex_id = 229168

     

    I trzy kmap współrzędne:

    way_1_task

    position = -48.911376953125,-10.037826538086,-66.358123779297
    game_vertex_id = 77
    level_vertex_id = 230506

    way_1_fire

    position = -48.808933258057,-10.04080581665,-63.063709259033
    game_vertex_id = 77
    level_vertex_id = 230516

     

    way_2_task

    position = -47.224723815918,-10.038061141968,-65.55248260498
    game_vertex_id = 77
    level_vertex_id = 232424

    way_2_fire

    position = -48.808933258057,-10.04080581665,-63.063709259033
    game_vertex_id = 77
    level_vertex_id = 230516

     

    way_3_task

    position = -47.224723815918,-10.038061141968,-65.55248260498
    p0:game_vertex_id = 77
    p0:level_vertex_id = 232424

    way_3_fire

    position = -48.808933258057,-10.04080581665,-63.063709259033
    game_vertex_id = 77
    level_vertex_id = 230516

     

    Przetestuj działanie logiki na stworzonych NPC-ach.

    way_*_task — miejsce, gdzie usiądzie NPC. Działa tylko pod smartem.
    way_*_fire — tam, gdzie będzie się patrzył.

    Używa się tego, jeśli NPC siadają wokoło ogniska.

    JEŚLI POD OGNISKIEM NIE MA SIATKI AI, WTEDY NIE MOŻNA USTAWIĆ TAM WAYPOINTU!

    W przykładzie pod ogniskiem nie ma SI, więc wszystkie fire są zespawnowane obok ogniska.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1204-soc-urok-po-sozdaniyu-respawn-monstrov/

  6. NAZWA: Wyświetlenie współrzędnych GG [SoC]
    AUTOR: marlock08 (ARTYKUŁ)Alex Kireev

     

    NIEZBĘDNE PLIKI:

    Spoiler
    • scripts/bind_stalker.script
    • config/ui/ui_custom_msgs.xml

     

    OPERACJE NA PLIKACH:

    Spoiler

    1. Otwieramy plik bind_stalker.script, szukamy linijki object_binder.update(self, delta) i dopisujemy:

    function actor_binder:update(delta)
        object_binder.update(self, delta)
        
        posihion.posihion_mod()

    Linię posihion.posihion_mod() można napisać na końcu tej funkcji, po self.bCheckStart = false end, pomiędzy dwoma end

    Jak to wygląda:

    Spoiler
            level_tasks.add_lchanger_location()
    
            self.bCheckStart = false
    
            end
    
        posihion.posihion_mod()
    
    end

     

     

    2. Otwieramy plik ui_custom_msgs.xml i na początku po <header> dodajemy:

     <header>      
    
    <cs_debug  x="450" y="80" width="600" height="100" complex_mode="1">
                    <text font="graffiti22"  r="240" g="217" b="182" a="255" align="l"/>
           </cs_debug>

    Tutaj możesz zmienić pozycję wyświetlanego tekstu.

    Początkowo tekst jest wyświetlany na środku ekranu, ale aby zmienić miejsce tekstu, wystarczy zmienić wartości x i y.
    Początek znajduje się w lewym górnym rogu ekranu. Oś "X" jest pozioma i skierowana od lewej do prawej. Oś "Y" jest pionowa i skierowana z góry na dół.

    3. Pozostało napisać sam skrypt

    W folderze gamedata/scripts utwórz plik posihion.script i dodaj do niego następujące linie:

    Spoiler
        ------------------------------------- Wyświetlenie informacji level_vertex_id, game_vertex_id, pos
        
    function posihion_mod()
        local hud = get_hud()
        local cs = hud:GetCustomStatic("cs_debug" )
        if cs == nil then
            hud:AddCustomStatic("cs_debug", true)
            cs = hud:GetCustomStatic("cs_debug" )
        end
        local lvid, gvid = db.actor:level_vertex_id(), db.actor:game_vertex_id()     -- Przypisujemy wartość level i game vertex
        local pos, dir = db.actor: position(), db.actor:direction()                  -- Przypisujemy pozycję gracza i kierunek patrzenia
        local pos2 = level.vertex_position(lvid)
        local valid = pos2:distance_to(pos) <= 0.7                                   
        local msg = string.format("lvid: %d\\n", lvid) ..                             -- Level vertex
                    string.format("gvid: %d\\n", gvid) ..                              -- Game vertex
                    string.format("pos: %.2f,%.2f,%.2f\\n", pos.x, pos.y, pos.z) ..   -- Współrzędne GG, zaokrąglone do 2 miejsc po przecinku
        --            string.format("dir: %f,%f,%f\\n", dir.x, dir.y, dir.z) ..         -- Kierunek patrzenia, ZAKOMENTOWANE
                    string.format("valid: %s", tostring(valid))                       -- Pozycja GG, na ziemi, w powietrzu lub na obiekcie
        if cs ~= nil then
            cs:wnd():SetText(msg)                                                     -- Wyświetlenie
        end
    end

     

     

     

     

    PRZYCISK DLA WYGODY:

    Spoiler
    function on_key_press(dik)
        if (dik == DIK_keys.DIK_RCONTROL) then
            posihion_mod()
        end
    end
    
    function on_game_start()
        RegisterScriptCallback("on_key_press",on_key_press)
    end

     

     

    INNE WAŻNE INFORMACJE:

    Spoiler

    Ważne, po przekazaniu argumentów do stringa, jeśli nie jest to ostatnia linia, należy postawić dwie kropki:

       string.format("dir: %f,%f,%f\\n", dir.x, dir.y, dir.z) ..         -- To nie jest ostatnia linijka, KROPKI TRZEBA DODAĆ
                    string.format("valid: %s", tostring(valid))                       -- To jest ostatnia linijka, KROPEK NIE TRZEBA DODAWAĆ
        if cs ~= nil then

     

    Lista dodatkowych opcji, które można wyświetlić:

                    string.format("bleeding: %f\\n",db.actor.bleeding)..              -- Utrata krwi
                    string.format("satiety: %f\\n",db.actor.satiety)..              -- Sytość
                    string.format("section: %s\\n",db.actor:section())..                  -- Sekcja, dział???
                    string.format("name: %s\\n",db.actor:name())..                        -- Nazwa???
                    string.format("health: %.2f\\n", db.actor.health)..                   -- Zdrowie   
    
                    string.format("morale: %.2f\\n", db.actor.morale)..                   -- Morale, reputacja???
                    string.format("power: %.2f\\n", db.actor.power)..                     -- Wytrzymałość
                    string.format("psy_health: %.2f\\n", db.actor.psy_health)..           -- Psi-oddziaływanie???
                    string.format("radiation: %.2f\\n", db.actor.radiation)..             -- Radiacja

    Nie wszystko może działać.

     

    SKRYPT WYŚWIETLANIA NA EKRANIE WSPÓŁRZĘDNYCH GG, PASKA ZDROWIA I PANCERZA:

    Spoiler

    Skrypt wyświetlania na ekranie współrzędnych GG, paska zdrowia i pancerza:

    function posihion_mod()
    	local hud = get_hud()
    	local cs = hud:GetCustomStatic("cs_debug" )
    	if cs == nil then
    		hud:AddCustomStatic("cs_debug", true)
    		cs = hud:GetCustomStatic("cs_debug" )
    	end
    	
    	local outfit = db.actor:get_current_outfit()   -- Funkcja otrzymania pancerza
    	local armor = 0
    	
    	if outfit then       				    -- Jeśli pancerz jest
    		armor = outfit:condition()  		-- To otrzymujemy jej stan
    	else
    		armor = 0  						    -- W przeciwnym wypadku pancerza nie ma
    	end
    	
    	
    	local pos = db.actor:position()                                               -- Pozycja aktora 
    	local msg =
    				string.format("Pos: %.2f,%.2f,%.2f\\n", pos.x, pos.y, pos.z) ..   -- Współrzędne GG
    				string.format("Health: %.2f\\n", db.actor.health)..               -- Życie   
    				string.format("Armor %.2f\\n", armor)                             -- Pancerz
    
    	if cs ~= nil then
    		cs:wnd():SetText(msg)                                                   
    	end
    end

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/2589-socotobrazhenie-koordinat-gg/

  7. NAZWA: Tworzenie pancerza [SoC]
    AUTOR: GromeZ

     

    NIEZBĘDNE OPERACJE:

    Spoiler

    Pierwszą rzeczą, którą musimy zrobić, aby stworzyć zbroję, jest dodanie jej do konfigu. W tym celu wchodzimy do rozpakowanego folderu gamedata -> config -> misc -> outfit.

    1. Tam musimy skopiować dowolną linię, odpowiednią dla naszej zbroi. Musimy wymyślić naszą nazwę jak np. novice_outfit - przykładowo wymyślamy takie: green_outfit.

    2. Następnie musimy przeanalizować linie.

    Visual odpowiada za zbroję w postaci wyrzuconej z plecaka (czyli przedmiotu), zamieńmy ją na (killer_outfit).

    Actor Visual odpowiada za wizualny model naszej postaci podczas noszenia (można ją zobaczyć z drugiej lub trzeciej osoby). Wszystkie wizualizacje znajdują się wzdłuż ścieżki gamedata -> meshes -> actors gdzie wybieramy naszą frakcję. Powiedzmy, że Powinność. I wchodzimy do modelu, który znaleźliśmy w przykładzie actors\dolg\stalker_do_exoskeleton.ogf

    Następnie, linie odpowiadają za naszą nazwę zbroi w ekwipunku - pamiętaj o wpisaniu nazwy zbroi, w przeciwnym razie nastąpi wylot!

    inv_name            = outfit_soldier_name
    inv_name_short        = outfit_soldier_name      (Kurtka nowicjusza) 
    description            = outfit_soldier_description
    
    inv_name            = green_outfit_name
    inv_name_short        = green_outfit_name      (Nasz pancerz, który robimy)
    description            = green_outfit_description

    Wtedy mamy linię

    inv_weight = 3.0 zmieniamy jego wagę na wymyśloną przez nas (albo ujemną albo dodatnią, ujemna - mniejsza waga, dodatnia - większa waga)
    
    inv_weight = 2.0 (uzyskano ujemną wagę zbroi)

    Następnie linijka slotu

    slot = 6 (zostawiamy jak jest)

    Następnie w ekwipunku mamy linię ikonki zbroi w inwentarzu.

    3. Zmienimy to poprzez program SIE, poniżej będą współrzędne naszego pancerza, wpiszemy wybrane współrzędne dowolnego pancerza (w przykładzie wybierzemy ikonę skórzanej kurtki bandyty)

    inv_grid_width = 2
    inv_grid_height = 2
    inv_grid_x = 0
    inv_grid_y = 18
    
    (zastąpione poniżej)
    
    inv_grid_width = 2
    inv_grid_height = 2
    inv_grid_x = 12
    inv_grid_y = 0

    Następnie linia:

    full_icon_name = npc_icon_novice_outfit

    odpowiada za Visual naszej postaci w zbroi, dlatego aby użyć innego modelu wizualnego postaci w zbroi należy wejść w gamedata -> config -> ui -> ui_icons_npc.

    Po otwarciu pliku ui_icons_npc pojawią się linie:

    <ui_texture>
        <file_name>ui\ui_icons_npc</file_name>
    
        <texture id="npc_icon_without_outfit"            x="384" y="384"   width="128" height="320" />
        <texture id="npc_icon_novice_outfit"             x="0" y="704"   width="128" height="320" />
        <texture id="npc_icon_bandit_outfit"             x="0" y="384"   width="128" height="320" />
        <texture id="npc_icon_killer_outfit"             x="256" y="704" width="128" height="320" />
        <texture id="npc_icon_monolit_outfit"            x="384" y="704" width="128" height="320" />
        <texture id="npc_icon_specops_outfit"            x="256" y="384" width="128" height="320" />
        <texture id="npc_icon_military_outfit"            x="640" y="384" width="128" height="320" />
        <texture id="npc_icon_military1_outfit"            x="1024" y="704" width="128" height="320" />
        <texture id="npc_icon_stalker_outfit"            x="896" y="704" width="128" height="320" />
        <texture id="npc_icon_scientific_outfit"        x="768" y="704" width="128" height="320" />
        <texture id="npc_icon_exo_outfit"                x="128" y="704" width="128" height="320" />
        <texture id="npc_icon_exosv_outfit"                x="1024" y="384" width="128" height="320" />
        <texture id="npc_icon_exodo_outfit"                x="1158" y="384" width="128" height="320" />
        <texture id="npc_icon_svoboda_light_outfit"     x="640" y="704" width="128" height="320" />
        <texture id="npc_icon_svoboda_heavy_outfit"     x="128" y="384" width="128" height="320" />
        <texture id="npc_icon_dolg_outfit"                x="512" y="704" width="128" height="320" />
        <texture id="npc_icon_dolg_scientific_outfit"    x="512" y="384" width="128" height="320" />
        <texture id="npc_icon_ecolog_outfit"            x="896" y="384" width="128" height="320" />
        <texture id="npc_icon_protection_outfit"        x="768" y="384" width="128" height="320" />
       
    </ui_texture>

    Możemy skopiować dowolną linijkę, następnie wpisać naszą nazwę:

    <ui_texture>
        <file_name>ui\ui_icons_npc</file_name>
    
        <texture id="npc_icon_without_outfit"            x="384" y="384"   width="128" height="320" />
        <texture id="npc_icon_novice_outfit"             x="0" y="704"   width="128" height="320" />
        <texture id="npc_icon_bandit_outfit"             x="0" y="384"   width="128" height="320" />
        <texture id="npc_icon_killer_outfit"             x="256" y="704" width="128" height="320" />
    
        <texture id="npc_icon_green_outfit"             x="256" y="704" width="128" height="320" />  <- NASZ PANCERZ (wzięto z pancerza najemników)
                                                                                                        
        <texture id="npc_icon_monolit_outfit"            x="384" y="704" width="128" height="320" />
        <texture id="npc_icon_specops_outfit"            x="256" y="384" width="128" height="320" />
        <texture id="npc_icon_military_outfit"            x="640" y="384" width="128" height="320" />
        <texture id="npc_icon_military1_outfit"            x="1024" y="704" width="128" height="320" />
        <texture id="npc_icon_stalker_outfit"            x="896" y="704" width="128" height="320" />
        <texture id="npc_icon_scientific_outfit"        x="768" y="704" width="128" height="320" />
        <texture id="npc_icon_exo_outfit"                x="128" y="704" width="128" height="320" />
        <texture id="npc_icon_exosv_outfit"                x="1024" y="384" width="128" height="320" />
        <texture id="npc_icon_exodo_outfit"                x="1158" y="384" width="128" height="320" />
        <texture id="npc_icon_svoboda_light_outfit"     x="640" y="704" width="128" height="320" />
        <texture id="npc_icon_svoboda_heavy_outfit"     x="128" y="384" width="128" height="320" />
        <texture id="npc_icon_dolg_outfit"                x="512" y="704" width="128" height="320" />
        <texture id="npc_icon_dolg_scientific_outfit"    x="512" y="384" width="128" height="320" />
        <texture id="npc_icon_ecolog_outfit"            x="896" y="384" width="128" height="320" />
        <texture id="npc_icon_protection_outfit"        x="768" y="384" width="128" height="320" />
    
    </ui_texture>

    cost = cena naszego pancerza.

    4. Następnie mamy konfiguracje zbroi. Zmieniamy na własne.

    immunities_sect            = sect_green_outfit_immunities <--Zmieniamy tutaj!
    
    ; NO RESISTANCE
    burn_protection                 = 0.1
    strike_protection                 = 0.2
    shock_protection                 = 0.1
    wound_protection                = 0.2
    radiation_protection             = 0.1
    telepatic_protection             = 0.0
    chemical_burn_protection         = 0.1
    explosion_protection             = 0.1
    fire_wound_protection              = 0.2
    
    bones_koeff_protection = kurtka_mask_damage
    
    [sect_green_outfit_immunities] <--Zmieniamy tutaj!
    burn_immunity                = 0.04            współczynniki wytrzymałości samego kombinezonu
    strike_immunity                = 0.01
    shock_immunity                = 0.04
    wound_immunity                = 0.025
    radiation_immunity            = 0.1
    telepatic_immunity            = 0.00
    chemical_burn_immunity        = 0.04
    explosion_immunity            = 0.04
    fire_wound_immunity            = 0.015

    5. Opis pancerza

    Ścieżka: gamedata -> config -> text -> rus

    Szukamy tam pliku: string_table_outfit, otwieramy go!

    Dla przejrzystości kopiujemy dowolną linię z nazwą, na przykład przyjmujemy nazwę z bandyckiej kurtki:

        <string id="bandit_outfit_name">
            <text>Kurtka bandziora</text>
        </string>
        <string id="bandit_outfit_name">
            <text>Kurtka moro</text> <---Zamienione
        </string>

    Następnie szukamy dowolnej linii z opisem (description):

        <string id="killer_outfit_description">
            <text>tekst.......</text>
        </string>
        <string id="green_outfit_description">
             <text>Fajna kurtka moro</text> <-zamienione
        </string>

    6. Dodajemy towar do konfigu handlu u Sidorowicza.

    Ścieżka: gamedata -> config -> misc -> trade_trader

    ;Pancerze
    killer_outfit            = 1,    0.1

    -----------------------------

    Kopiujemy

    ;Pancerze
    killer_outfit            = 1,    0.1

    -----------------------------

    ;Pancerze
    killer_outfit            = 1,    0.1
    
    green_outfit            = 1,    1 (1,  1 - prawdopodobieństwo sprzedaży)

     

    SIE ICON EDITOR:

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4245-sozdanie-broni-stalker-tch/

  8. NAZWA: Smart_cover w Zew Prypeci [CoP]
    AUTOR: SG

     

    WSTĘP:

    Spoiler

    Od twórcy:

    "Postanowiłem napisać mały samouczek na temat Smart_cover(-ów) w Zew Prypeci. A jest to związane z Zewem Prypeci z jednego powodu… Ostatnio zacząłem pracować z SDK 0.7, a ponieważ pracuję nad moim modem V.A.V.I.L.O.N., to postanowiłem któregoś dnia ustawić kilka Smart_cover'ów, ale niestety nie wszystko udaje się za pierwszym razem. Ustawiłem Smart_cover, ale NPC nie chcą działać w tym smart cover'ze. Czytałem tutoriale jakie mogłem znaleźć, ale w końcu całkiem przypadkowo znalazłem w plikach przyczynę dlaczego nie działały, i teraz wyjaśnię co było powodem :D"

     

    PIERWSZE OPERACJE:

    Spoiler

    Na początek stwórzmy nasz Smart_cover, autor zdecydował się stworzyć go obok bara Brodacza, tak to wygląda:

    2014-02-17_191118.1392650020.jpg

    nazwiemy go:

    zat_a2_animpoint_23

    Teraz, aby to pojawiło się w naszej grze, zbierzemy wszystko w all.spawn, dlatego po ustawieniu i skonfigurowaniu, przechodzimy w prawo i widzimy przycisk compile, wybieramy opcję make game, a następnie klikamy OK. Po tym jak program zbierze nasze dane, kompletujemy all.spawn, do tego SDK posiada plik tool_create_spawn.cmd.

    Klikamy i czekamy, aż all.spawn zostanie zebrany, po zakończeniu przechodzimy do X-Ray CoP SDK\editors\gamedata\spawns i wybieramy nasz all.spawn, ale to tylko all.spawn z naszej lokacji, którą edytowaliśmy, rozpakowujemy i widzimy nasze pliki, w przypadku autora są to alife_zaton i way_zaton. Kopiujemy go do rozpakowanego all.spawn z czystej gry ze zgodą na zamianę plików, kompletujemy i odkładamy na miejsce.

     

    GŁÓWNE:

    Spoiler

    Tutaj wprowadziliśmy do gry edytowany przez nas all.spawn, ale aby nasz Smart_cover mógł być używany przez NPC, nadal musimy wykonać następujące czynności, dopisać go do smart terrain.

    Aby to zrobić, otwieramy gamedata\configs\scripts\zaton\smart\zat_stalker_base_smart.ltx i po linii:

    zat_a2_animp_22 = zaton\zat_a2_logic.ltx

    dodajemy nasz:

    zat_a2_animp_23 = zaton\zat_a2_logic.ltx

     

    Następnie przechodzimy tutaj gamedata\configs\scripts\zaton\zat_a2_logic.ltx i po otwarciu pliku szukamy tej linii:

    [logic@zat_a2_animp_22]
    active = animpoint@zat_a2_animp_22  
    suitable = {=check_npc_name(sim_default) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(stalker_raider) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(zat_b14_stalker_) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(artefact_hunter) =npc_in_zone(zat_a2_sr_noweap)} true
    prior = 100

    i po niej dodajemy nasz:

    [logic@zat_a2_animp_23]
    active = animpoint@zat_a2_animp_23  
    suitable = {=check_npc_name(sim_default) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(stalker_raider) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(zat_b14_stalker_) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(artefact_hunter) =npc_in_zone(zat_a2_sr_noweap)} true
    prior = 150

     

    Idziemy dalej i szukamy tej linii:

    [animpoint@zat_a2_animp_22]:animpoint@zat_a2_animp_gen_reach
    cover_name = zat_a2_animpoint_22
    on_info = {=npc_in_zone(zat_a2_sr_light)} animpoint@zat_a2_animp_22_reached

    właściwie i po tym dodajemy nasz:

    [animpoint@zat_a2_animp_23]:animpoint@zat_a2_animp_gen_reach
    cover_name = zat_a2_animpoint_23
    on_info = {=npc_in_zone(zat_a2_sr_light)} animpoint@zat_a2_animp_23_reached

     

    I jeszcze dalej jest ta linijka:

    [animpoint@zat_a2_animp_22_reached]:animpoint@zat_a2_animp_gen
    cover_name = zat_a2_animpoint_22

    i po niej także dodajemy naszą:

    [animpoint@zat_a2_animp_23_reached]:animpoint@zat_a2_animp_gen
    cover_name = zat_a2_animpoint_23
    

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1280-cop-smart_cover-v-zov-pripyati/

  9. NAZWA: Zabranie pieniędzy ze zwłok [SoC]
    AUTOR: RETRIX

     

    POTRZEBNE PLIKI:

    Spoiler
    • gamedata/scripts/treasure_manager.script
    • gamedata/scripts/lootmoney.script (NOWY PLIK)

     

    OPERACJE NA PLIKACH:

    Spoiler

    Znajdujemy w rozpakowanym katalogu gamedata plik w ścieżce gamedata/scripts/treasure_manager.script.

    W pliku treasure_manager.script znajdujemy następującą konstrukcję kodu:

    --' Юзание инициатора (возможность выдать тайник)
    function CTreasure:use(npc)
    printf("TREASURE USE")
    end

    Po linii TREASURE USE piszemy następujący kod:

    if (npc and db.actor) then
    lootmoney.lootmoney(npc)
    end

    W efekcie wykonanej pracy otrzymujemy w pliku treasure_manager.script następującą konstrukcję:

    --' Юзание инициатора (возможность выдать тайник)
    function CTreasure:use(npc)
    printf("TREASURE USE")
    
    if (npc and db.actor) then
    lootmoney.lootmoney(npc)
    end

    Teraz w katalogu z grą względem ścieżki gamedata/scripts tworzymy nowy dokument tekstowy lootmoney.txt. Otwieramy plik za pomocą notatnika lub innego edytora tekstu i zapisujemy go jako lootmoney.script z kodowaniem ANSI. Możesz wziąć gotowy skrypt LUA, wyczyścić go i zmienić jego nazwę. To ma niewielkie znaczenie.

    W pliku gamedata/scripts/lootmoney.script piszemy taki kod:

    function lootmoney(npc)
    if npc ~= nil and not string.find(npc:section(),"arena") and npc:character_community()~="arena_enemy" then
    local money = npc:money()
    if money ~= nil and money ~=0 then
    local deadmoney = money
    
    local npc_rank
    npc_rank = ranks.get_obj_rank_name(npc)
    if npc_rank ~= nil then
    if npc_rank == "novice" and deadmoney >=400 then deadmoney=math.random(25,400)
    elseif npc_rank == "experienced" and deadmoney >=500 then deadmoney=math.random(50,500)
    elseif npc_rank == "veteran" and deadmoney >=600 then deadmoney=math.random(100,600)
    elseif npc_rank == "master" and deadmoney >=700 then deadmoney=math.random(200,700)
    end
    end
    local news_texti = "\\n%c[255,255,0,0]Martwy stalker: %c[default]"..npc:character_name().."\\n%c[255,255,0,0]Znaleziono pieniądze: %c[default]"..game.translate_string(tostring(deadmoney).."rub.")
    db.actor:give_game_news(news_texti, "ui\\ui_iconsTotal", Frect():set(0,0,83,47), 1, 4000)
    db.actor:give_money(deadmoney)
    game_stats.money_quest_update(deadmoney)
    npc:give_money(-money)
    game_stats.money_quest_update(-money)
    end
    end
    end

    Teraz wystarczy zapisać i zamknąć pliki. Sposób powinien zadziałać. Podczas przeszukiwania zwłok stalkerów automatycznie pobierana jest określona suma pieniędzy, podobnie jak otrzymuje się informacje o schowkach i artykułach w encyklopedii.

    Struktura tego ficzera została wzięta z LootMoney MOD.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1583-soc-snyatie-deneg-s-trupov/

  10. NAZWA: Logika restryktora
    AUTOR: AziatkaVictor

     

    Ten temat został stworzony w celu zebrania wszystkich "sekcji sr" w jednym miejscu. Informacje mogą być uniwersalne dla różnych części serii.

     

    SR_IDLE:

    Spoiler

    Ten schemat w rzeczywistości nie ma żadnych funkcji. Zwykle jest używany do używania timerów i warunków włączenia lub jako połączenie między sekcjami. Jest używany wszędzie i często, bez niego nie można było normalnie napisać logiki.

    Struktura:

    [sr_idle]
    *Działania*

    Przykład 1:

    [logic]
    active = sr_idle
     
    [sr_idle]
    on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%

    W przykładzie taka logika:

    Cytat

    Jeśli GG znajduje się wewnątrz tego restryktora i mamy infoportion "val_raid_start" i brakuje "esc_return" i "esc_trader_speak", to dadzą nam "esc_return" oraz "esc_trader_speak", i wykonuje się funkcja "esc_return_dv".

    Przykład 2:

    [logic]
    active = sr_idle@start
    
    [sr_idle@start]
    on_game_timer = 100 | sr_idle@end %+info1%
    
    [sr_idle@end]
    on_info = {+info2} nil %+info3%

    W przykładzie 2 taka logika:

    Cytat

    10 sekund po uruchomieniu logiki (on_game_timer liczy czas gry, więc mnożymy sekundy przez time_factor, który domyślnie wynosi 10), pojawia się infoportion "info1", a aktywną sekcja staje się "sr_idle@end", gdzie mając infoportion "info2", wydadzą nam "info3" i logika się zakończy.

    Plik: gamedata\scripts\sr_idle.script

    P.S. Pisanie "nil" jest OBOWIĄZKOWE, w przeciwnym wypadku wasza logika może po prostu utknąć w tej sekcji i będzie się dziwić, czemu dostajesz tysiąc zadań lub wiadomości. Zamiast "nil" można stworzyć pustą sekcję i po prostu przełączać na nią, ale nie wiadomo, jak może to wpłynąć na wydajność przy częstym używaniu.

     

    SR_NO_WEAPON:

    Spoiler

    Sekcja służy do zabraniania GG wyciągania broni w określonej strefie, nie ma żadnych ustawień i tak naprawdę ich nie potrzebuje.

    Struktura:

    [logic]
    active = sr_no_weapon
     
    [sr_no_weapon]

    Plik: gamedata\scripts\sr_no_weapon.script

     

    SR_SOUND:

    Spoiler

    Schemat ma na celu odtworzenie dźwięku, gdy aktor wejdzie w space_restrictor. Istnieje również analogia w postaci funkcji "=play_sound()".

    Parametry:

    • snd - ścieżka do dźwięku lub listy dźwięków oddzielonych przecinkami (ścieżka jest względna w stosunku do folderu gamedata\sounds).
    • type - rodzaje dźwięków oddzielonych przecinkami. Dla wygody, rodzaje zestawów dźwięków zostały wprowadzone do tabeli sound_types pliku kontrolnego. W sumie są trzy:
      • floor_wooden;
      • rats_panic;
      • random.
    • delay - opóźnienie odtwarzania dźwięku w sekundach czasu rzeczywistego, domyślnie 0.
    • idle - długość opóźnienia po rozpoczęciu ostatnio odtwarzanego dźwięku. Żeby np. "wycie" było nie częściej niż raz na kilka minut. Określane w sekundach czasu gry, tj. "sekundy * time_factor". Wartość domyślna = 0.
    • rnd - prawdopodobieństwo (w procentach), że dźwięk zostanie odtworzony. Wartość domyślna to 100.
    • position - ustawia nazwę ścieżki, w której wierzchołkach może być odtwarzany dźwięk. Istnieje zastrzeżona wartość "random". Oznacza losową miejsce w promieniu od 15 do 50 metrów od gracza. Jeśli ten parametr nie zostanie ustawiony, przyjmowana jest pozycja gracza.
    • slide_velocity - prędkość (m/s) przemieszczania dźwięku wzdłuż punktów patrolowej ścieżki. Wartość domyślna to 3.
    • slide_sound_once = true/false - jeśli ustawione na true, odtworzy dźwięk raz, nawet jeśli nie dotarł do ostatniego punktu ścieżki, jeśli false, to gdy dźwięk się skończy i nie dotrze do ostatniego punktu ścieżki , Zagraj jeszcze raz. Wartość domyślna to fałsz.
    • play_at_actor = true/false - powoduje, że dźwięk odtwarzany jest cały czas z pozycji aktora. Jeśli jest równe "true" i jest ustawiona ścieżka przemieszczenia dźwięku (lub losowo), wówczas złapiesz wylot.

    Struktura:

    [logic]
    active = sr_sound
     
    [sr_sound]
    snd = dźwięk

    Przykład:

    [logic]
    active = sr_idle
     
    [sr_idle]
    on_actor_inside = sr_sound@shooting
     
    [sr_sound@shooting]
    snd = characters_voice\scenario\garbage\grey_grey_1
    play_at_actor = true
    on_signal = sound_end| nil
    on_timer = 20000| nil

    W przykładzie taka logika:

    Cytat

    Kiedy GG wchodzi w restrykktor, to sekcja zmienia się na "sr_sound@shooting" i zaczyna odtwarzać dźwięk i po 2000 sekundach lub kiedy zakończy się dźwięk - logika kończy się. 

    Plik: gamedata\scripts\sr_sound.script

     

    SR_TIP:

    Spoiler

    Sekcja służy do wysyłania wiadomości do GG, często wykorzystywana w fabularnych modach.

    Parametry:

    • name - linia z id tekstu zarejestrowanego w folderze gamedata\config\text.
    • type = news/tips - parametr jest elementarny i na nic nie wpływa.
    • sender - ustawia warunkowy identyfikator ikonki postaci, od którego przyszła wiadomość.
    • Domyślnie to ikonka handlarza. W SoC możliwe są następujące wartości: default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer.
      • W CoP używane są ikonki, które zostały zapisane w news_manager.script
      • cond = {+info -info =func !func ~number} - potrzebne logiczne warunki, dzięki którym podpowiedź zadziała.
    • single = true/false - jeśli jest true, to wiadomość zostanie wydana tylko raz. Domyślnie false.
    • timeout - opóźnienie wyświetlenie wiadomości w sekundach. Domyślnie - 0.
    • showtime - czas wyświetlenia wiadomości na ekranie. Ustawiane w milisekundach. Domyślnie - 5000.

    Struktura:

    [sr_tip] 
    name = rad_barman_spam
    type = tips
    cond = {+bar_deactivate_radar_done} 
    sender = barman
    showtime = 25000

    Plik: gamedata\scripts\sr_tip.script

     

    SR_LIGHT:

    Spoiler

    Logika włączająca lub wyłączająca latarki w restryktorze u NPC.

    Struktura:

    [sr_light]
    light_on = true/false

    Plik: gamedata\scripts\sr_light.script

     

    SR_TERRITORY:

    Spoiler

    Schemat ten polega na tym, że wychwytuje wszelkiego rodzaju zdarzenia zachodzące wewnątrz restryktora. Jak dotąd wyłapuje tylko trafienia i śmierć NPC. Jednakże schemat działa tylko z graczem, trafienia i śmierć są liczone tylko od gracza.

    Parametry:

    • territory_hit = {+info -info =func !func ~number} %+info -info =func% - efekty, które wystąpią po zadaniu trafienia graczowi znajdującemu się w tej strefie.
    • territory_death = {+info -info =func !func ~number} %+info -info =func% - efekty, które wystąpią po śmierci z "rąk" gracza znajdującego się w tej strefie.

    Struktura:

    [logic]
    active = sr_territory
     
    [sr_territory]
    territory_death = nil %+info%

    Plik: gamedata\scripts\sr_territory.script

     

    SR_MAPSPOT:

    Spoiler

    Po wejściu na restryktora podświetla się on na mapie.

    Parametry:

    • hint - linijka z id tekstu zarejestrowanego w folderze gamedata\config\text.
    • location - nazwa rodzaju znacznika, zarejestrowanego w pliku config\ui\map_spots.xml i wszystkiego, co jest po include. Domyślnie - crlc_small.

    Struktura:

     

    [sr_mapspot]
    hint = gar_swamp
    location = crcl_big

    Plik: gamedata\scripts\sr_mapspot.script

     

    SR_PARTICLE:

    Spoiler

    System ten odtwarza cząsteczki, zarówno statyczne, jak i poruszające się, w określonym miejscu i czasie. Ten schemat polega na śledzeniu cząstek/particles, gracz nie musi do niego wchodzić.

    Parametry:

    • name - ścieżka do cząstki względem pliku particles.xr.
    • path - ścieżki poruszania się cząstki. Możliwe są dwa przypadki:
      • Kiedy zostaje ukazana ścieżka animacji kamery (ścieżka jest względna do folderu gamedata\anims). Dla nazwy pliku trzeba obowiązkowo dodać rozszerzenie .anm (np. arena.anm).
      • Kiedy zostanie podana nazwa ścieżki patrolowej.
    • mode - parametr obowiązkowy i ma ustawiane dwie wartości:
      • 1 - w przypadku wskazania animacji kamery dla parametru path;
      • 2 - w przypadku wskazania patrolowej ścieżki dla parametru path.
    • looped = true/false - flaga zapętlenia cząstek. Przy true, po zakończeniu odtwarzania cząstek, będą uruchamiane od początku, ale bez opóźnień. Jednakże sygnał particle_end nie zostanie wydany. Przy false sygnał zostanie wydane, kiedy wszystkie źródła cząsteczek zostaną odtworzone.

    Struktura:

    [logic]
    active = sr_particle
     
    [sr_particle]
    name = anomaly2\gravity_blast_03      
    path = ścieżka                 
    mode = 2 				
    looped = false               
    on_signal = particle_end | nil

    Plik: gamedata\scripts\sr_particle.script

     

    SR_SOUND_ACT:

    Spoiler

    Schemat odtwarza dźwięk w głowie aktora. Wszelkiego rodzaju rozmowy w PDA i inne rzeczy. Jeśli określono theme, dźwięk będzie odtwarzany w pętli, losowo wybierając jeden z dźwięków określonych w theme, jeśli określony jest dźwięk, zostanie on odtworzony raz.

    Parametry:

    • snd - nazwa dźwiękowego pliku względem folderu gamedata\sounds.
    • delay - opóźnienie przed odtworzeniem. Domyślnie - 0.
    • delay_max - między odtwarzaniem dźwięku zostanie wzięty losowy odstęp czasu pomiędzy delay i delay_max.
    • theme - nazwa utworu z pliku sound_theme.script.
    • stereo = true/false - przy ustawieniu tego parametru do pliku, który jest ustawiony przez parametr snd lub w dźwiękowym theme, automatycznie zostaną dodane sufiksy _r i _l w celu wczytania lewego i prawego kanałów i odpowiednio wszystko to zostanie odtworzone.

    Struktura:

    [logic]
    active = sr_sound_act
    
    [sr_sound_act]
    theme = sar_monolith_call
    delay = 10000
    delay_max = 15000
    stereo = true

    Plik: gamedata\scripts\sr_sound2d.script

     

    SR_TIMER:

    Spoiler

    Schemat do wykonania dowolnej akcji w zależności od stanu timera.

    Parametry:

    • type - typ licznika.
    • dec - dekrementujący, tzn. liczący w dół;
    • inc - inkrementujący, tzn. liczący do góry.
    • start_value - początkowa wartość licznika w rzeczywistych milisekundach.
      • Dla dekrementujących liczników ustawiać obowiązkowo. Dla inkrementujących, jeśli nie ustawiono, to liczy się od 0.
    • on_value = число | %+info -info =func% sekcja - wykonuje działanie w zależności od stanu licznika.
    • string - linia z id tekstu zarejestrowanego w folderze gamedata\config\text.

    Struktura:

    [logic]
    active = sr_timer
     
    [sr_timer]
    type = dec
    start_value = 1000000
    on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%
    string = st_helmet_countdown

    Plik: gamedata\scripts\sr_timer.script

     

    SR_PSY_ANTENNA:

    Spoiler

    Strefy z tą sekcją pozwalają kontrolować efekty psi-oddziaływania (na Jantarze i Radarze). Teraz możesz kontrolować intensywność promieniowania i intensywność otrzymania obrażeń.

    Parametry:

    • eff_intensity - zwiększenie/zmniejszenie w procentach od bazowej wartości intensywności psi-oddziaływania.
    • hit_intensity - zwiększenie/zmniejszenie w procentach od bazowej wartości zadanych obrażeń.
    • phantom_prob - prawdopodobieństwo pojawienia się fantomów w procentach. Domyślnie - 0.
    • postprocess - plik posteffectu, względem folderu gamedata\anims. Rozszerzenie dodawać obowiązkowo! Domyślnie - psy_antenna.ppe.
    • mute_sound_threshold - limit do którego można obniżyć dźwięk poziomu. 0 - głuszy całkowicie, domyślna wartość.

    Struktura:

    [logic]
    active = sr_psy_antenna
     
    [sr_psy_antenna]
    eff_intensity = -10
    hit_intensity = 0
    phantom_prob = 45

    Plik: gamedata\scripts\sr_psy_antenna.script

     

    SR_TELEPORT:

    Spoiler

    Schemat pozwala na teleportację aktora w obrębie lokacji.

    Parametry:

    • point - patrolowa ścieżka z jednego punktu, dokąd przemieści się aktor.
    • look - patrolowa ścieżka z jednego punktu, gdzie będzie patrzył aktor po przemieszczeniu się.
    • prob - prawdopodobieństwo przemieszczenia się do danego punktu. Domyślnie - 100.
    • timeout - opóźnienie teleportacji w milisekundach. Domyślnie - 900.

    Struktura:

    [logic]
    active = sr_teleport
     
    [sr_teleport]
    point1 = aes2_teleport_walk_exit1
    look1 = aes2_teleport_look_exit1
    prob1 = 10
    point2 = aes2_teleport_walk_exit2
    look2 = aes2_teleport_look_exit2
    prob2 = 20
    timeout = 0

    Plik: gamedata\scripts\sr_teleport.script

     

    SR_CUTSCENE:

    Spoiler

    Ten schemat ma na celu odgrywanie animację kamery z pewnym efektem (pp_effector). Sekwencja działań realizowana przez schemat, polega na natychmiastowym przeniesieniu gracza na początek ścieżki point i skierowaniu jego wzroku na początek ścieżki look, utracie kontroli nad graczem i rozpoczęciu animacji kamery cam_effector, po zakończeniu której gracz odzyskuje kontrolę.

    Parametry:

    • point - ścieżka do pierwszego punktu, do którego przenosi się gracz.
    • look - ścieżka do pierwszego punktu, na który patrzy gracz.
    • pp_effector - plik, znajdujący się w folderze gamedata\anims\ i zawierający efekt (nazwa pliku jest zapisywana bez rozszerzenia).
    • cam_effector - plik, znajdujący się w folderze gamedata\anims\camera_effects\ i zawierający animację kamery (nazwa pliku jest zapisywana bez rozszerzenia).

    Struktura:

    [logic]
    active = sr_cutscene
     
    [sr_cutscene]
    point = agr_cutscene_walk
    look = agr_cutscene_look
    cam_effector = agroprom_demo
    on_signal = cameff_end | nil

    Plik: gamedata\scripts\sr_cutscene.script

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/2173-logika-restriktora/

  11. NAZWA: Zmiana wytrzymałości rzeczy w dowolnym momencie gry [CoP]
    AUTOR: FalkineIsaku

     

    WYJAŚNIENIE:

    Spoiler

    Ten tutorial będzie dotyczyć tego, jak zmienić trwałość/wytrzymałość rzeczy GG w dowolnym momencie gry. (w temacie będzie na początku gry)

     

    PRACA W XR_EFFECTS:

    Spoiler

    Są dwa sposoby:

    Zmiana oryginalnej funkcji lub usunięcie starej i zrobienie nowej. (Można zostawić starą i zrobić nową)
    Szukamy w naszym pliku: "function damage_actor_items_on_start", tutaj chyba zrozumiale, ale na wszelki wypadek objaśnienia:

    function damage_actor_items_on_start(actor, npc)  "damage_actor_items_on_start" - można zmienić.
        local actor = db.actor  - Nie ruszać
        
        local obj = actor:object("helm_respirator") "helm_respirator" - to sekcja przedmiotu, któremu chcemy zwiększyć wytrzymałość.
        if obj ~= nil then - Nie ruszać
            obj:set_condition(0.8)  "0.8" - To nowy stan przedmiotu, który możemy ustawić.
        end - Nie ruszać
    end - Nie ruszać

    Zgodnie z tym schematem możliwe jest utworzenie nowej funkcji.

     

    AKTYWACJA:

    Spoiler

    Na początek wyjaśnijmy jak usunąć standardową aktywację funkcji (na początku oryginalnego ZP na Zatonie)
    Wchodzimy do "configs\scripts\zaton\zaton_a1_logic.ltx" i usuwamy %=damage_actor_items_on_start% (jest w 5 linijce)

    Jak wywołać taką funkcję znowu, ale z inną nazwą i w innej logice.
    Otwieramy waszą logikę restryktora i na samym początku, po pierwszym "on_info/on_game_timer" piszemy: %=nazwa_waszej_funkcji%
    Przykład:

    on_info = {+esc_start_game !surge_started} %=nazwa_waszej_funkcji%

    I to wszystko

     

    TROCHĘ SŁÓW OD DENIS2000:

    Spoiler

    Jest zmieniany stan obiektu (odwrotność zużycia przedmiotu). Wytrzymałość (a dokładniej stopień, z jakim psuje się przedmiot pod wpływem czynników zewnętrznych) jest ustawiany w konfigu obiektu w sekcji z nazwą wskazaną w parametrze immunities_sect.

    Autorska funkcja Denis2000:

    function damage_actor_items_on_start()
        local actor = db.actor
        local slot_tab = {2,3,7,12}
        for i = 1, #slot_tab do
            local item_in_slot = actor:item_in_slot(slot_tab[i])
            if item_in_slot ~= nil then
                item_in_slot:set_condition((math.random(30)+40)/100)
            end
        end
    end

    Zmienia ona stan przedmiotów w slotach 2,3,7,12 u GG, to znaczy broni, hełmu i pancerza. Zmienia na losową wartość w przedziale 0,4-0,7, przy tym nie ma znaczenia jaki dokładnie przedmiot jest wydany na starcie gry.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/3993-cop-izmenenie-prochnosti-veshtey-v-lyuboy-moment-igry/

  12. NAZWA: Zmiana obrazu podczas uruchamiania gry [CoP] [CS] [SoC]
    AUTOR: FalkineIsaku

     

    WYJAŚNIENIE:

    Spoiler

    Obraz na początku gry - małe okienko na początku gry, po którym zostaje uruchomiona sama gra.

    Bitmap123.jpg.a76b0beed741f2ac12cee74cc17f95cd.jpg

    Dany tutorial pasuje do wszystkich części Stalkera.

     

    NIEZBĘDNE PROGRAMY:

    Spoiler

    Do tego przyda się nam program "Resource Hacker", "Adobe Photoshop (lub dowolny inny graficzny edytor)" i sam Stalker.  

     

    PRACA Z OBRAZEM:

    Spoiler

    Odpalamy program Resource Hacker, klikamy File ---> Open i szukamy tam nasz XrEngine.exe w GŁÓWNYM folderze Stalkera.
    W lewym okienku klikamy Bitmap --> 123 i następnie PPM na 0 --> Save *.bmp resourse (zapisujemy tam gdzie trzeba)
    Uruchamiamy Photoshop i otwieramy nasz plik z rozszerzeniem .bmp. Na stare zdjęcie nakładamy nowe, zapisujemy w formacie .bmp (najważniejsza rzecz to głębia, ustawiamy 24-bit).
    Znowu odpalamy Resource Hacker i znowu naciskamy PPM na 0, klikamy "Replace Bitmap" ---> Open file with new bitmap i wybieramy nasze .bmp, klikamy Replace i... cieszymy się naszym nowym obrazkiem. Tylko nie zapomnijcie zapisać.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4019-cop-cs-soc-izmenenie-kartinki-pri-zapuske-igry/

  13. NAZWA: Stworzenie płatnej osobistej skrytki [CoP]
    AUTOR: FalkineIsaku

     

    PRACA W LEVEL EDITOR:

    Spoiler

    Przykład będzie na osobistej skrytce na Zatonie.
    Wydzielamy nasz inventory box i w custom data ustawiamy mu taką logikę:
    [story_object]
    story_id = zat_a2_actor_treasure
    - story id waszej skrytki

    [logic]
    cfg = scripts\zaton\actor_inventory_box.ltx
    - ścieżka do logiki (warto utworzyć w folderze waszej lokacji nową logikę specjalnie dla skrytki)

    Kompilujemy spawn.

     

    PRACA Z LOGIKĄ:

    Spoiler

    Na początek wchodzimy do configs/text/rus/ui_st_screen.xml i dodajemy w dowolne miejsce taką sekcję:

        <string id="actor_inventory_box_locked">
            <text>Skrzynka zamknięta</text>
        </string>

    Dalej wchodzimy w configs/scripts/wasza_lokacja/actor_inventory_box.ltx i wstawiamy taką sekcję:

    [logic]
    active = ph_idle@locked
    
    [ph_idle@open_timer_1_day]
    nonscript_usable = true - czy można użyć skrzynki?
    tips = actor_inventory_box_use - napis po najechaniu
    on_game_timer = 864000 | ph_idle@locked %-zat_actor_buy_actor_inventory_box_1_day% - po jednym dniu skrzynka stanie się niedostępna
    
    [ph_idle@open_timer_3_day]
    nonscript_usable = true
    tips = actor_inventory_box_use
    on_game_timer = 2592000 | ph_idle@locked %-zat_actor_buy_actor_inventory_box_3_day%
    
    [ph_idle@locked]
    nonscript_usable = false
    tips = actor_inventory_box_locked
    on_info = {+zat_actor_buy_actor_inventory_box_1_day} ph_idle@open_timer_1_day
    on_info1 = {+zat_actor_buy_actor_inventory_box_3_day} ph_idle@open_timer_3_day

     

     

    STWORZENIE DIALOGU W CELU KUPNA SKRYTKI (DIALOG EDITOR):

    Spoiler

    Najpierw utwórzmy skrypty, wchodzimy więc w dialogs_***.script
    Robimy funkcję sprawdzającą, czy GG posiada pieniądze:

    function zat_a2_actor_has_7000(first_speaker, second_speaker)
        return db.actor:money() >= 7000
    end

    Sprawdzanie na 7000 RUB.

    Teraz robimy skrypt dla zabieranie tych pieniędzy od GG:

    function zat_a2_actor_relocate_from_actor_7000(first_speaker, second_speaker)
        dialogs.relocate_money_from_actor(first_speaker, second_speaker, 7000)
    end

    Teraz dopisujemy je do dialogu, dokładnie tak:

    1028602201__2023_01_02_12_24_35_617.jpg.6cc9d3f4ca9764c5b5c39d5558f39db7.jpg

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4024-cop-sozdanie-platnogo-lichnogo-yashtika/

  14. NAZWA: Wysłanie wiadomości GG z nazwą nadawcy [CoP]
    AUTOR: FalkineIsaku

     

    WYJAŚNIENIE:

    Spoiler

    Wysłanie wiadomości do GG z nazwą nadawcy za pomocą skryptów.
    PS. Zebrane w jakiś sposób z news_manager.script.

     

    OBJAŚNIENIE DO SKRYPTU I SAM SKRYPT:

    Spoiler

    Zapisujemy w xr_effects.script:

    function nazwa_funkcji(actor, type, amount)
    local news_caption = game.translate_string("Nazwa_nadawcy_wiadomości")
    local news_text = game.translate_string("Tekst_wiadomości")
    db.actor:give_game_news(news_caption, news_text, "Ikonka nadawcy (nie z news_manager.script, a wprost z ui\textures_descr\***", nil, czas wyświetlenia wiadomości)
    end

    Przykład:

    function esc_test_sms(actor, type, amount)
    local news_caption = game.translate_string("st_test_sms_caption")
    local news_text = game.translate_string("st_test_sms_text")
    db.actor:give_game_news(news_caption, news_text, "ui_inGame2_Fanat", nil, 10000)
    end

    Wywołujemy standardowo: on_info = {warunek} %=esc_test_sms%

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/3997-cop-otpravka-soobshteniya-gg-s-imenem-otpravitelya/

  15. NAZWA: Okienko "Czy na pewno chcesz przejść na inną lokację?" [CoP]
    AUTOR: FalkineIsaku

     

    WYJAŚNIENIE:

    Spoiler

    Okienko z pytaniem: "Czy na pewno chcesz przejść na inną lokację?" zostało wyciętę z CoP, ale pojawia się kiedy wchodzimy w restryktor, po kliknięciu "Tak" zostaniemy przeniesieni/teleportowani do level_changer; a po kliknięciu na "Nie" - teleportuje nas z dala od restryktora. Pliki są wzięte z amk-mod do CoP.

    I wygląda ono tak:

    1340162080_1.jpg.e11dd1f9aa55705617f3b27ce35a1cb4.jpg

     

    PRACA W SDK:

    Spoiler

    Na początek robimy przejście, ale w tym temacie o tym informacji. W internecie są lekcje.
    Tworzymy space_restrictor i w jego Custom data zapisujemy taką logikę:

    [story_object]
    story_id = nazwa_restryktora
    
    [logic]
    cfg = scripts\ścieżka\do_logiki\restryktora.ltx

    I ustawiamy typ restryktora: Not A
    Zalecane jest od razu zapisać współrzędne, dokąd będzie teleportować przy nacisnięciu na "Tak" i "Nie".
    Kompilujemy spawn i przechodzimy do logiki.

     

    PRACA Z LOGIKĄ:

    Spoiler

    Na początek pobieramy to archiwum: https://drive.google.com/drive/folders/1k8uV66bnn5Dfq7O2sksU3qMVJhaWx_-m?usp=share_link i wrzucamy do folderu z grą (jest tam xr_effects, podstawowy, możecie używać swojego, jeśli macie go zmienionego). Po tym idziemy do naszego pliku logiki restryktora i zapisujemy to:

    [logic]
    active = sr_idle@in
    
    [sr_idle@in]
    on_info = {=actor_in_zone(nazwa_restryktora)} %=nazwa_funkcji_która_będzie_w_xr_effects% sr_idle@out
    
    [sr_idle@out]
    on_info = {!actor_in_zone(nazwa_restryktora)} sr_idle@in

    Teraz wchodzimy do xr_effects.script i zapisujemy taką funkcję:

    function nazwa_funkcji()
        amk_wnd_lv.StartWnd("nazwa_restryktora")
    end

    Po tym idziemy do configs\misc\amk\amk_lv.ltx
    I tak jak w przykładzie, zapisujemy współrzędne:
     

    [nazwa_restryktora]
    Yes=nazwa_restryktora_yes
    No=nazwa_restryktora_no
    [nazwa_restryktora_yes] - współrzędne teleportacji po naciśnięciu na "Tak"
    x=
    y=
    z=
    
    [nazwa_restryktora_no] - współrzędne teleportacji po naciśnięciu na "Nie"
    x=
    y=
    z=

    I to wszystko.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4265-cop-vy-deystvitelno-hotite-pereyti-na-druguyu-lokaciyu/

  16. NAZWA: Prototyp dynamicznych wiadomości
    AUTOR: ?

     

    Aby zrobić ten prototyp, musisz utworzyć skrypt o nazwie podobnej jak twoja_nazwa.script i posiadać oryginalny plik bind_stalker.script.

     

    TWORZENIE WŁASNEGO PLIKU SKRYPTOWEGO:

    Spoiler

    Napiszmy coś takiego:

    -- Prototyp dynamicznych wiadomości 
    local ant_spam ={  
    "Słyszałem, że na ATP z Doliny Mroku zombie chodzą. Ostrożniej tam.",  
    "Timycz: Kto będzie spamował, temu coś wyrwę.",  
    "Ktoś wie, gdzie podziewa się Striełok?",  
    "Wojskowi kompletnie oszaleli! Dwa tysiące rubli za przejście na północ Kordonu - nieźle!",  
    "Pojawił się Chuck Norris u nas. To bandzior z taką ksywką. Debil kompletny.",
    "Kombat kiedyś mówił, że Topol zaginął. Niewiadomo gdzie. Minęli się w podziemiu Agropromu",
    "Powinność: Cholera, przejdźcie na swoje fale. Inaczej wydacie plany Wolności",
    "Wolność: Tasak znowu na Kota wpadł. Kogoś wkrótce wezwą do walki zgodnie z prawem Strefy.",
    "Похоже мне еще в лагере сидеть. Блин долг когда я этот Сидоровичу то отдам?!"
    }
       
    time_news = 0 -- zmienna odstępu czasu
       
    function time_update_spam() -- funkcja odstępu czasu
      local time = time_global() -- zmienna czasu
       if time_news < time then
         time_news = time + 30000 -- czas, po którym zostanie wypisana wiadomość
         twoja_nazwa.update_spam()
        end
    end
       
    function update_spam()
       news_manager.send_tip(db.actor, (ant_spam[math.random(9)]), nil, nil, 30000)  
    end

     

     

     

    ZMIANY W BIND_STALKER.SCRIPT:

    Spoiler

    Wchodzimy do bind_stalker.script i po linijce:

    xr_sound.update_actor()

    piszemy:

    twoja_nazwa.time_update_spam()

     

    Teraz w grze będziesz otrzymywał wiadomości w ciągu kilku sekund. Im więcej czasu w wierszu time_news = time + 30000, tym dłuższy będzie odstęp czasu.

    Możesz także dodać swój news - po linijce "Mod Antdiablon freeplay 2.0 - najlepszy" postaw przecinek i wpisz swój tekst w nowym wierszu, w cudzysłowie, ale na końcu po cudzysłowie postaw przecinek. a jeśli to ostatni tekst, to go nie umieszczaj.

     

    Następnie policz, ile wiadomości jest łącznie i w wierszu:

    news_manager.send_tip(db.actor, (ant_spam[math.random(9)]), nil, nil, 30000)

    zamiast 9 wstaw odpowiednią ilość.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1575-prototip-dinamicheskih-novostey/

  17. NAZWA: Zmiana menu głównego [CoP]
    AUTOR: FalkineIsaku

     

    ZMIANA TŁA MENU:

    Spoiler

    Wchodzimy do configs\ui\ui_mm_main.xml.
    To, co znajduje się przed "<button h="25"/>" - to tło menu. Jeśli chcesz zmienić obraz, zmień "ui_actor_main_menu.dds". Jeśli chcesz zrobić "Wideo-menu" niezbędny będzie plik o formacie .ogm z rozdzielczością "1920x1080". Wrzucacie go do textures\ui\ i zmieniacie.

     

    ZMIANA PRZYCISKÓW:

    Spoiler

    Jeśli chcesz usunąć napisy, to usuwacie "<btn name="btn_credits"     caption="ui_mm_credits" />"
    W całym pliku, tak samo jest w przypadku z ustawieniami, nową grą, itd.

    Jeśli chcesz zmienić pozycję ikonek to wystarczy zmienić
    "<shniaga_wnd x="40" y="320" width="270" height="380">" (14 linijka)
    Zmieniać należy x="*" y="*"

     

    ZMIANA NAPISU W LEWYM DOLNYM ROGU:

    Spoiler

    Zmieniamy napis - "ver. 1.6.02"
    Wchodzimy do scripts i otwieramy plik ui_main_menu.script
    Linijka 28:
        _ver:TextControl():SetText        ("TEST") - to, co jest w cudzysłowach można zmienić na własny tekst, albo angielskimi, albo rosyjskimi literami.

     

    MAŁY DODATEK DLA TYCH, KTO ROBI WIDEO-MENU:

    Spoiler

    Kiedy wejdziesz do opcji z menu "zapisz grę" lub "wczytaj grę", to widzimy niezbyt przyjemny obrazek. Dla poprawki zmieniamy w plikach ui_mm_save_dlg.xml i ui_mm_load_dlg.xml,

    To:

            <auto_static x="500" y="130" width="432" height="160" stretch="1">
                <texture width="432" height="160">ui\video_voroni_crop</texture>
            </auto_static>
            <auto_static x="413" y="352" width="576" height="416" stretch="1">
                <texture width="576" height="416">ui\video_water_crop</texture>
            </auto_static>

    na to:

            <auto_static x="0" y="0" width="1024" height="768" stretch="1">
                <texture x="0" y="0" width="1920" height="1080">ui\nazwa_waszego_wideo_pliku</texture>
            </auto_static>

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4008-cop-izmenenie-glavnogo-menyu/

  18. NAZWA: Zbiór skryptów [CoP]
    AUTOR: ?

     

    DAJEMY PRZEDMIOT GG:

    Spoiler

    Wydanie jednego przedmiotu:

    function nazwa_funkcji(first_speaker, second_speaker)
    	dialogs.relocate_item_section(second_speaker, "nazwa_przedmiotu", "in")
    end

     

    Wydanie kilku jednakowych przedmiotów:

    function nazwa_funkcji(first_speaker, second_speaker)
    	dialogs.relocate_item_section(second_speaker, "nazwa_przedmiotu", "in", ilość)
    end

     

    Skrypt do dialogu:

    <action>nazwa_skryptu.nazwa_funkcji</action>

     

     

    ZABIERAMY PRZEDMIOT GG:

    Spoiler

    Zabranie jednego przedmiotu:

    function nazwa funkcji(first_speaker, second_speaker)
    	dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "nazwa przedmiotu")
    end

     

    Zabranie kilku jednakowych przedmiotów:

    function nazwa funkcji(first_speaker, second_speaker)
    	dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "nazwa przedmiotu", liczba_przedmiotów)
    end

     

    Dodanie skryptu do dialogu:

    <action>nazwa skryptu.nazwa funkcji</action>

     

     

    SPAWNUJEMY PRZEDMIOT DO EKWIPUNKU GG:

    Spoiler
    function nazwa_funkcji()
    	local obj = alife():create("RZECZ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    end

     

    Dodanie skryptu do dialogu:

    <action>nazwa_skryptu.nazwa_funkcji</action>

     

     

    SPRAWDZANIE POSIADANIA PRZEDMIOTU PRZEZ GG:

    Spoiler

    Pierwszy wariant:

    function nazwa_funkcji()
    	return db.actor:object("nazwa_przedmiotu")
    end

     

    Drugi wariant:

    function nazwa_funkcji(first_speaker, second_speaker)
    	return first_speaker:object("название предмета") ~= nil
    end

     

    Dodanie skryptu do dialogu:

    <precondition>nazwa_skryptu.nazwa_funkcji</precondition>
    

     

     

    SPRAWDZANIE POSIADANIA JEDNEGO Z KILKU PRZEDMIOTÓW GG:

    Spoiler
    function Название функции(first_speaker, second_speaker)
    	return first_speaker:object("nazwa_przedmiotu") ~= nil or
    	first_speaker:object("nazwa_przedmiotu") ~= nil or
    	first_speaker:object("nazwa_przedmiotu") ~= nil
    end

     

    Dodanie skryptu do dialogu:

    <precondition>nazwa_skryptu.nazwa_funkcji</precondition>

     

     

    SPRAWDZANIE ILOŚCI PIENIĘDZY GG:

    Spoiler

    Pierwszy wariant:

    function nazwa_funkcji(first_speaker, second_speaker)
    	return first_speaker:money() >= ilość
    end

     

    Drugi wariant:

    function nazwa_funkcji()
    	return db.actor:money() >= ilość
    end

     

    Dodanie skryptu do dialogu:

    <precondition>nazwa_skryptu.nazwa_funkcji</precondition>

     

     

    NAGŁA ŚMIERĆ GG:

    Spoiler
    function nazwa_funkcji(npc, actor)
    	npc:kill(actor)
    end

     

    Dodanie skryptu do dialogu:

    <action>nazwa_skryptu.nazwa_funkcji</action>

     

     

    LECZENIE GG:

    Spoiler

    Dodanie skryptu do dialogu:

    <action>dialogs.medic_magic_potion</action>

     

     

    ODDANIE PIENIĘDZY DLA GG PRZEZ NPC:

    Spoiler
    function nazwa_funkcji(first_speaker, second_speaker)
    	dialogs.relocate_money_to_actor(first_speaker, second_speaker, ilość)
    end

     

    Dodanie skryptu do dialogu:

    <action>nazwa_skryptu.nazwa_funkcji</action>

     

     

    OD MAKDM:

    Spoiler

    Dla spawnu przedmiotu do inwentarza GG wystarczy wskazać ID GG:

    Spoiler

    local obj = alife():create( "RZECZ", vector(), 0, 0, db.actor:id() )

     

     

     

    Dialog może zaczynać i NPC i GG, dlatego do niektórych funkcji, wywoływanych z dialogu, lepiej dodawać sprawdzanie:

    Spoiler

    local actor = dialogs.who_is_actor(first_speaker, second_speaker)

    lub

    local npc =dialogs. who_is_npc(first_speaker, second_speaker)

     

    Funkcje dla pliku xr_effects.script:

    Spoiler

    Czyszczenie lokacji ze zbędnej broni. Broń w schowkach nie jest usuwana:

    function cleaner_weapons( actor, obj )
        local manag = treasure_manager.get_treasure_manager()
        for i = 1,65534 do
            local object = alife():object( i )
            if object then
                local section = object:section_name()
                if string.find( section, "wpn_" ) or string.find( section, "grenade_" ) then
                    if object.parent_id == 65535 and manag.items_from_secrets[ i ] == nil then
                        alife():release( alife():object( object.id ), true )
                    end
                end
            end
        end
    end

     

    Wydanie losowych pieniędzy GG (używane przy posiadaniu elektronicznego portfela) w granicach 500 rubli lub hrywien:

    function give_random_money_to_actor( actor, npc )
        local num = math.random( 500 )
        actor:give_money( num )
        xr_sound.set_sound_play( actor:id(), "pda_tips" )
        news_manager.relocate_money( actor, "in" , num )
    end

     

    Skierowanie kamery w stronę ścieżki podczas cut-sceny:

    function actor_look( actor, npc, p )
        local point = patrol( p[1] )
        actor:actor_look_at_point( point:point(0) )
    end

     

    Zrobić squady (squad) neutralnym(-i) w stosunku do GG:

    function set_squads_neutral_to_actor( actor, npc, p )
        if p then
            for k,v in pairs( p ) do
                local squad = get_story_squad( v )
                if squad then
                    squad:set_squad_relation("neutral")
                end
            end
        end
    end

     

    Zrobić squady (squad) wrogim(-i) w stosunku do GG:

    function set_squads_enemy_to_actor( actor, npc, p)
        if p then
            for k,v in pairs( p ) do
                local squad = get_story_squad( v )
                if squad then
                    squad:set_squad_relation("enemy")
                end
            end
        end
    end

     

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1855-cop-sborka-skriptov/

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

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