-
Postów
4879 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
381
Odpowiedzi opublikowane przez Diegtiariow
-
-
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 = 90level_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 = falseAnaliza:
Spoiler[logic@nazwa_npc]
active = animpoint@nazwa_npc
suitable = {=check_npc_name(nazwa_npc)}true
prior = 90level_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 = falseLOGIKA 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)} nilAnaliza:
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)} nilLOGIKA 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_offAnaliza:
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,100LOGIKA 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_0013LOGIKA 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_descrspawn_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/
- 1
-
NAZWA: Zasoby z niedokończonego moda
AUTOR: st_tyopa (możliwe, że zawartość była skądś użyta)OPIS:
SpoilerPrace 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:
SpoilerLINK DO POBRANIA:
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/5736-narabotki-po-nedodelannomu-modu/
- 3
-
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:
SpoilerOtwieramy 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:
SpoilerWykonujemy 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/
-
NAZWA: Prawidłowa praca z ikonkami
AUTOR: HrustOPIS DZIAŁAŃ:
SpoilerZacznijmy 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.
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.
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).
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:
Do zapisu w PaintDotNet:
SpoilerINNE RZECZY OD AUTORA:
SpoilerAutorskie atlasy ikonek:
- Czyste Niebo: https://cdn.discordapp.com/attachments/742832663349559418/1091254326258831450/ui_icon_equipment.tga
- Zew Prypeci: https://cdn.discordapp.com/attachments/742832663349559418/1091254157928841286/ui_icon_equipment.tga
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/
- 1
- 1
-
NAZWA: Tworzenie ekwipunkowego kompleksu
AUTOR: FantomICWWSTĘP:
SpoilerByć 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):
SpoilerCzęść 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:
SpoilerPrzeanalizujemy 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/
- 2
-
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/
- 1
- 1
-
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Ń:
SpoilerPlik 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:
Następnie z pomocą klawiszy w, s, d, a, przemieszczamy się do potrzebnego punktu:
I zapisujemy gdzieś, te współrzędne:
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/
- 2
- 1
-
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:
SpoilerZawiera 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:
SpoilerUwaga! 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.
LEKCJE W PROGRAMIE LIGHTWAVE 3D:
SpoilerWIDEO I PRACE W LIGHTWAVE 3D:
SpoilerŹRÓDŁO:
- 2
-
NAZWA: Stalker Map Pack volume 1 + Dodatek [SoC]
OPIS:
SpoilerSKŁAD:
SpoilerStalker 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 CzNDodatek 8 (dodatek_8_stalker_1004):
- Zaton
- Wschodnia Prypeć (z ZP)
- Laboratorium X8
- Okolice Jupitera
- Podziemia Jupitera
- Martwe miastoPodziemia Agropromu (cs_undeground_stalker_1004):
- Podziemia Agropromu (z CzN)
Predbannik (predbannik_stalker_1004):
- Odpowiednio predbannikDodatek 9 (build_locations_1004):
- Stary jantar
- Stare wysypisko
- Stare bagnaOraz 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 WarlabuStalker 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:
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://ap-pro.ru/forums/topic/2357-stalker-map-pack-v1-dopolnenie/
- 2
-
NAZWA: Jak stworzyć prostą ścieżkę path_walk?
AUTOR: BadQvikOPIS DZIAŁAŃ:
SpoilerAby 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/
- 1
-
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:
SpoilerStworzymy 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:
SpoilerDzisiaj 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/
- 2
- 1
-
NAZWA: Spawnujemy drzwi z pomocą A-Life [SoC]
AUTOR: MatrixTemat 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Ń:
SpoilerDla 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:
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/3265-spavnim-dver-s-pomoshtyu-a-life-soc/
- 3
-
NAZWA: System stopniowej regeneracji życia [SoC]
AUTOR ARTYKUŁU: Fireman3000
DOPEŁNIŁ: Darkscape
PODZIĘKOWANIA: Lurk mod, ABC mod
ARTYKUŁ WZIĘTY Z: stalker insideOPIS DZIAŁAŃ:
SpoilerKROK 1:
SpoilerNa 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:
SpoilerTeraz 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:
SpoilerLeziemy 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:
Spoilerself.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:
Spoilerself.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:
SpoilerNastę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/
- 2
- 1
-
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: malandriusPOTRZEBNE PLIKI:
Spoiler- nowy_skrypt.script
- bind_stalker.script
- ui_custom_msgs.xml
OPIS DZIAŁAŃ:
Spoiler1. 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/
- 2
-
NAZWA: Wysyłamy wiadomości GG sposobem twórców modów
AUTOR: ScouserPodzię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Ń:
Spoiler1. 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/
- 2
-
@Marek 25 Zapewne nazwa tej strony, która jest w nazwie archiwum. To znaczy zaczynająca się od stalker a kończąca się na su.
- 1
- 1
-
NAZWA: Podziemna lokacja "Obwał" (Завал) [SOC]
TWÓRCY: insta (GMOD), sparkz (GMOD), MelyaOPIS:
SpoilerMał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:
SpoilerAlbum ze screenami: https://ibb.co/album/BcRsPc
LINKI:
ŹRÓDŁO:
https://www.amk-team.ru/forum/topic/1503-novye-lokacii/page/11/#comment-1429603
- 1
-
NAZWA: Lokacja CEA połączona z podziemiami [COP]
TWÓRCA: ExpropriatorOPIS:
SpoilerLokacja 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
-
NAZWA: Levels.Rebirth: Darkvalley [CS]
TWÓRCA: ChriotmaoOPIS:
SpoilerPomysł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:
SpoilerLINKI:
Ź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
-
NAZWA: Levels.Rebirth: Escape [CS]
TWÓRCA: ChriotmaoOPIS:
SpoilerPomysł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:
SpoilerLINKI:
ŹRÓDŁO:
https://www.amk-team.ru/forum/topic/1503-novye-lokacii/?do=findComment&comment=878249
-
NAZWA: Lokacja Village z paczki plików źródłowych lokacji [SOC]
TWÓRCA: DeathmanOPIS:
SpoilerWzię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:
SpoilerLINKI:
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/3035-lokaciya-village-iz-paka-ishodnikov-lokaciy/
-
NAZWA: Mroczny Parów z buildu 2571 w grze [SOC]
TWÓRCA: DeathmanOPIS:
SpoilerAdaptacja 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:
SpoilerLINKI:
Spoilerhttps://disk.yandex.ru/d/V7JDSDzW64bhrQ
zoptymalizowany bin dla prawidłowej pracy https://disk.yandex.ru/d/gFdRhIge8I2hcQ
fix dla x0.0006: https://disk.yandex.ru/d/Q1Rylb4oufR3rg
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/3020-temnaya-loshtina-iz-bilda-2571-v-reliznoy-igre/
-
NAZWA: Lokacja Martwe Miasto od August Kepler [SDK]
TWÓRCA: August KeplerOPIS:
SpoilerDość 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:
SpoilerLINKI:
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/2527-lokaciya-myortvyy-gorod-ot-august-kepler-sdk/
-
NAZWA: Wydajemy quest GG po wejściu do określonej strefy
AUTOR: LaRentoWSTĘP:
SpoilerCzęsto gracze chcą wydać misję lub ukończyć swoje mini-zadania, lub nawet siebie po wejściu do jakiegoś miejsca. Ale niewiele osób wie o czymś takim jak Space Restryktor. Jest to specyficzny obiekt, który po wejściu do strefy wydaje infoportion, wywołuje funkcje ze skryptów. Można to zrobić również z opóźnieniem czasowym.
OPIS DZIAŁAŃ:
Spoiler1. Rozpakowujemy all.spawn i otwieramy alife_lokacja.ltx. Zapisujemy tam następującą sekcję Space Restryktora:
[20000] ; numer sekcji ; cse_abstract properties section_name = space_restrictor ; typ sekcji spawnu - space restryktor name = quest_start ; nazwa sekcji position = 27.9391098022461,-11.7167835235596,-288.380462646484 ; współrzędne miejsce, gdzie zostanie wydany quest direction = -0.000350999995134771,-0.0109850000590086,0.0319279991090298 ; cse_alife_object properties game_vertex_id = 1229 ; game vertex tego miejsca distance = 0 level_vertex_id = 72763 ; level vertex tego miejsca object_flags = 0xffffff3e custom_data = <<END [logic] ; logika(można określić bezpośrednio w sekcji) active = sr_idle@one ; wskazanie aktywnej logiki [sr_idle@one] ; ta logika on_actor_inside = nil %+quest_start% ; wydanie infoportion początku questu po wejściu do strefy (tutaj nil oznacza, że infoportion zostanie wydany jeden raz) END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 36.9949264526367 ; zasięg strefy ; cse_alife_space_restrictor properties restrictor_type = 3
2. Otwieramy info_lokacja.xml i piszemy:
<info_portion id="quest_start"> ; infoportion dla restryktora <task>yan_help_quest</task>; nazwa zadania, które zostanie wydane </info_portion>
W restryktorze można określić dowolny portion: początek zadania, zakończenie podzadania, zakończenie samego zadania.
Wydanie zadania z opóźnieniem czasowym:
Aby to zrobić wystarczy zmienić logikę:
[logic] ; logika(można wskazywać od razu w sekcji) active = sr_idle@one ; wskazanie aktywnej logiki [sr_idle@one] ; ta logika on_actor_inside = sr_idle@two ; kiedy GG w zonie, logika zmienia się na sr_idle@two [sr_idle@two] on_timer = 10000 | nil %+quest_start% ; po 10 sekundach (10000 - milisekundy) zostanie wydany nasz infoportion
Wywołujemy funkcję:
Warto zmienić logikę i wpisać waszą funkcję w xr_effects.script:
1. Otwieramy ten skrypt i piszemy swoją funkcję.
2. Zmieniamy logikę:[logic] ; logika(można wskazywać od razu w sekcji) active = sr_idle@one ; wskazanie aktywnej logiki [sr_idle@one] ; ta logika on_actor_inside = nil %=nazwa_funkcji%
Odtwarzanie dźwięku:
To samo tyczy się logiki:
[logic] ; logika(można wskazywać od razu w sekcji) active = sr_idle@one ; wskazanie aktywnej logiki [sr_idle@one] ; ta logika on_actor_inside = nil %=play_snd(np. character_voice\dźwięk.ogg)% ; wskazujemy folder w folderze sounds a później sam dźwięk
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1191-dayom-kvest-gg-pri-vhode-v-opredelyonnuyu-zonu/
- 2
Dollchan 8: Infinity
w Dollchan
Opublikowano
@Sabre3PL Jest też Dollchan 6.4, ale to bardziej paczka dodatków do Call of Chernobyl. Informacje o tym stąd: https://vk.com/dollchanmod?w=club59616216
A tutaj linki do wersji 6.4: https://vk.com/topic-59616216_35903453