Skocz do zawartości

Wojownik

Zasłużony
  • Postów

    4879
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    380

Odpowiedzi opublikowane przez Wojownik

  1. 22 godziny temu, Sabre3PL napisał(a):

    Ktoś się orientuje czy jest tutaj zawarty addon Biała Mgła i Saruman Addon do DMX?

    Niestety nie. Białą Mgłę można dodać do tego moda.

    Uważałbym na kopiowanie niektórych rzeczy z tego dodatku, a mianowicie na Monnoroch AI mod. W czasie snu giną kwestowe postacie. A w Prypeci gra wylatuje do pulpitu, bo monolitowcy na dachach chcą się rozerwać granatem. Jest trochę napisane o tym błędzie z monolitowcami w tym temacie: https://www.amk-team.ru/forum/topic/7726-monnoroch-ai-mod/page/20/

    A jeśli chodzi o Saruman Addon to nie jest on w pełni kompatybilny z tym modem.

    • Dodatnia 1
    • Ważne 1
  2. NAZWA: Różne gotowe przykłady logiki

     

    LOGIKA NPC ANIMPOINT:

    Spoiler

    [logic@nazwa_npc]
    active = animpoint@nazwa_npc
    suitable = {=check_npc_name(nazwa_npc)}true
    prior = 90

    level_spot = level_spot

    [animpoint@nazwa_npc]
    use_camp = false\true
    meet = no_meet\meet@dowolna_nazwa
    combat_ignore_cond = false\true
    combat_ignore_keep_when_attacked = false\true
    invulnerable = false\true
    gather_items_enabled = false\true
    help_wounded_enabled = false\true
    corpse_detection_enabled = false\true
    cover_name = smart_cover NPC'a
    trade_enable = false\true

    [meet@dowolna_nazwa]
    close_anim         = nil
    close_victim     = nil
    far_anim         = nil
    far_victim         = nil
    close_distance     = 0
    far_distance     = 0
    use = {=actor_enemy} false, {=dist_to_actor_le(3)} true, false
    snd_on_use = {!dist_to_actor_le(3)} nil
    meet_on_talking = false

    Analiza:

    Spoiler

    [logic@nazwa_npc]
    active = animpoint@nazwa_npc
    suitable = {=check_npc_name(nazwa_npc)}true
    prior = 90

    level_spot = level_spot - znaczek NPC na mapie

    [animpoint@nazwa_npc]
    use_camp = false\true - czy NPC będzie reagował na strefę camp
    meet = no_meet\meet@dowolna_nazwa - no_meet nie wolno pogadać; można pogadać
    combat_ignore_cond = false\true - czy NPC będzie reagował na atak
    combat_ignore_keep_when_attacked = false\true - czy NPC będzie reagował na to, kiedy jest atakowany
    invulnerable = false\true - czy NPC nieśmiertelny
    gather_items_enabled = false\true - czy będzie zbierać przedmioty
    help_wounded_enabled = false\true - czy będzie pomagać rannym
    corpse_detection_enabled = false\true - czy będzie przeszukiwać trupy
    cover_name = smart_cover NPC'a
    trade_enable = false\true - czy będzie handlować

    [meet@dowolna_nazwa]
    close_anim         = nil
    close_victim     = nil
    far_anim         = nil
    far_victim         = nil
    close_distance     = 0
    far_distance     = 0
    use = {=actor_enemy} false, {=dist_to_actor_le(3)} true, false
    snd_on_use = {!dist_to_actor_le(3)} nil
    meet_on_talking = false

     

     

    LOGIKA NPC WALKER:

    Spoiler

    [logic@nazwa_npc]
    active = walker@nazwa_npc
    suitable = {=check_npc_name(nazwa_npc)}true
    prior = 91
    level_spot = level_spot

    [walker@nazwa_npc]
    path_walk = npc_walk
    path_look = npc_look
    meet = meet@dowolna_nazwa
    combat_ignore_cond = true
    combat_ignore_keep_when_attacked = true
    invulnerable = true
    gather_items_enabled = false
    help_wounded_enabled = false
    corpse_detection_enabled = false

    [meet@dowolna_nazwa]
    close_anim         = nil
    close_victim     = nil
    far_anim         = nil
    far_victim         = nil
    close_distance     = 0
    far_distance     = 0
    use = {=actor_enemy} false, {=dist_to_actor_le(3)} true, false
    snd_on_use = {!dist_to_actor_le(3)} nil

    Analiza:

    Spoiler

    [logic@nazwa_npc]
    active = walker@nazwa_npc
    suitable = {=check_npc_name(nazwa_npc)}true
    prior = 91
    level_spot = level_spot

    [walker@nazwa_npc]
    path_walk = npc_walk - gdzie NPC stoi. Ustawiać tylko ostatnie słowa, które zaczynają się z nazwą NPC. Nie trzeba pełnej nazwy
    path_look = npc_look - gdzie NPC patrzy. Ustawiać tylko ostatnie słowa, które zaczynają się z nazwą NPC. Nie trzeba pełnej nazwy
    meet = meet@dowolna_nazwa
    combat_ignore_cond = true
    combat_ignore_keep_when_attacked = true
    invulnerable = true
    gather_items_enabled = false
    help_wounded_enabled = false
    corpse_detection_enabled = false

    [meet@dowolna_nazwa]
    close_anim         = nil
    close_victim     = nil
    far_anim         = nil
    far_victim         = nil
    close_distance     = 0
    far_distance     = 0
    use = {=actor_enemy} false, {=dist_to_actor_le(3)} true, false
    snd_on_use = {!dist_to_actor_le(3)} nil

     

     

    LOGIKA KAMERY:

    Spoiler

    [logic]
    active = sr_idle

    [sr_idle]
    on_info = {=actor_in_zone(space_rescrictor)} sr_cutscene %=run_postprocess(fade_in:1234) =disable_ui%

    [sr_cutscene]
    point = gdzie GG będzie stał po cutscenie
    look = gdzie GG będzie patrzył po cutscenie
    cam_effector = scenario_cam\lokacja\nazwa_kamery
    global_cameffect = true\false
    on_signal = cameff_end | sr_idle@end_cam %=stop_postprocess(1234) =enable_ui%

    [sr_idle@end_cam]

    Analiza:

    Spoiler

    [logic]
    active = sr_idle - aktywna logika

    [sr_idle]
    on_info = {=actor_in_zone(space_rescrictor)} sr_cutscene %=run_postprocess(fade_in:1234) =disable_ui%

    {=actor_in_zone(space_rescrictor)} - sprawdzanie czy GG znajduje się w space restryktorze

    sr_cutscene - przełączenie na sekcję sr_cutscene

    =run_postprocess(fade_in:1234) - wł. czarnego ekranu

    =disable_ui - wył. ui

    [sr_cutscene]
    point = gdzie GG będzie stał po cutscenie
    look = gdzie GG będzie patrzył po cutscenie
    cam_effector = scenario_cam\lokacja\nazwa_kamery
    global_cameffect = true\false - zwykle ustawia się true, nie wiadomo jak to działa
    on_signal = cameff_end | sr_idle@end_cam %=stop_postprocess(1234) =enable_ui%

    on_signal = cameff_end - wykonać działanie, kiedy cutscena została zakończona

    sr_idle@end_cam - przełączenie na sekcję sr_idle@end_cam

    =enable_ui - wł. ui

    [sr_idle@end_cam]

     

     

    LOGIKA RADIO Z MOŻLIWOŚCIĄ WŁ. I WYŁ.:

    Spoiler

    [logic]
    active = ph_idle@play - aktywna sekcja

    [ph_idle@play]
    on_info = %=play_sound(dźwięk z scripts_sound)% ph_idle@time

    [ph_idle@off]
    on_use = ph_idle@play
    tips = radio_on

    [ph_idle@time]
    on_game_timer = 15 | ph_idle@play
    on_use = ph_idle@off %=stop_sound% 
    tips = radio_off

    Analiza:

    Spoiler

    [logic]
    active = ph_idle@play - а

    [ph_idle@play]
    on_info = %=play_sound(dźwięk z scripts_sound)% ph_idle@time - wł. dźwięku i przełączenie na sekcję

    [ph_idle@off]
    on_use = ph_idle@play - przełączenie na sekcję po naciśnięciu klawisza działania
    tips = radio_on - napis na dole ekranu (trzeba dopisać w text\rus\dowolny plik lub text\pol\dowolny plik)

    [ph_idle@time]
    on_game_timer = 15 | ph_idle@play - wł. nowego soundtracka nowej ścieżki dźwiękowej 1,5 sekundy po zakończeniu poprzedniej
    on_use = ph_idle@off %=stop_sound% - przełączenie na sekcje po naciśnięciu klawisza działania, zatrzymanie dźwięku
    tips = radio_off - napis na dole ekranu (trzeba dopisać w text\rus\dowolny plik lub text\pol\dowolny plik)

     

    To, co trzeba dopisać do script_sound:

    Spoiler

    [radio]
    type = 3d
    npc_prefix = false
    path = radio\radio_music_ - ścieżka do soundtracków
    shuffle = rnd
    idle = 1,10,100

     

     

    LOGIKA ANOMALII:

    Spoiler

    [anomal_zone]
    layers_count = 2
    respawn_tries = 2
    max_artefacts = 2
    artefacts = af_medusa, af_cristall_flower, af_night_star, af_vyvert (dowolne artefakty)
    start_artefact = af_medusa
    coeff = 3, 3, 2, 1
    artefact_ways = way_pointy po których będą poruszać się artefakty
    field_name = nazwa radioaktywnej\termicznej, itd. strefy

    [mines_core]
    lista anomalii, które będą zawsze

    [layer_1]
    mines_section = mines_layer_1

    [mines_layer_1]:mines_core
    lista anomalii, które będą po emisji

    [layer_2]
    mines_section = mines_layer_2

    [mines_layer_2]:mines_core

    lista anomalii, które będą po emisji

    Analiza:

    Spoiler

    [anomal_zone]
    layers_count = 2 - ilość wariacji pozycji anomalii
    respawn_tries = 2 - ?
    max_artefacts = 2 - max ilość artefaktów w anomalii
    artefacts = af_medusa, af_cristall_flower, af_night_star, af_vyvert (dowolne artefakty)
    start_artefact = af_medusa - artefakt, który pojawi się od razu ze 100% szansą
    coeff = 3, 3, 2, 1 - szanse pojawienia się artefaktów (według porządku jak w artefacts)
    artefact_ways = way_pointy po których będą poruszać się artefakty
    field_name = nazwa radioaktywnej\termicznej, itd. strefy

    [mines_core]
    lista anomalii, które będą zawsze

    [layer_1]
    mines_section = mines_layer_1

    [mines_layer_1]:mines_core
    lista anomalii, które będą po emisji

    [layer_2]
    mines_section = mines_layer_2

    [mines_layer_2]:mines_core

    lista anomalii, które będą po emisji

     

    Przykład:

    Spoiler

    [anomal_zone]
    layers_count = 2
    respawn_tries = 2
    max_artefacts = 2
    artefacts = af_medusa, af_cristall_flower, af_night_star, af_vyvert
    start_artefact = af_medusa
    coeff = 3, 3, 2, 1
    artefact_ways = test_anomal_zone_af_way_1, test_anomal_zone_af_way_2
    field_name = escape_zone_field_radioactive_average

    [mines_core]
    escape_zone_mine_gravitational_average_0002
    escape_zone_mine_gravitational_average_0003
    escape_zone_mine_gravitational_average_0004
    escape_zone_mine_gravitational_average_0005
    escape_zone_mine_gravitational_average_0006
    escape_zone_mine_gravitational_average_0007

    [layer_1]
    mines_section = mines_layer_1

    [mines_layer_1]:mines_core
    escape_zone_mine_gravitational_average_0014
    escape_zone_mine_gravitational_average_0015
    escape_zone_mine_gravitational_average_0016
    escape_zone_mine_gravitational_average_0017
    escape_zone_mine_gravitational_average_0018
    escape_zone_mine_gravitational_average_0019

    [layer_2]
    mines_section = mines_layer_2

    [mines_layer_2]:mines_core
    escape_zone_mine_gravitational_average
    escape_zone_mine_gravitational_average_0000
    escape_zone_mine_gravitational_average_0001
    escape_zone_mine_gravitational_average_0008
    escape_zone_mine_gravitational_average_0009
    escape_zone_mine_gravitational_average_0010
    escape_zone_mine_gravitational_average_0011
    escape_zone_mine_gravitational_average_0012
    escape_zone_mine_gravitational_average_0013

     

     

    LOGIKA LAMP, KTÓRE DZIAŁAJĄ TYLKO NOCĄ:

    Spoiler

    [logic]
    active = sr_idle@off

    [sr_idle@off]
    on_info = {=is_day} sr_idle@on %=turn_off(story_id oświetlenia)%

    [sr_idle@on]
    on_info = {!is_day} sr_idle@off %=turn_on(story_id oświetlenia)%

    Analiza:

    Spoiler

    [logic]
    active = sr_idle@off - aktywna sekcja

    [sr_idle@off]
    on_info = {=is_day} sr_idle@on %=turn_off(story_id oświetlenia)%

    {=is_day} - sprawdzanie na dzień

    sr_idle@on - przełączenie na sekcję sr_idle@on

    %=turn_off(story_id oświetlenia)% - wyłączenie oświetlenia po story_id

    [sr_idle@on]
    on_info = {!is_day} sr_idle@off %=turn_on(story_id oświetlenia)%

    {!is_day} - sprawdzanie na brak dnia

    sr_idle@off - przełączenie na sekcję sr_idle@off

    %=turn_off(story_id oświetlenia)% - włączenie oświetlenia po story_id

     

     

    STAŁY RESPAWN ODDZIAŁU:

    Spoiler

    [smart_terrain]
    squad_id = id oddziału
    max_population = lepiej ustawić więcej, np. 5
    respawn_params = respawn@nazwa_smartu

    [respawn@nazwa_smartu]
    spawn_monsters@dowolne

    [spawn_monsters@dowolne]
    spawn_squads = oddział

    spawn_num = 1

    Analiza:

    Spoiler

    [smart_terrain]
    squad_id = id oddziału
    max_population = lepiej ustawić więcej, np. 5
    respawn_params = respawn@nazwa_smartu

    [respawn@nazwa_smartu]
    spawn_monsters@dowolne - tutaj można wskazać kilka oddziałów

    [spawn_monsters@dowolne]
    spawn_squads = oddział - nazwa oddziału z squad_descr

    spawn_num = 1 - ile oddziałów może zostać zespawnowanych na raz

     

    Przykład:

    Spoiler

    [smart_terrain]
    squad_id = 3
    max_population = 5
    respawn_params = respawn@test_respawn_squad

    [respawn@test_respawn_squad]
    spawn_monsters@flesh
    spawn_monsters@boar

    [spawn_monsters@flesh]
    spawn_squads = simulation_flesh
    spawn_num = 2

    [spawn_monsters@boar]
    spawn_squads = simulation_boar
    spawn_num = 1

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/6191-raznaya-gotovaya-logika/

    • Ważne 1
  3. NAZWA: Zasoby z niedokończonego moda
    AUTOR: st_tyopa (możliwe, że zawartość była skądś użyta)

     

    OPIS:

    Spoiler

    Prace z moda, który nie zostanie ukończony. Może być przydatne dla innych twórców modów.
    Co może być interesujące:
    - system barterowy zamiast handlu,
    - schowki z możliwością wyboru otrzymanego łupu,
    - dwie małe lokacje (w razie zainteresowania twórca udostępni kody źródłowe SDK),
    - detektory anomalii zbudowane są na zasadzie detektorów artefaktów.

     

    SCREENY:

    Spoiler

    qm3-EHWh-G1-E5p-Dwj21u-Msb-Jjx-Up-ZZ58cjl8-YWNAMv-Uh-J9-Qv-Qwov-TE

     

    LINK DO POBRANIA:

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/5736-narabotki-po-nedodelannomu-modu/

    • Dodatnia 3
  4. NAZWA: Przeniesienie pewnych rzeczy oryginalnego inwentarza [CoP]
    AUTOR: Ҫвяҭѳӎӹшљ

     

    W tutorialu zostanie przedstawione dodanie do profilu GG i NPC ich frakcji, rangi, reputacji i nastawienia (ostatnie tylko dla NPC), jak w SoC.

    Najpierw musimy przygotować pliki, które się przydadzą, a mianowicie:

    • configs\ui\actor_menu.xml
    • configs\ui\actor_menu_16.xml

     

    PRACA Z PLIKIEM ACTOR_MENU.XML:

    Spoiler

    Otwieramy plik actor_menu.xml i widzimy takie linijki:

    <properties_box>
            <texture>ui_inGame2_demo_player_info_window</texture>
            <list x="0" y="0" width="10" height="10" item_height="18" always_show_scroll="0" can_select="1" bottom_indent="10" right_ident="10" left_ident="20">
                <font_s r="220" g="220" b="220"/>
                <font r="150" g="150" b="150" font="letterica16"/>
            </list>
        </properties_box>

    Po nich musimy wstawić następujące linie:

        <!-- Player Information -->
        <!-- Start -->
        <actor_ch_info x="694" y="10" width="321" height="89">
            <name_static x="5" y="-3" width="112" height="16"> ; nazwa GG (ustawione w pliku configs\gameplay\character_desc_general.xml)
                <text align="l" font="letterica18" color="ui_2"/>
            </name_static>
            <rank_caption x="5" y="23" width="112" height="14"> ; ranga GG (analogicznie)
                <text align="l" font="letterica16" color="ui_3">ui_st_rank</text>  
            </rank_caption>
            <rank_static x="76" y="23" width="112" height="14"> ; nazwa linijki (Ranga - Nowicjusz)
                <text align="r" font="letterica16" color="ui_3"/>
            </rank_static>
            <community_caption x="5" y="12" width="112" height="14"> ; frakcja GG (analogicznie)
                <text align="l" font="letterica16" color="ui_3">ui_st_community</text>
            </community_caption>
            <community_static x="76" y="12" width="112" height="14"> ; nazwa linijki (Frakcja - Wolny stalker)
                <text align="r" font="letterica16" color="ui_3"/>
            </community_static>
            <reputation_caption x="5" y="34" width="112" height="14"> ; reputacja GG (analogicznie)
                <text align="l" font="letterica16" color="ui_3">ui_st_reputation</text>
            </reputation_caption>
            <reputation_static x="76" y="34" width="112" height="14"> ; nazwa linijki (Reputacja - Neutralna)
                <text align="r" font="letterica16" color="ui_3"/>
            </reputation_static>
            <icon x="197" y="1" width="123" height="87" stretch="1"> ; ikonka GG po śmierci (poczerwienienie ikonki)
                <deadbody r="255" g="160" b="160" a="205"/>
            </icon>
        </actor_ch_info>
        <!-- Finish -->
    
        <!-- NPC Information -->
        <!-- Start -->
        <partner_ch_info x="11" y="10" width="321" height="89">
            <name_static x="5" y="-3" width="112" height="16"> ; nazwa NPC (ustawione w pliku configs\gameplay\character_desc_general.xml или же, если NPC уникальный то configs\gameplay\character_desc_имя_локации.xml (к примеру character_desc_zaton.xml))
                <text align="l" font="letterica18" color="ui_2"/>
            </name_static>
            <rank_caption x="5" y="23" width="112" height="14"> ; ranga NPC (analogicznie)
                <text align="l" font="letterica16" color="ui_3">ui_st_rank</text>
            </rank_caption>
            <rank_static x="76" y="23" width="112" height="14"> ; nazwa linijki (Ranga - Nowicjusz)
                <text align="r" font="letterica16" color="ui_3"/>
            </rank_static>
            <community_caption x="5" y="12" width="112" height="14"> ; frakcja NPC (analogicznie)
                <text align="l" font="letterica16" color="ui_3">ui_st_community</text>
            </community_caption>
            <community_static x="76" y="12" width="112" height="14"> ; nazwa linijki (Frakcja - Wolny stalker)
                <text align="r" font="letterica16" color="ui_3"/>
            </community_static>
            <reputation_caption x="5" y="34" width="112" height="14"> ; reputacja NPC (analogicznie)
                <text align="l" font="letterica16" color="ui_3">ui_st_reputation</text>
            </reputation_caption>
            <reputation_static x="76" y="34" width="112" height="14"> ; nazwa linijki (Reputacja - Neutralna)
                <text align="r" font="letterica16" color="ui_3"/>
            </reputation_static>
            <relation_caption x="5" y="45" width="112" height="14"> ; nastawienie NPC do GG (wróg, neutralny, przyjaciel)
                <text align="l" font="letterica16" color="ui_3">ui_st_relation</text>
            </relation_caption>
            <relation_static x="76" y="45" width="112" height="14"> ; nazwa linijki (Reputacja - Nie ma znaczenia)
                <text align="r" font="letterica16" color="ui_3"/>
            </relation_static>
            <icon x="197" y="1" width="123" height="87" stretch="1"> ; ikonka NPC po śmierci (poczerwienienie ikonki)
                <deadbody r="255" g="160" b="160" a="205"/>
            </icon>
        </partner_ch_info>
        <!-- Finish -->

    Ostatnim ruchem, który jest opcjonalny, jest usunięcie tych linii, ponieważ są one niepotrzebne:

        <actor_ch_info x="694" y="10" width="321" height="89">
            <name_static x="10" y="18" width="140" height="16"> ;
                <text align="l" font="letterica18" color="ui_2"/>
            </name_static>
            <community_static x="10" y="36" width="140" height="14"> ;
                <text align="l" font="letterica16" color="ui_3"/>
            </community_static>
            <icon x="197" y="1" width="123" height="87" stretch="1"> ;
                <deadbody r="255" g="160" b="160" a="205"/>
            </icon>
        </actor_ch_info>
    
        <partner_ch_info x="11" y="10" width="321" height="89">
            <name_static x="10" y="18" width="140" height="16"> ;
                <text align="l" font="letterica18" color="ui_2"/>
            </name_static>
            <community_static x="10" y="36" width="140" height="14"> ;
                <text align="l" font="letterica16" color="ui_3"/>
            </community_static>
            <icon x="197" y="1" width="123" height="87" stretch="1"> ;
                <deadbody r="255" g="160" b="160" a="205"/>
            </icon>
        </partner_ch_info>

    Uwaga: Aby mieć pewność, że gra się nie zawiesi, warto usunąć wszystkie objaśnienia (wszystkie te zdania po znaku ";").

     

    PRACA Z PLIKIEM ACTOR_MENU_16.XML:

    Spoiler

    Wykonujemy te same manipulacje, co w przypadku pliku actor_menu.xml, z tym że po prostu wstawiamy linie nie te, które wstawiliśmy do pliku aktor_menu.xml, ale te:

        <!-- Player Information -->
        <!-- Start -->
        <actor_ch_info x="657" y="10" width="257" height="89">
            <name_static x="103" y="21" width="112" height="16">
                <text align="l" font="letterica18" color="ui_7"/>
            </name_static>
            <rank_caption x="103" y="50" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_rank</text>
            </rank_caption>
            <rank_static x="136" y="50" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </rank_static>
            <community_caption x="103" y="38" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_community</text>
            </community_caption>
            <community_static x="136" y="38" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </community_static>
            <reputation_caption x="103" y="61" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_reputation</text>
            </reputation_caption>
            <reputation_static x="136" y="61" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </reputation_static>
            <icon x="-2" y="25" width="99" height="87" stretch="1">
                <deadbody r="255" g="160" b="160" a="205"/>
            </icon>
        </actor_ch_info>
        <!-- Finish -->
    
        <!-- NPC Information -->
        <!-- Start -->
        <partner_ch_info x="111" y="10" width="257" height="89">
            <name_static x="103" y="21" width="112" height="16">
                <text align="l" font="letterica18" color="ui_7"/>
            </name_static>
            <rank_caption x="103" y="50" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_rank</text>
            </rank_caption>
            <rank_static x="136" y="50" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </rank_static>
            <community_caption x="103" y="38" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_community</text>
            </community_caption>
            <community_static x="136" y="38" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </community_static>
            <reputation_caption x="103" y="61" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_reputation</text>
            </reputation_caption>
            <reputation_static x="136" y="61" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </reputation_static>
            <relation_caption x="103" y="88" width="112" height="14">
                <text align="l" font="letterica16" color="ui_7">ui_st_relation</text>
            </relation_caption>
            <relation_static x="136" y="88" width="112" height="14">
                <text align="r" font="letterica16" color="ui_7"/>
            </relation_static>
            <icon x="-2" y="25" width="99" height="87" stretch="1">
                <deadbody r="255" g="160" b="160" a="205"/>
            </icon>
        </partner_ch_info>
        <!-- Finish -->

    Uwaga: Linie te nie różnią się za bardzo od tych w pliku actor_menu.xml, ale jak być może zauważyłeś, zapisane są w nich inne współrzędne.

    actor_menu_16.xml - plik ten pełni dokładnie tę samą funkcję co actor_menu.xml i nie różni się od nazwy, oprócz tego, że plik ten ma za zadanie poprawnie wyświetlać inwentarz UI na ekranach szerokoformatowych.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1732-cop-perenos-nekotorogo-funkcionala-originalnogo-inventarya/

  5. NAZWA: Prawidłowa praca z ikonkami
    AUTOR: Hrust

     

    OPIS DZIAŁAŃ:

    Spoiler

    Zacznijmy od oprogramowania.

    Potrzebny będzie Photoshopa CS5/CS6 lub CC.

    Po drugie, zapomnij o Stalker Icon Editor.

    Po trzecie, potrzebny też będzie PaintDotNet. Oznacza to, że do pracy z samymi ikonami używamy tylko dwóch programów, nie licząc programu do ich renderowania.

    Następnie musisz popracować ze źródłem - tga to idealny buforowy format dla tych dwóch programów, zapisujemy go w formacie 32-bitowym.

    1.png2.png

    Aby dodać nowe ikony, używamy PaintDotNet. Tworzymy nową warstwę, wstawiamy na nią potrzebny obraz i dopasowujemy go do rozmiaru (metoda dwuliniowa/bilinear), zaznaczamy obszar, wycinamy i wklejamy na warstwę główną, usuwając w ten sposób poprzednią ikonkę, jeśli taka była. Zapisujemy i przejchodzimy do Photoshopa. Tutaj włączamy siatkę (Ctrl+"), tutaj dostosowujemy jej wymiary, domyślnie jest to 50 pikseli.

    4.png5.png

    WAŻNE!!! NIE UŻYWAJ SKRAJNIE PRAWYCH I SKRAJNIE DOLNYCH KOMÓREK, NIE SĄ KOMPLETNE I SĄ O KILKA PIKSELI MNIEJSZE OD POZOSTAŁYCH.

    Wybieramy kolor + alfa za pomocą klawisza Shift i, jeśli to konieczne, dostosujemy ikonkę w komórce i zapisujemy.
    Aby skopiować ikony z jednego atlasu do drugiego, wybieramy ikonkę w jednym, kopiujemy i wklejamy w drugim - najwygodniej jest to zrobić z wybranym kolorem i alfą, aby nie trzeba było przenosić osobno.
    Następnie przechodzimy do "warstw" i odblokowujemy warstwę - odsłoni to informacje we właściwościach o wybranym elemencie i jego położeniu. Tutaj poznamy współrzędne, dla 50x50 będziemy musieli skorzystać z kalkulatora, a dla 100x100 po prostu odetniemy dwa zera.

    W CS5/CS6 można uzyskać współrzędne za pomocą F8 (w nowych wersjach ułatwiono dostęp i znajduje się to w zakładce właściwości).

    6.png

    tutaj pozycja X wynosi 950, dzielmy przez 50 i mamy 19 - dokładnie taką liczbę często pisze się w inv_grid_x. Podobna historia z graczem. Ш - szerokość 50, dzielimy przez 50, otrzymujemy inv_grid_width równy jeden. Podobnie jest z wysokością. PO ODBLOKOWANIU WARSTWY NIE ZAPISUJEMY ATLASÓW, TYLKO ZAMYKAMY!
    Otwieramy atlas w programie PaintDotNet lub w Photoshop (potrzebna jest wtyczka dds).

    Do zapisu w Photoshop:

    Spoiler

    7.png8.png

     

    Do zapisu w PaintDotNet:

    Spoiler

    9.png10.png

     

     

    INNE RZECZY OD AUTORA:

    Spoiler

    Autorskie atlasy ikonek:

     

    Tutorial odnośnie renderingu i dodaniu nowych ikonek, blender jest potrzebny:

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4205-pravilnaya-rabota-s-atlasami-ikonok/

    • Dodatnia 1
    • Ważne 1
  6. NAZWA: Tworzenie ekwipunkowego kompleksu
    AUTOR: FantomICW

     

    WSTĘP:

    Spoiler

    Być może zastanawiałeś się kiedyś nad stworzeniem przedmiotu, który po użyciu wrzuci do Twojego ekwipunku kilka innych na raz, jak np. uniwersalna zestaw medyczny. Efekt ten można osiągnąć za pomocą callbacków na użycie przedmiotów.
    Co to jest „callback”? Krótko mówiąc, jest to coś w rodzaju skryptu infoportion. Jednakże callback może działać jednorazowo lub stale: podczas podnoszenia przedmiotów, podczas ich używania, podczas strzelania, po trafieniu NPC i tak dalej. Interesuje nas callback użycia przedmiotu, który będzie działał stale.

     

    POTRZEBNE PLIKI:

    Spoiler
    • configs/misc/items.ltx
    • configs/text/pol/st_items_equipment.ltx
    • scripts/_g.script
    • scripts/bind_stalker.script
    • scripts/my_callbacks.script

     

    ZEW PRYPECI (CZYTAĆ, NAWET JEŚLI INTERESUJE WAS CZYSTE NIEBO LUB CIEŃ CZARNOBYLA):

    Spoiler

    Część I - tworzymy przedmiot:

    1. Otwieramy items.ltx i kopiujemy sekcję jakiegoś boostera. Wstawmy nową sekcję gdzieś w tym samym pliku.

    2. Skonfigurujmy to tak, jak chcemy.

    [medkit_complex]:booster
    $spawn     = "food and drugs\medkit_complex"
    visual    = dynamics\devices\dev_aptechka\dev_aptechka_mid.ogf
    description   = st_medkit_complex_desc
    inv_name   = st_medkit_complex
    inv_name_short          = st_medkit_complex
    inv_weight   = 1.8
    inv_grid_width     = 2
    inv_grid_height    = 2
    inv_grid_x         = 10
    inv_grid_y         = 27
    cost    = 30000
    attach_angle_offset  = 0.440521, 1.378287, -0.644026
    attach_position_offset         = 0.104196, -0.010821, 0.076969
    attach_bone_name  = bip01_r_hand
    auto_attach   = false
    bone_name   = bip01_r_hand
    position_offset   = 0.0,0.0,0.0
    angle_offset   = 1.570790,1.570790,3.92699
    use_sound   = interface\inv_medkit

    Nie zabawimy tu długo. Wszystko jest proste. Można tylko powiedzieć, że przy użyciu będzie odtwarzany dźwięk apteczki, a model wzięto z wojskowej apteczki.

    3. W st_items_equipment.ltx tworzymy opis i nazwę przedmiotu:

    <string id="st_medkit_complex">
                              <text>Uniwersalny zestaw medyczny</text>
                             </string>
                             <string id="st_medkit_complex_desc">
                              <text>Specjalny zestaw medyczny, opracowany dla służb specjalnych w Strefie. Zawiera w sobie wszystkie podstawowe medykamenty.</text>
                             </string>

    To wszystko, jeśli chodzi o konfigi.

    Część II - tworzymy callbacki:

    1. Tworzymy plik my_callbacks.script w folderze scripts.
    2. Wypełniamy go w następujący sposób:

    function on_use_item(sect)
    --Zmienne
    local actor=db.actor
    local item_name=sect:section()
    local actor_pos=db.actor:position()
    local active_slot=db.actor:active_slot()
    local active_item=db.actor:active_item()
    local pistol_in_slot=db.actor:item_in_slot(2)
    local rifle_in_slot=db.actor:item_in_slot(3)
    local outfit_in_slot=db.actor:item_in_slot(7)
    local helm_in_slot=db.actor:item_in_slot(12)
    --Callbacki
    if item_name=="medkit_complex" then
    give_object_to_actor("drug_anabiotic")
    give_object_to_actor("antirad")
    give_object_to_actor("bandage")
    give_object_to_actor("drug_radioprotector")
    give_object_to_actor("drug_antidot")
    give_object_to_actor("drug_psy_blockade")
    give_object_to_actor("drug_coagulant")
    give_object_to_actor("drug_booster")
    end
    end

    give_object_to_actor - to jest dokładnie skrypt wydający przedmiot GG, polegający na callbacku. Nazwa elementu jest w nawiasach. Ogólnie rzecz biorąc, kontynuujemy w ten sam sposób i dodajemy, co chcemy. Zasada jest jasna.

    2. Rejestrujemy nasz plik w bind_stalker.script. Znajdujemy tam function actor_binder:use_inventory_item(obj) i pod drugim end piszemy:

    if obj~=nil then
                                my_callbacks.on_use_item(obj)
                                end

    Ogólnie wygląda tak:

    function actor_binder:use_inventory_item(obj)
                             if(obj) then
                              local s_obj = alife():object(obj:id())
                              if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then
                               xr_effects.disable_ui_only(db.actor, nil)
                               level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
                               level.add_pp_effector("surge_fade.ppe", 11, false)
                               give_info("anabiotic_in_process")
                               _G.mus_vol = get_console():get_float("snd_volume_music")
                               _G.amb_vol = get_console():get_float("snd_volume_eff")
                               get_console():execute("snd_volume_music 0")
                               get_console():execute("snd_volume_eff 0")
                              end
                             end
                             if obj~=nil then
                               my_callbacks.on_use_item(obj)
                                end
    end

    3. Pozostaje dodać funkcję globalną give_object_to_actor do _g.script.

    Piszemy na dole:

    -- 'Tworzenie przedmiotu w plecaku GG.
    function give_object_to_actor(obj,count)
                              if count==nil then count=1 end
                              for i=1, count do
                                 alife():create(obj,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
                              end
    end

    Pozostaje tylko dopisać pakiet GG i przetestować go!

     

    CZYSTE NIEBO LUB CIEŃ CZARNOBYLA:

    Spoiler

    Przeanalizujemy wyłącznie skrypty. Możesz przyjrzeć się konfigom i innym rzeczom w poprzednim spoilerze. Wiele osób zadawało mi pytanie jak przenieść callback na używanie przedmiotu w CCz i CzN. Powodem braku pracy callbacka w tych grach, jest brak funkcji function actor_binder:use_inventory_item(obj) w bind_stalker.script. Dla działającego kompleksu powinno to wyglądać tak:

    function actor_binder:use_inventory_item(obj)        
                                if(obj) then        
                                 local s_obj = alife():object(obj:id())        
                                 if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then        
                        xr_effects.disable_ui_only(db.actor, nil)        
                        level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")        
                        level.add_pp_effector("surge_fade.ppe", 11, false)        
                        give_info("anabiotic_in_process")        
                        _G.mus_vol = get_console():get_float("snd_volume_music")        
                        _G.amb_vol = get_console():get_float("snd_volume_eff")        
                        get_console():execute("snd_volume_music 0")        
                        get_console():execute("snd_volume_eff 0")        
                                 end        
                                end        
                                if obj~=nil then        
                        my_callbacks.on_use_item(obj) --Odsyłacz do naszego skryptu z funkcją on_use_item(obj)
                         end          
    end

    Tak więc, zarejestrujmy ją i dodajmy. Wszystkie funkcje typu actor_binder są zarejestrowane w innej funkcji w tym samym pliku. Nazywa się to funkcją function actor_binder:reinit(). W CzN i CCz jest tak:

    function actor_binder:reinit()
                   object_binder.reinit(self)
    
                   local npc_id = self.object:id()
    
                   db.storage[npc_id] = { }
    
                   self.st = db.storage[npc_id]
                   self.st.pstor = nil
    
                   self.next_restrictors_update_time = -10000
    
                   self.object:set_callback(callback.inventory_info, self.info_callback, self)
                   self.object:set_callback(callback.article_info, self.article_callback, self)
                   self.object:set_callback(callback.on_item_take, self.on_item_take, self)
                   self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
                   self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
                   --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
                   self.object:set_callback(callback.task_state, self.task_callback, self)
                   --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
                   self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
                   self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
                   self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
    end

    A w ZP:

    function actor_binder:reinit()
            object_binder.reinit(self)
            local npc_id = self.object:id()
            db.storage[npc_id] = { }
            self.st = db.storage[npc_id]
            self.st.pstor = nil
            self.next_restrictors_update_time = -10000
            self.object:set_callback(callback.inventory_info, self.info_callback, self)
            self.object:set_callback(callback.article_info, self.article_callback, self)
            self.object:set_callback(callback.on_item_take, self.on_item_take, self)
            self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
            self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self)
            self.object:set_callback(callback.task_state, self.task_callback, self)
            self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
            self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
            self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
            self.object:set_callback(callback.use_object, self.use_object_callback, self)
    end

    Można zauważyć, że w ZP pojawia się:

    self.object:set_callback(callback.use_object, self.use_object_callback, self)

    Ta sama potrzebna funkcja.

    1) Dodamy ją do rejestru CCz/CzN:

    function actor_binder:reinit()
                   object_binder.reinit(self)
    
                   local npc_id = self.object:id()
    
                   db.storage[npc_id] = { }
    
                   self.st = db.storage[npc_id]
                   self.st.pstor = nil
    
                   self.next_restrictors_update_time = -10000
    
                   self.object:set_callback(callback.inventory_info, self.info_callback, self)
                   self.object:set_callback(callback.article_info, self.article_callback, self)
                   self.object:set_callback(callback.on_item_take, self.on_item_take, self)
                   self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
                   self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
                   --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
                   self.object:set_callback(callback.task_state, self.task_callback, self)
                   --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
                   self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
                   self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
                   self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
                   self.object:set_callback(callback.use_object, self.use_object_callback, self)
    end

    2) Teraz dodajmy samą funkcję gdzieś w pliku. W takim przypadku nie warto przenosić całej funkcji z ZP. Jest tam kilka zbędnych rzeczy. W CCz/CzN funkcja actor_binder:use_inventory_item(obj) powinna wyglądać następująco:

    function actor_binder:use_inventory_item(obj)
                   if obj~=nil then
                   my_callbacks.on_use_item(obj)
                   end
    end

    3) I to wszystko, pozostaje tylko utworzyć skrypt my_callbacks.script z callbackiem umożliwiającym użycie elementu. Jak to zrobić, możesz zobaczyć wyżej. Tylko nie zapominaj, że w CCz i CzN nie ma czegoś takiego jak "anabiotyk" i "herkules".

     

    PRZYKŁAD TEGO, JAK PRZEDMIOT TAKIEGO RODZAJU DZIAŁA:

    Spoiler

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1317-sozdanie-inventarnogo-kompleksa/

    • Dodatnia 2
  7. meet.png

    NAZWA: Sekcja "meet" w logice NPC [CoP]

     

    Sekcja "meet" jest niezbędna, aby skonfigurować zachowanie NPC podczas interakcji, jakie frazy powie podczas spotkania, niektóre ustawienia podczas dialogu z nim i tak dalej.

     

    UŻYWANE PARAMETRY:

    Spoiler
    • meet_state = liczba | nazwa_animacji@nazwa_utworu – ustawia animację i głos postaci w zależności od odległości od aktora na równą liczbę.
    • meet_state_wpn = liczba | nazwa_animacji@nazwa_utworu – to samo co "meet_state", ale działa tylko wtedy, kiedy GG ma w rękach broń.
    • victim = liczba | parametr – ustawia obiekt, na który postać będzie musiała patrzeć, w zależności od odległości, równy liczbie.
    • victim_wpn = liczba | parametr – to samo co "victim", ale działa gdy GG trzyma w rękach broń. Dla obu parametrów możliwe są następujące wartości:
      • actor - patrzeć na gracza;
      • story_id - patrzeć na postać ze wskazanym story_id;
      • nil - nigdzie.
    • use = true/false/self - ustawienia możliwości interakcji z postacią.
    • use_wpn = true/false/self - ustawienia możliwości interakcji z postacią, jeśli GG trzyma broń w rękach.
      • true - można
      • false - nie wolno
      • self - NPC sam zacznie dialog z GG, zalecane jest używać ze sprawdzeniem na odległości od GG "=dist_to_actor_le(odległość)".
    • zone = nazwa_strefy | nazwa_animacji@nazwa_utworu - jeśli GG zostanie zauważony we wskazanym restryktorze, to NPC będą odgrywać zadaną animację i wypowiadać zadany dźwięk.
    • meet_dialog = nazwa_dialogu - możliwość ustawienia startowego dialogu NPC, wskazywanie nieobowiązkowe.
    • synpairs = nazwa_animacji@nazwa_utworu - jeśli w określonych warunkach spotkanie odtworzy dokładnie ten stan i ten dźwięk, wówczas zostaną one zsynchronizowane zgodnie z przypadkowymi animacjami stanu ciała.
    • abuse = true/false - domyślnie true, jeśli jest false, to NPC, z którym nie wolno porozmawiać, nie będzie bić GG w twarz.
    • precond = usability/visibility.
    • allow_break = true/false - czy NPC może przerwać dialog
    • trade_enable = true/false - czy GG może handlować z NPC
    • far_distance = liczba - ukazujemy, przy jakiej odległości GG będzie dla NPC daleko.
    • far_victim = parametr - gdzie NPC będzie patrzył, jeśli gracz będzie daleko (odległość mierzona jest z "far_distance").
      • actor - patrzeć na gracza;
      • story_id - patrzeć na postać ze wskazanym story_id;
      • nil - nigdzie.
    • far_anim = parametr - animacja, jeśli gracz jest daleko (odległość brana jest z "far_distance").
    • far_snd = parametr - schemat dźwiękowy, jeśli GG jest daleko (odległość brana jest z "far_distance").
    • close_distance = liczba - to samo, co "far_distance", tylko na odwrót (GG jest blisko dla NPC).
    • close_anim = parametr - animacja, jeśli gracz jest blisko (odległość brana jest z "close_distance").
    • close_victim = parametr - gdzie NPC będzie patrzył, jeśli gracz będzie blisko (odległość brana jest z "close_distance").
      • actor - patrzeć na gracza;
      • story_id - patrzeć na postać ze wskazanym story_id;
      • nil - nigdzie.
    • close_snd = parametr - schemat dźwiękowy, jeśli GG jest blisko (odległość brana jest z "close_distance").

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/2093-cop-sekciya-meet-v-logike-nps/

    • Dodatnia 1
    • Ważne 1
  8. NAZWA: Przywracamy bohatera na mapę [SoC]

    Ważne: po wpadnięciu za tekstury lub wypadnięciu poza mapę zapisz grę, w przeciwnym razie nic się nie stanie. Zapisz grę, kiedy GG znajduje się poza mapą.

     

    OPIS DZIAŁAŃ:

    Spoiler

    Plik gry, który będziemy edytować:

    • ui_main_menu.script

    Najpierw wchodzimy do gry, wczytujemy i naciskamy klawisz ~ (tylda), powinno otworzyć się okno konsoli.

    Następnie wprowadzamy kolejno te polecenia, w następującej kolejności:

    • rs_stats 1
    • demo_record 1

    Pierwsza komenda odpowiada za wyświetlenie informacji na ekranie, druga komenda umożliwia latanie po lokacji (wolna kamera). Aby wyłączyć wyświetlanie informacji, użyj polecenia rs_stats 0; aby wyjść z wolnej kamery, po prostu naciśnij klawisz Esc.

    Powinno być coś takiego:

    Spoiler

    1.jpg

    Następnie z pomocą klawiszy w, s, d, a, przemieszczamy się do potrzebnego punktu:

    Spoiler

    2.jpg

    I zapisujemy gdzieś, te współrzędne:

    Spoiler

    3.jpg

    Współrzędne oddziela się przecinkiem i są w kolejności x, y, z.

    Teraz przechodzimy do folderu gamedata/scripts, szukamy pliku ui_main_menu.script (na wszelki wypadek robimy jego kopię), otwieramy go notatnikiem (można Notepad ++) i na samym końcu znajdujemy następujący blok kodu :

    if dik == DIK_keys.DIK_Q then
    			self:OnMessageQuitWin()
    		end

    (Przycisk Q odpowiada za szybkie wyjście z gry, działa w menu gry)

    Zamieniamy w nim self:OnMessageQuitWin() na self:teleport()

    Czyli powinno to wyglądać tak:

    if dik == DIK_keys.DIK_Q then
                --self:OnMessageQuitWin()  -- zakomentowano 
                self:teleport()
            end

    Następnie na samym końcu tego pliku, po zakończeniu wszystkich funkcji, wstawiamy swoją funkcję:

    function main_menu:teleport()
        local a = vector()
        a.x = -187.59
        a.y = 2.74
        a.z = 106.37
        db.actor:set_actor_position(a)
    end

    gdzie a.x, a.y, a.z, to współrzędne miejsca, do którego należy przenieść GG.

    Zapisujemy wszystko, uruchamiamy grę, wczytujemy save i wykonujemy następującą kombinację: Esc -> Q -> Esc. GG po tej kombinacji powinien przenieść się na określone współrzędne.

    Testowane na CCz, wersja 1.0004.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/2643-soc-shoc-vozvrashtaem-geroya-na-kartu/

    • Dodatnia 2
    • Ważne 1
  9. Logo.jpg.10d64fd19c86d04c6dce2a9585cc8bf0.jpg

    NAZWA: LightWave 3D

     

    LightWave 3D to program komputerowy, w pełni funkcjonalny profesjonalny edytor grafiki 3D opracowany przez firmę NewTek. Najnowsze wersje są przeznaczone do pracy w systemach Microsoft Windows i OS X (zarówno 32-bitowych, jak i 64-bitowych). Popularny pakiet do tworzenia grafiki trójwymiarowej, szeroko stosowany w produkcji wideo, telewizyjnej i filmowej.

    Został on aktywnie wykorzystany przy tworzeniu gry S.T.A.L.K.E.R.. Na przykład do stworzenia takich legendarnych lokacji jak: buildowski Kordon, Wysypisko, Bar, Jantar, Radar i wielu innych obiektów w grze. Format .lwo można bezpośrednio zaimportować do SDK gry.

     

    PLUGIN DLA EKSPORTU GEOMETRII I ANIMACJI W SDK STALKER:

    Spoiler

    Zawiera pluginy dla wersji x32 i x64-bitowych programu LightWave 3D.

     

    Dostępne wtyczki:

    1. Oficjalny plugin od GSC;

    2. Plugin od bardak*a i Loxotrona;

    3. Plugin od Diesela dla wersji x64.

    Sposób instalacji opisany jest w folderze z wtyczkami lub na filmie od Modery:

     

    KOLEKCJA PLUGINÓW DLA PROGRAMU:

    Spoiler

    Uwaga! Wtyczki przeznaczone są dla 32-bitowej wersji programu LightWave 3D!

    W archiwum znajduje się większość wtyczek, z których DREYYY korzysta.

    Lista:

    - S.T.A.L.K.E.R. Export - plugin dla eksportu do formatu SDK;
    - DDS - plugin dla importu/eksportu tekstur .dds;
    - Deep Exploration - program do przeglądu obiektów 2D i 3D, ponadto ma możliwość konwertowania ich do innych formatów;
    - Deep PAINT 3D - program do rysowania/malowania po modelu 3D. Świetnie działa z LightWave;
    - UV Road - plugin do wyrównywania siatki UV;
    - UVEditpro - plugin dla profesjonalnego rozwinięcia UV;
    - UVEdit - plugin z przydatnymi funkcjami do pracy z UV;
    - UVmagnet - plugin do eksportu siatki UV do innych edytorów;
    - Tube point - plugin do tworzenia rur;
    - PF_bezie - plugin dla budowania geometrii na podstawie krzywej Béziera;
    - Cable - plugin pozwala tworzyć kable pomiędzy punktami;
    - EasySplit - plugin do rozcinania wielokątów;
    - FBX converter - program do przeniesienia do innego formatu FBX;
    - Pluginy (Normalmapplugin, BakeCamera) dla zabaw ze światłem w teksturach. (Ustawienia światła, mapy normali, itd.);
    - Plugin (qemLOSS3) do przekształcania modelu High-Poly do modelu Low-Poly;
    - Plugin (UVinvector) rzutowania siatki UV z modelu High-Poly do modelu Low-Poly;
    - Plugin (AutoReplaceImage) automatycznej zmiany pliku tekstury, jeśli został zmieniony;
    - Plugin (CenterPoint) do stworzenia punktu (centralnie) wewnątrz wielokąta;
    - Jettobevel - rozszerzony plugin bevel;
    - Jettofillter - plugin do wygładzania ostrych krawędzi;

    Link: https://cloud.mail.ru/public/B7A9/ashRi4Vkw

     

    W archiwum jest folder LW - lekcje, w których można znaleźć rusyfikowane wideo-tutoriale odnośnie podstawowych funkcji LightWave 3D.

    Link: https://cloud.mail.ru/public/gwfk/iDzT7A68a

    LEKCJE W PROGRAMIE LIGHTWAVE 3D:

    Spoiler

     

    WIDEO I PRACE W LIGHTWAVE 3D:

    Spoiler

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/4478-lightwave-3d/

    • Dodatnia 2
  10. NAZWA: Stalker Map Pack volume 1 + Dodatek [SoC]

     

    OPIS:

    Spoiler

    SKŁAD:

    Spoiler

    Stalker Map Pack 1 volume 1: 
    - ATP
    - Jaskinia
    - Zapomniany Las
    - Leśny Gąszcz
    - Legowisko
    - Limańsk
    - Szpital
    - Generatory
    - Warlab
    - Czerwony Las
    - Opuszczona wioska
    - Bagno z CzN

    Dodatek 8 (dodatek_8_stalker_1004):
    - Zaton
    - Wschodnia Prypeć (z ZP)
    - Laboratorium X8
    - Okolice Jupitera
    - Podziemia Jupitera
    - Martwe miasto

    Podziemia Agropromu (cs_undeground_stalker_1004):
    - Podziemia Agropromu (z CzN)
    Predbannik (predbannik_stalker_1004):
    - Odpowiednio predbannik

    Dodatek 9 (build_locations_1004):
    - Stary jantar
    - Stare wysypisko
    - Stare bagna

    Oraz poprawki dla dodatków:
    - Paczka poprawek dla paczki lokacji SMP1+Dod. 8+Agr.Und.+Predbannik+Dod. 9
    - Naprawione mapy
    - Fix penetracji krzaków i gałęzi
    - Fix dla Warlabu

     

    Stalker Map Pack to zbiór 12 lokacji autorstwa Kostya V, kalinin11, ZVUKARь, Министр. Ale w ciągu swojego długiego istnienia pakietowi udało się pozyskać 4 dodatkowe dodatki, które ogólnie obejmują 11 dodatkowych lokacji, które są również przedstawione w tej paczce. Zaleca się instalację tylko pakietu Stalker Map Pack volume 1, ponieważ w niektórych lokacjach z dodatków jest wiele nieścisłości. Na przykład nieprawidłowe wyświetlanie tekstur lub podczas wczytywania lokacji może wystąpić wylot z powodu braku tekstur. Dlatego też ta paczka zawiera zbiór poprawek i patchów do tych dodatków.

    Dod. informacja:
    Przejścia do nowych lokacji z (Dodatek 8 + Podziemia Agropromu + Predbannik + Dodatek 9) zlokalizowane są w wiosce nowicjuszy, a przejść z niektórych lokacji z powrotem nie ma, np. z Zatonu. Możesz samodzielnie zmieniać ich pozycję i dodać nowe.

    Oto link jak to zrobić, np.: http://stalkerin.gameru.net/wiki/index.php?title=SoC._Спавн_точек_перехода_между_уровнями

    Jeśli w ciągu pierwszych minut w predbanniku wystąpi wylot, musisz usunąć sekcję zone_flame_small_0004 w pliku all.spawn i spakować go ponownie. Jeśli wystąpi wylot z takim logiem, wykonanie tej manipulacji powinno pomóc.
    Jeszcze jedno, jeśli chcesz połączyć paczkę lokacji z arsenal modem, ale masz problem z kompatybilnością z plikiem particles.xr, pomocne będzie narzędzie PE TOOL 1.2. Łączy on cząstki.

     

    SCREENY:

    Spoiler

    1.jpg2.jpg3.jpg

     

    INSTALACJA:

    Spoiler

    -Stalker_Map_Pack_for_10004 
    -addition_8_stalker_1004 
    -cs_undeground_stalker_1004 
    -predbannik_stalker_1004 
    -build_locations_1004 
    -Fixy do dodatków: 
    -Сборка патчей для пака локаций SMP1+Доп.8+Agr.Und.+Предбанник+Доп.9 
    -Исправленные карты 
    -Фикс пробиваемости кустов и веток вроде 
    -Фикс для варлаб

     

    LINK:

     

    ŹRÓDŁO:

    https://stalkerportaal.ru/load/teni_chernobylja_globalnye_modifikacii/s_t_a_l_k_e_r_shadow_of_chernobyl_stalker_map_pack_volume_1_dopolnenie/136-1-0-1277

    https://ap-pro.ru/forums/topic/2357-stalker-map-pack-v1-dopolnenie/

    • Dodatnia 2
  11. NAZWA: Jak stworzyć prostą ścieżkę path_walk?
    AUTOR: BadQvik

     

    OPIS DZIAŁAŃ:

    Spoiler

    Aby utworzyć tzw. punkty ścieżek path_walk potrzebujemy:

    • rozpakowany all.spawn

    Kiedy patrzymy na rozpakowany plik all.spawn, widzimy dość rozbudowaną strukturę z plików typu “ltx”. Są pliki ze skrótem “alife_nazwa lokacji, jak również “way_nazwa lokacji. Aktualnie przyda nam się plik way_*** (dla przykładu wzięto Bagna z CzN), to znaczy way_marsh.

    Odkrywszy go, widzimy nieznane literki i liczby:

    [mar_smart_terrain_8_9_to_mar_smart_terrain_8_11_patrol_1_walk]
    points = p0,p1
    p0:name = wp00
    p0:position = 271.433837890625,0.316967993974686,-52.3820457458496
    p0:game_vertex_id = 53
    p0:level_vertex_id = 310238
    p0:links = p1(1)
    
    p1:name = wp01
    p1:position = 262.600189208984,0.248438000679016,-66.6992034912109
    p1:game_vertex_id = 49
    p1:level_vertex_id = 304064
    p1:links = p2(1)

    Ta sekcja jest ścieżką z dwóch punktów: (р0) и (р1); krótkie objaśnienie:

    [nazwę sekcji* można wprowadzić dowolną, później jest używana w logice]

    • points = p0,p1 - ilość punktów, z których będzie się składać ścieżka patrolowa
    • p0:name = wp00 – nazwę dla punktu można nadać dowolną (wp00, wp01, wp02 или way_kap_say_1, itd.)
    • p0:position = pozycja (x,y,z)
    • p0:game_vertex_id = game vertex
    • p0:level_vertex_id = level vertex
    • p0:links = p1(1) – do jakiego punktu NPC pójdzie po tym punkcie

    Poradziliśmy sobie z sekcjami, teraz możemy spróbować zrobić ścieżkę. Dla przykładu zostanie stworzona ścieżka z dwóch punktów, w których NPC będzie chodzić tu i ówdzie - od 1-go do 2-go, od 2-go do 1-go.

    W pliku way_mars.ltx (gdzie indziej może być kordon np.) tworzymy sekcję:

    [urok_badqvik_1]
    points = p0,p1
    p0:name = wp00
    p0:position = 271.433837890625,0.316967993974686,-52.3820457458496
    p0:game_vertex_id = 53
    p0:level_vertex_id = 310238
    p0:links = p1(1)
    
    p1:name = wp01
    p1:position = 262.600189208984,0.248438000679016,-66.6992034912109
    p1:game_vertex_id = 49
    p1:level_vertex_id = 304064
    p1:links = p2(1)

    Uwaga! Najpierw musisz spisać współrzędne punktów, na przykład dwóch, współrzędne w przykładzie nie działają/są wzięte jako przykład! Jeśli ustawisz p1:links = p2(2), wówczas NPC pozostanie w punkcie drugim, tak więc zawsze bądź ostrożny z tą linią.

    Po utworzeniu ścieżek pozostaje tylko dołączyć tę ścieżkę do NPC (Jeśli nie utworzyłeś ścieżki, to utwórz ją). Odbywa się to poprzez niezłożoną logikę.

    W folderze gamedata\configs\scripts\nazwa waszego pliku.ltx robimy tak:

    [logic]
    active = walker
    
    [walker]
    path_walk = urok_badqvik_1

    Zamykamy, zapisujemy i np. jeśli zespawnowaliście NPC przez all.spawn, szukacie sekcji z waszym NPC, znajdujemy tam:

    custom_data = <<END

    i piszemy:

    [logic]
    cfg = scripts\nazwa waszego pliku.ltx
    END

    Zamykamy wszystko, kompilujemy all.spawn i oglądamy dzieło. Nasz NPC musi chodzić tam i z powrotem w nieskończoność, dopóki oczywiście nie zostanie zabity.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1587-kak-sozdat-samyy-prostoy-put-path_walk/

    • Ważne 1
  12. NAZWA: Tworzenie bardziej złożonych dialogów
    AUTOR: R.I.C.K.(KAIL)

     

    LEKCJA NR 1 - TWORZENIE ZŁOŻONEGO DIALOGU Z KILKOMA GAŁĘZIAMI:

    Spoiler

    Stworzymy bardziej złożony dialog z Sidorowiczem, powiedzmy, że zapytamy go o Kła, Barmana i wioskę kotów.

    Co się przyda:

    • character_desc_lokacja.xml
    • dialogs_lokacja.xml
    • stable_dialogs_lokacja.xml

    Wchodzimy do character_desc_lokacja.xml, w przykładzie wzięto character_desc_escape.xml a teraz szukamy handlarza; poniżej są takie linijki:

    <start_dialog>hello_dialog</start_dialog> - jakiś dialog na przywitanie
    <actor_dialog>esc_trader_queshion_actor</actor_dialog> - nasz dialog

    wszystko zapisujemy.

    Teraz wchodzimy do dialogs_lokacja.xml, w przykładzie dialogs_escape.xml:
    Trzeba stworzyć szkielet dialogu. Na samym dole zaczynami pisać przed słowem </dialogs>:

    <dialog id="esc_trader_queshion_actor"> -- nazwa dialogu powinna być tak jak napisana jest w character_desc_lokacja
    <dont_has_info>esc_trader_queshion_actor</dont_has_info>
    <phrase_list> - szkielet
    <phrase id="0"> - pierwszy ID
    <text>esc_trader_queshion_0</text> - pierwsza fraza aktora typu odpowiedz na moje pytania
    <next>1</next> -- przechodzimy do następnej frazy
    </phrase>
    <phrase id="1"> - nast. ID, tak jak było w next
    <text>esc_trader_queshion_1</text> - fraza handlarza typu Pytaj, ale na wszystkie pytania mogę nie znać odpowiedzi
    <next>2</next> -- tutaj przechodzimy do następnych gałęzi, to znaczy rozgałęzieniu dialogu można zapytać o 3 pytania
    <next>4</next>
    <next>8</next>
    </phrase>
    <phrase id="2">
    <text>esc_trader_queshion_2</text> - opowiedz o sobie себе актер
    <next>3</next> - co ci powiedzieć handlarzu
    </phrase>
    <phrase id="3">
    <text>esc_trader_queshion_3</text>
    </phrase>
    <phrase id="4">
    <text>esc_trader_queshion_4</text> -- pytanie 2 opowiedz o zonie
    <next>5</next> -- zona to ogromna dziura
    </phrase>
    <phrase id="5">
    <text>esc_trader_queshion_5</text>
    <next>6</next>
    </phrase>
    <phrase id="6">
    <text>esc_trader_queshion_6</text>
    <next>7</next>
    </phrase>
    <phrase id="7">
    <text>esc_trader_queshion_7</text>
    </phrase>
    <phrase id="8">
    <text>esc_trader_queshion_8</text> opowiedz o spełniaczu życzeń
    <next>9</next>
    </phrase>
    <phrase id="9">
    <text>esc_trader_queshion_9</text> w dwóch słowach powiedz życzenie
    </phrase>
    </phrase_list>
    </dialog>

    I to wszystko. Szkielet został napisany, gdy zadajemy pytanie, rozmawimy, pierwsze pytanie, i wracamy do początku. Pozostaje tylko napisać tekst.

    Wchodzimy do stable_dialogs_lokacja.xml, w przykładzie stable_dialogs_escape.xml i piszemy:

    <string id="esc_trader_queshion_0">
    <text>Odpowiesz mi na kilka pytań?</text>
    </string>
    <string id="esc_trader_queshion_1">
    <text>Pytaj, może odpowiem</text>
    </string>
    <string id="esc_trader_queshion_2">
    <text>Kim jest stalker Kieł?</text>
    </string>
    <string id="esc_trader_queshion_3">
    <text>Hmm, gdzieś słyszałem, że Kieł to legenda zony, jeden z członków grupy Striełoka. Byli ponoć w centrum zony i nawet przeżyli. Często go widziano w Barze, rok temu był u mnie i interesował się rzadkimi częściami, a gdzie jest teraz pojęcia nie mam.</text>
    </string>
    <string id="esc_trader_queshion_4">
    <text>Opowiedz o Barmanie.</text>
    </string>
    <string id="esc_trader_queshion_5">
    <text>A co tu opowiadać, Barman jak barman, znajduje się w Barze 100 Radów, można u niego kupić wyposażenie i zapytać odnośnie pracy.</text>
    </string>
    <string id="esc_trader_queshion_6">
    <text>Jaką pracę może zaproponować?</text>
    </string>
    <string id="esc_trader_queshion_7">
    <text>Różną. Od szukania artefaktów do zabijania stada mutantów lub przyniesienia cennego ładunku.</text>
    </string>
    <string id="esc_trader_queshion_8">
    <text>Co to za obóz tutaj niedaleko?</text>
    </string>
    <string id="esc_trader_queshion_9">
    <text>To tutejszy obóz nowicjuszy, dowodzi w nim Wilk, jeśli chcesz możesz pójść z nim pogadać albo z miejscowymi stalkerami, ale oni mało ci powiedzą, bo wszyscy są jeszcze zieloni.</text>
    </string>

    I to wszystko, napisaliśmy dialog.

     

    LEKCJA NR 2 - TWORZENIE ZŁOŻONEGO DIALOGU Z WARUNKIEM:

    Spoiler

    Dzisiaj stworzymy złożony dialog z dwiema opcjami odpowiedzi i warunkiem, powiedzmy, że musisz zapytać postać o coś ważnego, ale on nie chce ot tak rozmawiać i za informację żąda "przynieś mi wódkę i ci powiem" .

    Czego będziesz potrzebować:

    • dialogs_new.script
    • character_desc_lokacja.xml
    • dialogs_lokacja.xml
    • info_l-lokacja.xml
    • stable_dialogs_lokacja.xml

    Tworzymy skrypt w folderze scripts z nazwą dialogs_new.script i piszemy funkcję/warunek:

    -przepustka ochroniarza
    function have_vodka(first_speaker, second_speaker) -- funkcja sprawdza czy akto ma w inwentarzu 1 butelkę wódki
    return first_speaker:object("vodka") ~= nil
    end
    
    function give_vodka(first_speaker, second_speaker) -- funkcja oddajemy przedmiot postaci
    dialogs.relocate_item_section(second_speaker, "vodka", "out")
    end

    Zakończyliśmy i zapisujemy.

    Następnie przechodzimy do pliku character_desc_lokacja.xml, znajdujemy swoją postać, a dokładniej jej profil:

    #include "gameplay\character_food.xml"
    </supplies>
    
    #include "gameplay\character_criticals_3.xml"
    <!--<actor_dialog>dialog_helo</actor_dialog> -- jakieś dialogi
    <actor_dialog>kuda_otvesti</actor_dialog>-->
    <actor_dialog>spawn_npc1_wpn_pm_m1_quest</actor_dialog>
    <actor_dialog>spawn_npc1_wpn_pm_m1_quest_completed</actor_dialog>
    <actor_dialog>dialog_who</actor_dialog>
    <actor_dialog>esc_talk_item</actor_dialog> -- nasz dialog
    </specific_character>

    Zapisujemy, będziemy pisać teraz szkielet dialogu.

    Przechodzimy do pliku dialogs_Lokacja.xml i po słowie:

    </dialogs>

    piszemy:

    <dialog id="esc_talk_item">
    <has_info>new_info</has_info>-- вставить сдесь
    <dont_has_info>esc_talk_item</dont_has_info>
    <phrase_list>
    <phrase id="0">
    <text>esc_talk_item_0</text> -- 1-sza fraza aktora
    <next>1</next>
    </phrase>
    <phrase id="1">
    <text>esc_talk_item_1</text> -- odpowiedź postaci
    <next>2</next> - przechodzimy do następnej frazy
    </phrase>
    <phrase id="2">
    <text>esc_talk_item_2</text>
    <next>3</next>
    </phrase>
    <phrase id="3">
    <text>esc_talk_item_3</text>
    <next>4</next>
    </phrase>
    <phrase id="4">
    <text>esc_talk_item_4</text>
    <next>5</next>
    </phrase>
    <phrase id="5">
    <text>esc_talk_item_5</text>
    <next>6</next>
    </phrase>
    <phrase id="6">
    <text>esc_talk_item_6</text>
    </phrase>
    <phrase id="7">
    <text>esc_talk_item_7</text>
    <next>8</next>
    <next>10</next>
    </phrase>
    <phrase id="8">
    <text>esc_talk_item_8</text>
    <precondition>dialogs_new.have_vodka</precondition> -- warunek ze skryptu
    <action>dialogs_new.give_vodka</action> - aktywujemy oddanie przedmiotu ze skryptu
    <next>9</next>
    <phrase id="9">
    <text>trader_ohranik_whois_9</text>
    <give_info>esc_talk_item</give_info> - umieszczamy wszystko tutaj po zdaniu postaci, gdy mówi o doktorze i kończymy dialog
    </phrase>
    <phrase id="10">
    <text>esc_talk_item_10</text>
    <next>11</next>
    </phrase>
    <phrase id="11">
    <text>esc_talk_item_11</text>
    <next>12</next>
    </phrase>
    <phrase id="12">
    <text>esc_talk_item_12</text> -- zrozumiano
    <action>dialogs.break_dialog</action>
    </phrase>
    </phrase_list>
    </dialog>

    I tak, szkielet został napisany. Napiszemy infoportion.

    Jeśli chcesz, aby twój dialog był aktywowany przez infoportion, napisz tak:

    <has_info>new_info</has_info>

    Dalej przechodzimy do info_l-lokacja.xml, i piszemy:

    <info_portion id="esc_talk_item"></info_portion>

    Jeśli chcesz, aby twój dialog nie pojawiał się ponownie, wydamy infoportion:

    <give_info>esc_talk_item</give_info>

    A teraz pozostało tylko napisać tekst.

    Wchodzimy do stable_dialogs_lokacja.xml, otwieramy i piszemy:

    <string id="esc_talk_item_0">
    <text>Potrzebuję informacji.</text>
    </string>
    <string id="esc_talk_item_1">
    <text>Co chcesz wiedzieć?</text>
    </string>
    <string id="esc_talk_item_2">
    <text>Wiesz, kim jest Doktor?</text>
    </string>
    <string id="esc_talk_item_3">
    <text>Wiem, ale tak po prostu nie opowiem o nim.</text>
    </string>
    <string id="esc_talk_item_4">
    <text>Dobra, co chcesz w zamian?</text>
    </string>
    <string id="esc_talk_item_5">
    <text>Przynieś mi butelkę wódki i pogadamy wtedy.</text>
    </string>
    <string id="esc_talk_item_6">
    <text>Dobrze.</text>
    </string>
    <string id="esc_talk_item_7">
    <text>Ok, poczekam.</text>
    </string>
    <string id="esc_talk_item_8">
    <text>Trzymaj wódkę.</text>
    </string>
    <string id="esc_talk_item_9">
    <text>Wspaniale, później będzie można się zrelaksować. Odnośnie Doktora, to gdzie go znaleźć wie tylko Striełok. Doktor jest jednym z pierwszych stalkerów, którzy przyszli do zony. Leczy on stalkerów od radiacji, a także niektórych mutantów zony. Słyszałem nawet, że Doktor to były wojskowy, przyszedł do zony z oddziałem, na początku kiedy zona się pojawiła. On i inni wojskowi ochraniali perymetr.</text>
    </string>
    <string id="esc_talk_item_10">
    <text>Nie mam niestety wódki.</text>
    </string>
    </string>
    <string id="esc_talk_item_11">
    <text>W takim razie i rozmowy nie będzie. Przyniesiesz to pogadamy.</text>
    </string>
    <string id="esc_talk_item_12">
    <text>Rozumiem.</text>
    </string>

    I to wszystko, zakończyliśmy nasz dialog.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1183-sozdanie-bolee-slozhnyh-dialogov/

    • Dodatnia 2
    • Ważne 1
  13. NAZWA: Spawnujemy drzwi z pomocą A-Life [SoC]
    AUTOR: Matrix

     

    Temat spawnu drzwi, a dokładnie mówiąc, ich logika jest dość interesująca. Można zrobić tak, aby nasze drzwi się otwierały, jeśli gracz otrzyma jakiś infoportion lub będzie miał jakiś przedmiot.

    OPIS DZIAŁAŃ:

    Spoiler

    Dla spawnu samych drzwi, potrzebujemy rozpakowany plik all.spawn, można go rozpakować z pomocą ACDC.

    Otwieramy alife_*nazwa lokacji* (bierzemy tą lokację, na której chcemy zespawnować nasze drzwi).

    Wpisujemy na koniec lub na początek te linijki:

    [99999]
    ; cse_abstract properties
    section_name = physic_object
    name = home_door
    position = -170.69994506836, -20.019019012451, -139.07005517550
    direction = 0,0,0
    
    ; cse_alife_object properties
    game_vertex_id = 55
    distance = 0
    level_vertex_id = 79321
    object_flags = 0xfffffffa
    custom_data = <<END
    [logic]
    cfg = scripts\esc_home_door.ltx
    
    [collide]
    ignore_static
    END
    
    ; cse_visual properties
    visual_name = physics\door\door_pripyat_01
    
    ; cse_ph_skeleton properties
    skeleton_name = 
    
    ; cse_alife_object_physic properties
    physic_type = 0x3
    mass = 10
    fixed_bones = link
    

    Teraz przyjrzyjmy się bliżej.

    • [99999] - numer naszego obiektu, taki, aby się nie powtarzał.
    • name = home_door - nazwa naszego obiektu.
    • position - pozycja obiektu.
    • direction - kierunek, w który będzie rozmieszczony obiekt.
    • cfg - logika drzwi.
    • visual - model wizualny naszego obiektu, w naszym przypadku są to drzwi pokoju z dekoderem w Prypeci.

    Współrzędne możemy wskazać inne, aby dowiedzieć się współrzędnych miejsca, gdzie chcemy postawić drzwi, wpisujemy ten skrypt do pliku ui_main_menu.script znajdującego się w gamedata\scripts\.

    function main_menu:OnButton_credits_clicked() 
    local text 
    local vid 
    local gvid 
    local a = vector()  
    local text 
    a = db.actor:position()  
    vid = db.actor:level_vertex_id()  
    gvid = db.actor:game_vertex_id()  
    text = "Pozycja:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid 
    news_manager.send_tip(db.actor, text, nil, nil, 30000) 
    end
    

    Teraz, jeśli już weszliśmy do miejsca, którego współrzędne chcemy poznać, wracamy się do menu i klikamy na Creditsy/Twórców gry.
    Kiedy wrócimy do gry, otrzymamy wiadomość ze współrzędnymi. Robimy zdjęcie za pomocą F12.
    Zrzut ekranu będzie w miejscu, w którym masz folder zapisami gry.
    Wprowadzamy współrzędne X, Y, Z, a także level_vertex_id i game_vertex_id.
    Następnie możemy zebrać nasz spawn, ale nie spieszymy się jeszcze z wejściem do gry.

     

    Zrobimy prostą logikę. Tworzymy plik esc_home_door.ltx w gamedata\config\scripts\.
    Jeśli chcemy, żeby drzwi otwierały się kluczem, wpisujemy do niego następujące linie:

    [logic]
    active = ph_door@locked1
    
    
    [ph_door@locked1]
    locked = true
    closed = true
    snd_open_start = trader_door_open_start
    snd_close_start = trader_door_close_start
    snd_close_stop = trader_door_close_stop
    show_tips = true
    on_use = {=actor_has_item(house_key)} ph_door@open
    
    [ph_door@open]
    locked = true
    closed = false
    snd_open_start = trader_door_open_start
    snd_close_start = trader_door_close_start
    snd_close_stop = trader_door_close_stop
    show_tips = false
    

    I te linijki jeśli chcemy, żeby drzwi się otworzyły po otrzymaniu infoportion:

    [logic]
    active = ph_door@locked1
    
    
    [ph_door@locked1]
    locked = true
    closed = true
    snd_open_start = trader_door_open_start
    snd_close_start = trader_door_close_start
    snd_close_stop = trader_door_close_stop
    show_tips = true
    on_info = {+esc_kill_bandits_quest_done} ph_door@open
    
    [ph_door@open]
    locked = true
    closed = false
    snd_open_start = trader_door_open_start
    snd_close_start = trader_door_close_start
    snd_close_stop = trader_door_close_stop
    show_tips = false
    

    Jeśli chcemy otworzyć drzwi po otrzymaniu infoportion, nie musimy robić nic więcej, wystarczy przenieść skompilowany plik all.spawn do ścieżki gamedata\spawns\

    Teraz, po wykonaniu zadania oczyszczenia ATP, nasze drzwi się otworzą.

     

    W przypadku z przedmiotem, musisz dodać jego samego i wydanie/oddanie go.

    Otwieramy plik items.ltx w gamedata\config\misc\

    Na końcu piszemy:

    [house_key]:identity_immunities
    GroupControlSection = spawn_group
    discovery_dependency = 
    $spawn = "devices\quest_items\house_key"
    ;$prefetch = 32
    class  = II_ATTCH
    cform = skeleton
    visual = equipments\item_antirad.ogf
    radius = 1
    quest_item = true
    
    description = "Klucz od drzwi w wiosce nowicjuszy"
    
    inv_name = "Klucz"
    inv_name_short = "Klucz"
    inv_grid_width = 2
    inv_grid_height = 1
    inv_grid_x = 18
    inv_grid_y = 8
    inv_weight = 0
    cost = 0
    

    Ustawiamy model - w przykładzie umieszczono jako model antyrad i nóż jako ikonkę przedmiotu.

    Dodajmy teraz klucz jako wyposażenie startowego, które Wilk daje na początku gry.

    W tym celu otwieramy plik escape_dialog.script w gamedata\scripts\

    Szukamy funkcji w pliku:

    function give_weapon_to_actor (trader, actor)
        dialogs.relocate_item_section(trader, "wpn_pm", "in")
        dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in")
        dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in")
        dialogs.relocate_item_section(trader, "wpn_knife", "in")     
    end
    

    Wstawiamy linię przed słowem end, w przeciwnym razie wystąpi wylot.

    Linia, którą chcemy dodać:

    dialogs.relocate_item_section(trader, "house_key", "in")
    

    Zapisujemy i sprawdzamy. Teraz, jeśli zrobiłeś wszystko poprawnie, będziesz miał drzwi w wiosce kotów.

     

    Efekt końcowy:

    Spoiler

    ss_alex__01-30-22_17-52-54_(l01_escape).jpg.b67a3143dfc92622586cfb04e6f13ac4.jpg

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/3265-spavnim-dver-s-pomoshtyu-a-life-soc/

    • Dodatnia 3
  14. NAZWA: System stopniowej regeneracji życia [SoC]
    AUTOR ARTYKUŁU: Fireman3000
    DOPEŁNIŁ: Darkscape
    PODZIĘKOWANIA: Lurk mod, ABC mod
    ARTYKUŁ WZIĘTY Z: stalker inside

     

    OPIS DZIAŁAŃ:

    Spoiler

    KROK 1:

    Spoiler

    Na początek stworzymy skrypt. Np. health_effects.scripts:

    ---System jedzenia i stopniowego leczenia z LURK mod---
    
    objectinuse=0
    objectused=0
    
    --If/then statements for finding the item.
    function start(obj)
    snd = xr_sound.get_safe_sound_object([[$no_sound]])
    if (db.actor~=nil) and (obj~=nil) then
    slotinuse=db.actor:active_slot()
    slot_div=1
    if obj:section() == "medkit" or obj:section() == "medkit_army" or obj:section() == "medkit_scientic" then
    snd= xr_sound.get_safe_sound_object([[interface\inv_medkit]])
    holster_time=time_global()+7000
    if (objectinuse==1) then
    holster_time=holster_time+7000
    end
    soundhub()
    
    elseif obj:section() == "antirad" then
    snd= xr_sound.get_safe_sound_object([[interface\inv_pills]])
    holster_time=time_global()+6000
    if (objectinuse==1) then
    holster_time=holster_time+6000
    end
    soundhub()
    
    elseif obj:section() == "bandage" then
    snd= xr_sound.get_safe_sound_object([[interface\inv_bandage]])
    holster_time=time_global()+6000
    if (objectinuse==1) then
    holster_time=holster_time+6000
    end
    soundhub()
    
    elseif obj:section() == "vodka" then
    snd= xr_sound.get_safe_sound_object([[interface\inv_vodka]])
    holster_time=time_global()+4000
    if (objectinuse==1) then
    holster_time=holster_time+4000
    end
    soundhub()
    
    elseif obj:section() == "energy_drink" then
    snd= xr_sound.get_safe_sound_object([[interface\inv_softdrink]])
    holster_time=time_global()+4000
    if (objectinuse==1) then
    holster_time=holster_time+4000
    end
    soundhub()
    
    elseif obj:section() == "bread" or obj:section() == "conserva" or obj:section() == "kolbasa" then
    snd= xr_sound.get_safe_sound_object([[interface\inv_food]])
    holster_time=time_global()+7000
    if (objectinuse==1) then
    holster_time=holster_time+7000
    end
    soundhub()
    end
    
    end
    end
    
    --Other stuff executes from here.
    function soundhub()
    if db.actor:alive() then
    snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    snd = xr_sound.get_safe_sound_object([[$no_sound]])
    if (objectinuse==0) then
    db.actor:hide_weapon()
    objectinuse=1
    if slotinuse == 1 then
    slot_div = ((holster_time-time_global())/1.5)
    else
    slot_div = 0
    end
    end
    objectused=objectused+1
    weapontimer()
    end
    end
    
    --Holster time. Its set up as additive: A food and a drink taken together will apply instantly, but your gun is holstered for 9 seconds.
    function weapontimer()
    if (holster_time~=nil) and (time_global()>(holster_time-slot_div)) and level.present() then
    objectused=objectused-1
    if (objectused==0) then
    db.actor:restore_weapon()
    objectinuse=0
    holster_time=nil
    end
    end
    end
    
    --Message for time remaining and math.Round function. Not used.
    --[[
    function message()
    news_manager.send_tip(db.actor, tostring(math.Round((holster_time - time_global())/1000)).."s", nil, nil, 1000)
    end
    
    --Math.round
    function math.Round(num)
    local floored = math.floor(num)
    if (num - floored) >= 0.5 then
    return math.ceil(num)
    else
    return floored
    end
    end
    ]]--

    Parametr:

    snd = xr_sound.get_safe_sound_object([[interface\inv_food]])

    jest odpowiedzialny za odtwarzany dźwięk.

     

    KROK 2:

    Spoiler

    Teraz tworzymy skrypt abc_medkit.script:

    -- Shortened Creds: ABC Mod made this, LURK team just cleaned up the indentions.
    
    -- Should the use of the same medkit accumulate over the previous one?
    multiple_medkit = "yes" -- Nie testowano wariantu no. Ale prawie jest pewne, że będzie wylot
    
    -- How many minutes should take to complete the healing process.
    hp_fullhealth_time = 0.125 -- Ilość podczas której zostanie użyta apteczka
    
    --0.25
    
    -- Health update time in MS. 1000 = 1 Second.
    hupd_time = 50 -- Update czasu. Lepiej nie ruszać
    
    -- Time modulation
    time_mod=0
    
    -- HP Healed. No higher than 1.
    hp_med_kit = 0.65 -- Parametr odpowiadający za przywrócenia życia jedną apteczką. Dokładniej za prędkość przywrócenia
    hp_med_army = 0.75
    hp_med_sci = 0.80
    
    -- Is Army faster than Normal?
    army_fast = "yes"
    
    -- Is Science faster than Normal?
    sci_fast = "yes"
    
    -- Is Science faster than Army?
    sci_fast_than_army = "yes"
    
    -- Should medkit_scientic anti-radiation process be progressive?
    sci_antirad = "yes"
    
    -- EOF
    
    local med_kit, med_band, med_army, med_sci, medused, medid, medname
    local objdtc = 0
    function chk_medlot_object(obj)
    if db.actor ~= nil then
    local objdt = time_global()
    if obj ~= nil and obj ~= "load" then
    medname = obj:section()
    if medname == "medkit" or medname == "medkit_army" or medname == "medkit_scientic" then
    if objdtc == 0 then objdtc = time_global() + 350 end
    med_used = "yes"
    med_id = obj:id()
    end
    end
    if med_used == "yes" and objdt > objdtc then
    objdtc = 0
    med_used = "no"
    if level.object_by_id(med_id) == nil then
    if medname == "medkit" then med_kit = "yes" end
    if medname == "medkit_army" then med_army = "yes" end
    if medname == "medkit_scientic" then med_sci = "yes" end
    time_mod=0
    end
    end
    new_medkit()
    end
    end
    
    local time_mkit, time_army, time_sci, count_mkit, count_army, count_sci
    function new_medkit()
    if db.actor ~= nil and level.present() then
    local cgametimemed = time_global()
    local hft = (hp_fullhealth_time * 60000) / hupd_time
    --normal
    if med_kit == "yes" then
    if time_mkit == nil then time_mkit = time_global() + hupd_time end
    if cgametimemed > time_mkit then
    time_mkit = time_global() + hupd_time
    local player_hp = db.actor.health
    if player_hp < 1 then
    if count_mkit == nil then count_mkit = 0 end
    if count_mkit < (hft + 1) then
    db.actor.health = (hp_med_kit/(hft + time_mod))
    count_mkit = count_mkit + 1
    --abort("TimeMod: "..time_mod)
    --abort("Health: "..hp_med_kit/(hft + time_mod))
    time_mod = math.clamp(time_mod+0.23,0,35)
    else
    med_kit = nil
    time_mkit = nil
    count_mkit = nil
    end
    else
    med_kit = nil
    time_mkit = nil
    count_mkit = nil
    end
    end
    end
    --army
    if med_army == "yes" then
    if time_army == nil then time_army = time_global() + hupd_time end
    if cgametimemed > time_army then
    time_army = time_global() + hupd_time
    local player_hp = db.actor.health
    if player_hp < 1 then
    if count_army == nil then count_army = 0 end
    if count_army < (hft + 1) then
    local mamf = 0
    if army_fast == "yes" then mamf = (hp_med_army/hft) / 4 end
    db.actor.health = (hp_med_army/hft) + mamf
    count_army = count_army + 1
    time_mod = math.clamp(time_mod+0.23,0,35)
    else
    med_kit = nil
    time_mkit = nil
    count_mkit = nil
    end
    else
    med_kit = nil
    time_mkit = nil
    count_mkit = nil
    end
    end
    end
    --science
    if med_sci == "yes" then
    if time_sci == nil then time_sci = time_global() + hupd_time end
    if cgametimemed > time_sci then
    time_sci = time_global() + hupd_time
    local player_hp = db.actor.health
    if player_hp < 1 then
    if count_sci == nil then count_sci = 0 end
    if count_sci < (hft + 1) then
    local mamf = 0
    local sfta = 4
    if sci_fast_than_army == "yes" then sfta = 2 end
    if sci_fast == "yes" then mamf = (hp_med_army/hft) / sfta end
    db.actor.health = (hp_med_sci/hft) + mamf
    if sci_antirad == "yes" then db.actor.radiation = -(hp_med_sci/hft) end
    count_sci = count_sci + 1
    time_mod = math.clamp(time_mod+0.23,0,35)
    else
    med_kit = nil
    time_mkit = nil
    count_mkit = nil
    end
    else
    med_kit = nil
    time_mkit = nil
    count_mkit = nil
    end
    end
    end
    end
    end
    
    function math.clamp (value,mini,maxi)
    local clamped = value
    if clamped < mini then clamped = mini end
    if clamped > maxi then clamped = maxi end
    return clamped
    end

     

     

    KROK 3:

    Spoiler

    Leziemy do bind_stalker.script:

    1) Po:

    self.object:set_callback(callback.on_item_drop, nil)

    piszemy:

    self.object:set_callback(callback.use_object, nil)

     

    W efekcie otrzymujemy to:

    Spoiler
    self.object:set_callback(callback.inventory_info, nil)
    self.object:set_callback(callback.article_info, nil)
    self.object:set_callback(callback.on_item_take, nil)
    self.object:set_callback(callback.on_item_drop, nil)
    self.object:set_callback(callback.use_object, nil)
    --self.object:set_callback(callback.actor_sleep, nil)
    self.object:set_callback(callback.task_state, nil)
    self.object:set_callback(callback.level_border_enter, nil)
    self.object:set_callback(callback.level_border_exit, nil)
    self.object:set_callback(callback.take_item_from_box, nil)

     

    2) Po:

    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)

    piszemy:

    self.object:set_callback(callback.use_object, self.use_object, self)

     

    W efekcie otrzymujemy to:

    Spoiler
    self.object:set_callback(callback.inventory_info, self.info_callback, self)
    self.object:set_callback(callback.article_info, self.article_callback, self)
    self.object:set_callback(callback.on_item_take, self.on_item_take, self)
    self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
    self.object:set_callback(callback.use_object, self.use_object, self)
    self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
    --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
    self.object:set_callback(callback.task_state, self.task_callback, self)
    --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
    self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
    self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
    self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

     

    3) Szukamy funkcji:

    function actor_binder:on_item_drop (obj)

    i po jej zakończeniu piszemy:

    ----------------------------------------------------------------------------------------------------------------------
    function actor_binder:use_object(obj)
    heal_regen.start(obj)
    end
    ----------------------------------------------------------------------------------------------------------------------

     

    Efekt:

    ----------------------------------------------------------------------------------------------------------------------
    function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
    abc_medkit.chk_medlot_object(obj)
    abc_sleep.uptabc(obj)
    end
    ----------------------------------------------------------------------------------------------------------------------
    function actor_binder:use_object(obj)
    heal_regen.start(obj)
    end
    ----------------------------------------------------------------------------------------------------------------------

    4) Po:

    --game_stats.update_drop_item (obj, self.object)

    piszemy:

    abc_medkit.chk_medlot_object(obj)

     

    5) Po:

    function actor_binder:update(delta)

    piszemy:

    abc_medkit.chk_medlot_object()
    heal_regen.weapontimer()

    Następnie musisz znaleźć dźwięki i dodać je do katalogu \sounds\interface\

     

    KROK 4:

    Spoiler

    Następnie przechodzimy do pliku config\misc\items.ltx:

    Szukamy sekcji apteczek:

     ([medkit],[medkit_army],[medkit_scientic])

    i zmień w nich parametr eat_health na 0.0, w przeciwnym razie aktor zostanie uleczony dwukrotnie (najpierw od razu, zgodnie ze standardem, a potem stopniowo).

     

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1207-soc-sistema-postepennoy-regeneracii-zhizni/

    • Dodatnia 2
    • Ważne 1
  15. NAZWA: Wyświetlenie zegara na HUD-ie za pomocą innej opcji [SoC]
    AUTOR GŁÓWNEJ LEKCJI: steelrat
    AUTOR POPRAWEK: LaRento
    PODZIĘKOWANIE ZA LEKCJĘ O KLASIE CTIME: malandrius

     

    POTRZEBNE PLIKI:

    Spoiler
    • nowy_skrypt.script
    • bind_stalker.script
    • ui_custom_msgs.xml

     

    OPIS DZIAŁAŃ:

    Spoiler

    1. Stworzenie funkcji wyświetlania znanego już zegara:

    Otwieramy nowy_skrypt.script, który nazwiecie jak zechcecie i piszemy tutaj następujący kod. Funkcja zawiera objaśnienia.

    function add_clock()
    local hud = get_hud() -- ustawiamy lokalną zmienną HUD'a
    local show_time = hud:GetCustomStatic("hud_show_time") -- ustawiamy lokalną zmienną dla wyświetlenia czasu
    local show_date = hud:GetCustomStatic("hud_show_date") -- ustawiamy lokalną zmienną dla wyświetlenia daty
    
    if show_time == nil then
    hud:AddCustomStatic("hud_clock_static", true) -- dodajemy pozycję zegara na HUD'zie
    hud:AddCustomStatic("hud_show_time", true) -- dodajemy wyświetlanie czasu na HUD'zie
    hud:AddCustomStatic("hud_show_date", true) -- dodajemy wyświetlanie daty na HUD'zie
    show_time = hud:GetCustomStatic("hud_show_time") -- otrzymujemy wyświetlenie czasu na HUD'zie
    show_date = hud:GetCustomStatic("hud_show_date") -- otrzymujemy wyświetlenie daty na HUD'zie
    end
    
    local global_time = game.CTime.TimeToMinutes -- ustawiamy lokalną zmienną do klasy CTime, aby dodać czas w postaci godzina/minuta
    local global_date = game.CTime.DateToDay -- przypisujemy lokalną zmienną do klasy CTime, aby dodać datę w postaci dzień/miesiąc/rok
    local msg_time = game.get_game_time():timeToString(global_time) -- lokalna zmienna dla wyświetlenia czasu przez funkcję timeToString w naszej formie
    local msg_date = game.get_game_time():dateToString(global_date) -- lokalna zmienna dla wyświetlenia daty przez funkcję dateToString w naszej formie
    
    if show_time ~= nil then show_time:wnd():SetText(msg_time) -- wyświetlamy czas poprzez lokalną zmienną msg_time
    end
    
    if show_date ~= nil then show_date:wnd():SetText(msg_date) -- wyświetlamy czas poprzez lokalną zmienną msg_date
    end
    end

    Jeśli chcesz, aby twój zegar wyświetlał sekundy, zmień linię:

    local global_time = game.CTime.TimeToMinutes

    na

    local global_time = game.CTime.TimeToSeconds

    Zakończyliśmy pracę ze skryptem.

     

    2. Rejestracja lub stałe wywołanie funkcji:

    Otwieramy bind_stalker.script i przechodzimy do funkcji actor_binder:update(delta), i powiedzmy po linii:

    game_stats.update (delta, self.object)

    piszemy:

    nowy_skrypt.add_clock()

     

    3. Dodanie samego zegarka do HUD'a:

    Otwieramy plik ui_custom_msgs.xml i piszemy następujący kod na końcu pomiędzy tagami <header>:

    <hud_clock_static  x="852" y="17" width="156" height="52">
                    <text complex_mode="0" x="65" y="0" font="letterica16" r="255" g="255" b="255" a="130" align="c"/>
                    <texture>ui_hud_frame_clock</texture>
                </hud_clock_static>
                <hud_show_time x="870" y="45" width="156" height="52">
                    <text x="0" y="0" font="graffiti19" r="255" g="255" b="255" a="140" align="c"/>
                </hud_show_time>
                <hud_show_date x="875" y="17" width="156" height="52">     
    <text x="0" y="0" font="letterica16" r="255" g="255" b="255" a="130" align="c"/>     
    </hud_show_date>

    Możesz też umieścić standardową czcionkę czasu, na przykład jak w timerze.

    Aby to zrobić, użyj tego z zamianą:

    <hud_show_time x="875" y="40" width="156" height="52">
    <text x="0" y="0" font="graffiti32" r="238" g="155" b="23" align="c"/>
    </hud_show_time>

    I to wszystko.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1194-soc-vyvod-drugogo-varianta-chasov-na-hud/

    • Dodatnia 2
  16. NAZWA: Wysyłamy wiadomości GG sposobem twórców modów
    AUTOR: Scouser

     

    Podziękowania dla moddera ColR_iT za pewne poprawki. Istnieje kilka sposobów wysłania wiadomości GG na PDA: poprzez schemat [sr_tip] logiki obiektu Space Restrictor lub poprzez metodę give_game_news. Twórcy wykorzystali jednak funkcję send_tip ze skryptu news_manager. Zatem funkcja spokojnie wysyła wiadomość do PDA głównego bohatera. Należy jednak pamiętać, że jest ona zbudowana na metodzie give_game_news klasy game_object.

     

    OPIS DZIAŁAŃ:

    Spoiler

    1. Przeanalizujmy tą funkcję:

    function name (actor, npc)                     
                            news_manager.send_tip(db.actor, "new_sms_text", 10000, "ecolog", 18000, 902)
    end

    Teraz krok po kroku:

    • name - nazwa funkcji.
    • (actor, npc) - jako argument wskazujemy nadawcę (aktora) i NPC.
    • news_manager.send_tip - link/odsyłacz na funkcję. Kropką oddzielamy skrypt i samą funkcję.
    • db.actor - ustawiamy odbiorcę, czyli aktora.
    • "new_sms_text" - tekst. Można wskazać na zmienną tekstową, która jest przechowywana w obecnym pliku, lub zapisać tekst tutaj.
    • 10000 - czas opóźnienia wysłania wiadomości, po tym jak została wywołana funkcja. (W milisekundach).
    • "ecolog" - nazwa obrazka przy pokazie wiadomości z twarzą postaci (od którego jest wysłana wiadomość). W danym przypadku, obrazek z twarzą, a dokładnie osłoną kombinezonu ekologa. Można wskazać następujące parametry: default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer.
    • 18000 - czas wyświetlania wiadomości na ekranie.
    • 902 - story_id nadawcy. Tzn. że ustawia się ten obiekt, od którego przychodzą wiadomości. Jeśli ten NPC nie żyje lub jest ranny, żadna wiadomość nie zostanie wysłana. Pamiętaj, aby wziąć to pod uwagę. Wiele postaci ma story_id. Są one określone w pliku game_story_ids.ltx. W tym przypadku jest to story_id Sacharowa.

    Na tym kończy się analiza funkcji. Można ją przepisać do dowolnego skryptu, jeśli wywołasz go za pomocą <action>. Jeśli jednak funkcja zostanie wywołana po wejściu do restryktora, to koniecznie należy zapisać tę funkcję w xr_effects.script i podać w logice restryktora jedynie nazwę funkcji.

    2. Dodajemy głos w czasie wysyłania wiadomości:
    Po prostu otwórz plik news_manager.script, i zobaczymy na początku i trochę w dół, wiele odsyłaczy do plików dźwiękowych.

    W naszym przypadku piszemy:

    new_sms_text                  = xr_sound.get_safe_sound_object([[characters_voice\sound]]),
    • new_sms_text - zmienna tekstowa naszej wiadomości. Wskaż DOKŁADNIE ją!
    • xr_sound.get_safe_sound_object - ścieżka do funkcji odtwarzającej dźwięk.
    • ([[character_voice\sound]]) - ścieżka do dźwięku.

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/1192-otsylaem-soobshteniya-glavnomu-geroyu-metodom-razrabotchikov/

    • Dodatnia 2
  17. intro-underground.jpg

    NAZWA: Podziemna lokacja "Obwał" (Завал) [SOC]
    TWÓRCY: insta (GMOD), sparkz (GMOD), Melya

     

    OPIS:

    Spoiler

    Mały korytarz pod ziemią jest częściową adaptacją mapy gm_interprobable z Garry’s Mod. Z grubsza rzecz biorąc, z oryginału pozostała tylko "rama"; mapa została mocno przeprojektowana i była stylizowana na wzór Stalkera. Kości Level Designer są oczywiście dołączone 😃

    Jest to fragment jakiejś podziemnej autostrady wraz z przyległymi pomieszczeniami o nieznanym przeznaczeniu. Miejsce charakteryzuje się anomalnymi "naroślami", zawalonym sufitem w holu głównym oraz porośniętymi winoroślami. Jeśli nie będziemy zwracać uwagi na drobne nierówności, jest to malownicze miejsce.
    Istnieje prymitywna optymalizacja. Kompilacja jest maksymalna. Zestaw zawiera gotowy preset deszczowej pogody dla tej mapy, ale można zainstalować dowolne inne.
    Jest spawn, więc testowanie nie będzie nudne.

    Zrobiono to pod SOC 1.0006, ale możesz ją adaptować gdzie chcesz. Jeśli naprawdę tego potrzebujesz, napisz do autora adaptacji wiadomość prywatną, a wyśle Ci pliki źródłowe))

     
    Adaptował i przerobił – Melya (SOC)

    Autor oryginalnej mapy - insta (GMOD)
    Edytowany przez - sparkz (GMOD)

     

    SCREENY:

    Spoiler

    Album ze screenami: https://ibb.co/album/BcRsPc

    ss-admin-05-25-22-14-16-52-undergroundss-admin-05-25-22-14-16-40-undergroundss-admin-05-25-22-14-13-36-underground

     

    LINKI:

     

    ŹRÓDŁO:

    https://www.amk-team.ru/forum/topic/1503-novye-lokacii/page/11/#comment-1429603

    • Dodatnia 1
  18. NAZWA: Lokacja CEA połączona z podziemiami [COP]
    TWÓRCA: Expropriator

     

    OPIS:

    Spoiler

    Lokacja CEA połączona z podziemiami - 4 w 1 (wersja robocza przy maksymalnej jakości kompilacji). Wykonana z oryginalnych lokacji SOC.

    Są błędy, ale niektóre z nich można ukryć za pomocą modeli dynamicznych, takich jak kamienie. Lokacja ma siatkę AI, trawę i spawn. Spawn należy sprawdzić pod kątem logiki. Plików źródłowych SDK nie udało się przesłać, ponieważ zajmują 25GB. Nie bójcie się 502 tekstur lightmap, teren jest wykonany przy użyciu nowej technologii. Docenisz różnicę, gdy spojrzysz na asfalt z oryginalnym shaderem i glebę z nowym. Twórca chciał całkowicie wyrzucić shader Level, ale kompilator uparł się i trzeba było tworzyć asfalt w domyślny sposób. Na lokacji są sektory i portale, HOM i SOM, cząsteczki, dźwięki, wallmarki, światło statyczne (dla tych, którzy tego potrzebują). Wszystkie tekstury z SOC zostały przekompilowane pod SDK 07. W gamedata musisz wyczyścić (w razie potrzeby) nieużywane pliki ogf.

    Lokacja jest zmontowana jako mod - możesz ją od razu przetestować, uruchamiając ją z pliku bat.

     

    LINKI:

     

    ŹRÓDŁO:

    https://www.amk-team.ru/forum/topic/1503-novye-lokacii/?do=findComment&comment=1083026

  19. NAZWA: Levels.Rebirth: Darkvalley [CS]
    TWÓRCA: Chriotmao

     

    OPIS:

    Spoiler

    Pomysły: monk 
    Instalacja: S.T.A.L.K.E.R. Clear Sky 1.5.*, OGSM CS and Other 
    Jakość kompilacji: Medium
     
    Mod jest odrodzeniem lokacji Dolina Mroku i niesie ze sobą korektę niedociągnięć pierwotnego poziomu, początek kształtowania krajobrazu, a także zawiera różne dodatki, które nie przeszkadzają, ale cieszą oko.
     
    Jedną z cech wartych odnotowania jest to, że podczas instalacji nie będziesz potrzebować nowej gry, a także można zainstalować ten mod nie tylko na czystej grze, ale także na modach, które nie korzystają z lokacji.
     
    Wykorzystuj w swoich projektach wyłącznie za wskazaniem autora.

     

    SCREENY:

    Spoiler

    d9a15d6a26.jpg80377284c5.jpgae531e874c.jpgf30b703744.jpg1a1167b77a.jpg657b7f89f7.jpg

     

    LINKI:

     

    ŹRÓDŁO:

    https://www.amk-team.ru/forum/topic/1503-novye-lokacii/?do=findComment&comment=878471

    https://www.amk-team.ru/forum/topic/1503-novye-lokacii/?do=findComment&comment=1067676

  20. NAZWA: Levels.Rebirth: Escape [CS]
    TWÓRCA: Chriotmao

     

    OPIS:

    Spoiler

    Pomysły: monk 
    Instalacja: S.T.A.L.K.E.R. Clear Sky 1.5.*, OGSM CS and Other 
    Jakość kompilacji: High 
     
    Mod stanowi odrodzenie lokacji Kordon i naprawia niedociągnięcia pierwotnego poziomu, a także zawiera różne dodatki, które nie przeszkadzają, ale cieszą oko.
     
    Jedną z funkcji wartych odnotowania jest to, że podczas instalacji nie będziesz potrzebować nowej gry, a także można zainstalować ten mod nie tylko na czystej grze, ale także na modach, które nie korzystają z lokacji.
     
    Wykorzystywanie w swoich projektach wyłącznie z umieszczeniem autora.

     

    SCREENY:

    Spoiler

    9777895757.jpg1986b518f4.jpg3859edcd8e.jpg3aeceb21ba.jpg

     

    LINKI:

     

    ŹRÓDŁO:

    https://www.amk-team.ru/forum/topic/1503-novye-lokacii/?do=findComment&comment=878249

  21. NAZWA: Lokacja Village z paczki plików źródłowych lokacji [SOC]
    TWÓRCA: Deathman

     

    OPIS:

    Spoiler

    Wzięto ją z udostępnionej paczki plików źródłowych GSC w levels\old\village. Jest wypełniona od zera obiektami z paczki z lat 2005-2009.

    W paczce plików źródłowych zawiera zestaw obiektów z terenu, piwnicy i budynków. 

    Występuje HOM, SOM, SE, Ai mapa. Dodana do gry jest jedyną lokacją. Nie naniesiona na globalną mapę, nie ma muzyki.

    Zalecane użycie - testowanie shaderów, poprawki bin, Ai, skryptów.

     

    WIDEO:

    Spoiler

     

     

    LINKI:

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/3035-lokaciya-village-iz-paka-ishodnikov-lokaciy/

  22. NAZWA: Mroczny Parów z buildu 2571 w grze [SOC]
    TWÓRCA: Deathman

     

    OPIS:

    Spoiler

    Adaptacja Mrocznego Parowu do oryginalnego Cienia Czarnobyla. Lokację wzięto z fixu do buildu 2571, połączona z innymi lokacjami poprzez przejścia. Naniesiona na globalną mapę. Ma spawn. Nie została ponownie skompilowana, ai siatka nie była ponownie tworzona. Dodano przy użyciu xrAI.

     

    WIDEO:

    Spoiler

     

     

    LINKI:

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/3020-temnaya-loshtina-iz-bilda-2571-v-reliznoy-igre/

  23. NAZWA: Lokacja Martwe Miasto od August Kepler [SDK]
    TWÓRCA: August Kepler

     

    OPIS:

    Spoiler

    Dość szczegółowa mapa z ponad 5 milionami wielokątów, a także niestandardowymi zasobami - budynkami, podziemiem. Dodano nowy smart, który trzeba zarejestrować w konfigach, wygenerowano dobrą siatkę AI, także w budynkach, ale nie bez błędów.

     

    SCREENY:

    Spoiler

    0w2hxc9YaJI.jpg?size=1440x839&quality=96a-kQUQ7u3BI.jpg?size=1419x815&quality=9658OSL5a3Ex4.jpg?size=1417x834&quality=96

     

    LINKI:

     

    ŹRÓDŁO:

    https://ap-pro.ru/forums/topic/2527-lokaciya-myortvyy-gorod-ot-august-kepler-sdk/

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

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