-
Postów
4879 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
381
Odpowiedzi opublikowane przez Diegtiariow
-
-
TUTORIAL #1 - TWORZENIE KUBKA:
SpoilerTUTORIAL #2 - TWORZENIE DROGI:
SpoilerTUTORIAL #3 - TWORZENIE PĄCZKA:
Spoiler- 3
-
@LisKot Na AMK w "Справочник вылетов" taki znalazłem opis wylotu:
CytatExpression : no_assert Function : CXML_IdToIndex<class CCharacterInfo>::GetById File : e:\stalker\patch_1_0004\xr_3da\xrgame\xml_str_id_loader.h Line : 112 Description : item not found, id Arguments : amk_artem_kulinar
Przyczyna: Gra nie znajduje id jakiegoś profilu... lub dialogu... lub zadania. Wskazany id jest w pliku .xml.
Leczenie: Sprawdźcie czy nazwa identyfikatora jest prawidłowa lub dodajcie ją jeśli jej nie ma.Podobny problem też był tutaj: https://otvet.mail.ru/question/211854026
I problemem jest przedmiot - albo nieprawidłowo ukazany, albo infoportion w skrypcie jest zepsuty. I jako leczenie wylotu trzeba sprawdzić, czy id nie ma spacji/został nie prawidłowo napisany.
- 1
-
11 godzin temu, LisKot napisał(a):
W jaki sposób odebrać zamówienie?
Jeśli się nie mylę, to w asortymencie podczas handlowania będzie ten przedmiot. A gdy wybierzemy ponownie pierwszą opcję dialogową, to będzie można zmienić zamówiony towar (oczywiście uiszczając drobną opłatę za zmianę towaru).
- 1
-
"Wiedziałem, że zostanę zdemaskowany":
Kiedy włączasz pierwszą wersję Czystego Nieba:
Spoiler50 wariantów Szramy:
Spoiler- 2
-
Na Youtube na kanale PIONER pojawiło się wydarzenie, które odbędzie się jutro (01.07) o 12:00 :
- 1
-
Devblog #2:
- 2
-
@Szeregowy Killer Georadar w podstawowej wersji po podejściu do określonego obszaru sam się aktywuje i pojawia się znacznik na minimapie, gdzie znajduje się ładunek
- 1
-
@wrobel891 W komentarzach pod wideo, autor kanału na YT napisał, że używał tego materiału - "Вспененный пвх 3мм" (Spieniony PCV 3mm).
- 1
-
NAZWA: Lekcje i przydatne funkcje od Panzyuza
AUTOR: PanzyuzaIstnieją proste funkcje, które pomogą w moddingu. Coś na początek.
OPIS:
SpoilerWielu napotkało potrzebę zdobycia portion podczas przeszukiwania zwłok NPC lub mutanta o unikalnej nazwie. Ci, którzy coś robią z all.spawn, po prostu korzystają ze standardu gry, dodając do logicznego schematu w spawnie:
[know_info] infoportion
Ale dlaczego tylko infoportion? Po co pisać jeszcze kody dla wyłowienia infoportions podczas przeszukiwania? Jest na to prosty i niezawodny sposób.
Musisz otworzyć skrypt xr_motivator.script za pomocą notatnika i znaleźć tam następujący kod:
function motivator_binder:use_callback(obj, who) if self.object:alive() then xr_use.notify_on_use(obj, who) if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who) end else --//выдача дефолтных тайников treasure_manager.get_treasure_manager():use(self.object) end end
Po linii treasure_manager.get_treasure_manager():use(self.object) wstawiamy nazwa_skryptu.dead_use(victim, who).
Powinno to wyglądać mniej więcej tak:
function motivator_binder:use_callback(obj, who) if self.object:alive() then xr_use.notify_on_use(obj, who) if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who) end else --//выдача дефолтных тайников treasure_manager.get_treasure_manager():use(self.object) mod.dead_use(victim, who) end end
Tak więc, jeśli gracz po śmierci NPC go przeszuka, to oprócz wydania schowka, zostanie wywołany jego własny skrypt.
Tworzymy skrypt i wklejamy następujący kod:
---------------------------------------------------------------------------------------------------- -- Funkcja przeszukiwania trupów NPC -- W motivatorze, use callback wstawić nazwa_skryptu.dead_use(obj, who) ---------------------------------------------------------------------------------------------------- function dead_use(victim, who) if not (victim and who) then return end --/>fix local name = victim:name() if victim and who and who:id() == db.actor:id() then if string.find(name, "bandit_resp_veteran_dead_bor") then --nazwa NPC db.actor:give_info_portion("PORTION") --lub wywołanie skryptowych funkcji elseif string.find(name, "esc_lager_volk") then --przeszukanie db.actor:give_info_portion("PORTION") return false --powtórnego wydania nie będzie else return true end end end
Musisz jedynie znać nazwę NPC, która jest mu nadawana podczas spawnowania. Przykład. Jeśli stworzyłeś NPC i przypisałeś mu sekcję w spawn_sections, to jego nazwa będzie nazwą sekcji, którą ustawiłeś podczas spawnowania.
To samo możesz zrobić z mutantami. Ale jest trudniej. Musisz w binderze mutantów dodać use_callback i podobnie z binderem NPC.
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1184-uroki-i-poleznye-funkcii-ot-panzyuza/
-
NAZWA: Ekwipunek i jego funkcje [SoC]
AUTOR: ?ROZMIESZCZENIE PRZEDMIOTÓW W EKWIPUNKU, JEDEN PO DRUGIM, JAK W BUILDACH:
SpoilerOtwórz za pomocą Notatnika lub innego edytora tekstu plik inventory_new.xml w gamedata\config\ui.
Znajdziemy w tym pliku taką strukturę:
<dragdrop_bag x="22" y="33" width="310" height="442" cell_width = "41" cell_height="41" rows_num="10" cols_num="7" unlimited="1" group_similar="1"/>
Jest to ustawienie komórek głównego plecaka w ekwipunku bohatera. Oznacza to całkowitą przestrzeń ekwipunku (plecaka).
Znajdźmy tę samą linię w tej konstrukcji:
unlimited="1" group_similar="1"/>
Teraz w linii group_similar="1" zmieniamy wartość "1" na "0".
To samo robimy w podobnym pliku inventory_new_16.xml w gamedata\config\ui. Jest to plik odpowiedzialny za ustawienie interfejsów ekwipunku na prostokątnym ekranie (16:9).
Teraz szukamy innego pliku, aby przypisać grupowanie przedmiotów jeden po drugim w oknach handlu (plecak GG, plecak handlarza\NPC oraz okna sprzedaży i zakupu.
Szukamy pliku o nazwie trade.xml w tym samym katalogu.
Tam znajdujemy następujące struktury:
<dragdrop_list x="29" y="37" width="266" height="410" cell_width = "41" cell_height="41" rows_num="10" cols_num="6" group_similar="1" unlimited="1"/>
<dragdrop_list x="18" y="35" width="262" height="410" cell_width = "41" cell_height="41" rows_num="10" cols_num="6" group_similar="1" unlimited="1"/>
Pierwsze dwie konstrukcje odpowiadają za okno asortymentu gracza i okno asortymentu kupca\NPC.
<dragdrop_list x="31" y="37" width="303" height="164" cell_width = "41" cell_height="41" rows_num="4" cols_num="7" group_similar="1" unlimited="1"/>
<dragdrop_list x="31" y="37" width="303" height="164" cell_width = "41" cell_height="41" rows_num="4" cols_num="7" group_similar="1" unlimited="1"/>
Dwie ostatnie struktury odpowiadają za ustawienie okien sprzedaży i kupna.
Teraz we wszystkich tych konstrukcjach należy zmienić linię group_similar="1" na group_similar="0".
To samo należy zrobić w pliku trade_16.xml dla szerokoformatowych monitorów. Wszystko jest tam takie samo.
No cóż, żeby wszystko było jak w buildzie i przy przeszukiwaniu zwłok i schowków musimy ustawić 0 zamiast jedynki we wszystkich liniach group_similar="1" w pliku carbody_new.xml i jego kopii dla monitorów prostokątnych carbody_new_16.xml.
Teraz elementy są grupowane jeden po drugim w całym graficznym inwentarzu.
Jak to więc wyglądało na przykład w buildzie 1842?
Jak to wyglądało w handlu w buildzie 2205-2215?
SpoilerJak to wyglądało w ekwipunku GG w buildach 2205-2232?
Jak wyglądało przeszukiwanie zwłok w buildach 2232 i 2205?
Tak to wygląda finalnie ze starym inwentarzem
*Stary ekwipunek można pobrać oddzielnie z forum AMK (temat Сброс Инвенторя). Jest także w Shadows Add-on, Phantoms Zone, Paradise lost, KV38 addon, Альфа Обливион мод 1.0 демо, Priboi story (opcjonalnie).
OGÓLNA POPRAWKA EKWIPUNKU. PODSTAWY:
Spoiler*Artykuł został zaczerpnięty ze strony Stalker-Inside.
Do pracy nad interfejsem ekwipunku potrzebne są następujące pliki:
- ui_inventory.dds i ui_inventory2.dds (folder textures\ui\)
- inventory_new.xml dla normalnych ekranów lub inventory_new_16.xml dla ekranów 16:9 (znajduje się w gamedata\config\ui\).
Uwaga: <!--text--> - to są komentarze w plikach xml.
Dowolny plik opisujący interfejs gry (nie licząc plików skryptowych) zaczyna się od następujących linii:
<?xml version='1.0' encoding="UTF-8"?> <w>
i kończy się:
</w>
Tekstura slotów inwentarza:
<properties_box> <texture>ui_cb_listbox</texture> <!--tekstura inwentarza--> … </properties_box>
Tekstura pasu:
<belt_slots x="0" y="80" width="1024" height="172"> <!--х, у – współrzędne tekstury na ekranie, width – szerokość, height - wysokość--> <texture>ui_slots_belt</texture> <!--tekstura--> </belt_slots>
<main x=0 y=0 width=1024 height=768> <!--punkt odniesienia tekstury, jej rozmiar (rozdzielczość ekranu)-->
Tekstura plecaka, ikonki aktorów, opisy przedmiotów:
<back x="10" y="243" width="1005" height="483"> <!--punkt odniesienia tekstury, rozmiar, х, у – współrzędne tekstury na ekranie, width – szerokość, height - wysokość--> <texture>ui_inventory_main</texture> <!--tekstura--> </back> Dalej podobnie, zmieniają się nazwy tekstur i współrzędne.
Parametry slotów:
- Plecak
<dragdrop_bag x="22" y="33" width="310" height="442" <!--punkt początkowy, rozmiar, x, y - współrzędne na ekranie, width - szerokość, height - wysokość w plecaku--> cell_width = "41" cell_height="41" rows_num="10" cols_num="7" <!--szerokość i wysokość komórki, rows_num - liczba wierszy, cols - liczba kolumn--> unlimited="1" group_similar="1"/> <!--nie analizowane--> Uwaga: jeśli trzeba zwiększyć lub zmniejszyć ilość wierszy i kolumn, to zmieniamy parametr cell_width = "41" cell_height="41" rows_num="10" cols_num="7" na potrzebne, dalej potrzebna jest liczba cell_width * cols_num = width - zapisujemy otrzymaną wartość, najlepiej, aby wlazło w tekstury slotu plecaka. Do wylotu nie prowadzi, ale jeśli jest więcej lub mniej wygląda niezbyt ładnie. Wartości autora: <dragdrop_bag x="22" y="33" width="290" height="420"cell_width = "35" cell_height="35" rows_num="12" cols_num="8" unlimited="1" group_similar="1"/>
- Pas
<dragdrop_belt x="645" y="136" width="410" height="60" cell_width = "60" cell_height="60" rows_num="1" cols_num="5" />
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1316-soc-inventar-i-ego-osobennosti/
-
NAZWA: Lekcja odnośnie tworzenia punktu respawn dla mutantów [SoC]
AUTOR: ins33Od twórcy: "Prędzej czy później każdy modder zastanawia się nad respawnem. Pierwsze próby stworzenia respawnera zakończyły się częściowym sukcesem. O pechu przeczytasz na końcu. Męcząc respawnera przez kilka dni, odłożyłem tę lekcję na najdalszą półkę. I nadszedł czas, ale tym razem musiałem zespawnować mutanty. I okazało się to dużo łatwiejsze!"
NIEZBĘDNE OPERACJE:
SpoilerNajpierw stwórzmy smarta, z jedną pracą:
Tworzymy pliki alife_l01_escape_test.ltx i way_l01_escape_test.ltx w folderze ACDC\all. Zrobimy to dla wygody, przy pakowaniu wszystko dodane będzie w plikach lokacji.
W acdc\all\all.ltx dodajemy pliki alife_l01_escape_test.ltx i way_l01_escape_test.ltx.
Dodajemy smarta do alife_l01_escape_test.ltx:
[number] ; cse_abstract properties section_name = smart_terrain name = esc_boar_weak_smart ; nazwa smartu position = -132.06704711914,-3.5775165557861,-79.952697753906 ; X,Y,Z direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 72 ; GV distance = 3 level_vertex_id = 119229 ; LV object_flags = 0xffffff3e custom_data = <<END [smart_terrain] type = esc_boar_weak_smart ; nazwa smartu cond = 100 ; warunki istnienia smartu. {+info –info ! function =function} capacity = 3 ; pojemność smartu END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_smart_terrain properties
Stworzyliśmy smart terrain, dodajmy moba dla tego smarta:
[number] ; cse_abstract properties section_name = boar_weak name = esc_boar_weak_test_0000 position = -126.9560546875,-4.6784887313843,-95.063812255859 direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 72 distance = 3 level_vertex_id = 125542 object_flags = 0xffffffbf custom_data = <<END [smart_terrains] esc_boar_weak_smart = true ; wskazujemy do jakiego smartu należy to zwierzę. END ; cse_visual properties visual_name = monsters\mutant_boar\mutant_boar ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 2 dynamic_out_restrictions = dynamic_in_restrictions = ; cse_alife_monster_abstract properties ; cse_ph_skeleton properties ; cse_alife_monster_base properties ; se_monster properties upd:health = 2 upd:timestamp = 0 upd:creature_flags = 0 upd:position = -126.9560546875,-4.6784887313843,-95.063812255859 upd:o_torso = 0,0,0
Zwierze dodane, dodajmy ścieżki.
Otwieramy way_l01_escape_test.ltx:
[esc_boar_weak_smart_home] points = p0 p0:name = wp00 p0:position = -123.97886657715,-4.0969734191895,-92.151412963867 p0:game_vertex_id = 72 p0:level_vertex_id = 128790
Uwaga! Nazwa punktu ścieżki zaczyna się od nazwy smarta!
Teraz musimy stworzyć logikę i warunki pracy. Dlatego tworzymy gamedata\config\misc\gulag_escape_test.ltx.
W gulag_task.ltx rejestrujemy nowy gułag #include "gulag_escape_test.ltx" i piszemy prostą logikę w gulag_escape_test.ltx:
[logic@esc_boar_weak_smart_0000] active = mob_home@esc_boar_weak_smart_0000 [mob_home@esc_boar_weak_smart_0000] path_home = home ; WSKAZUJEMY NAZWĘ ŚCIEŻKI, BEZ NAZWY SMARTA!!! esc_boar_weak_smart_home home_min_radius = 20 home_max_radius = 30
Napisaliśmy logikę, teraz dodamy warunek.
Tworzymy skrypt gulag_escape_test.script, rejestrujemy go w xr_gulag.script dodając do level_gulags = {*, gulag_escape_test}.
W gulag_escape_test.script zapisujemy:
local t = {} function load_job(sj, gname, type, squad, groups) --'-------------------------------------------------------------------------- --' ESCAPE --'-------------------------------------------------------------------------- --' Кабаны не далеко от вагончика if type == "esc_boar_weak_smart" then t = { section = "logic@esc_boar_weak_smart_0000", idle = 0, prior = 5, state = {0}, in_rest = "", out_rest = "" } table.insert(sj, t) end end function load_states(gname, type) if type == "esc_boar_weak_smart" then return function(gulag) return 0 end end end function load_ltx(gname, type) return nil end function checkStalker(npc_community, gulag_type, npc_rank, se_obj) end function checkMonster(npc_community, gulag_type) if gulag_type == "esc_boar_weak_smart" then return npc_community == "boar" end return false end
Zrobione. Teraz mamy smarta z jednym zwierzątkiem. Sprawdźmy, czy nasz smart działa. Uruchamiamy grę i przejchodzimy do wagonika znajdującego się obok rannego. Spotkaliśmy dzika, dodamy teraz respawner.
W alife_l01_escape_test.ltx dodajemy:
[number] ; cse_abstract properties section_name = respawn name = esc_boar_weak_respawner ; nazwa respawnera position = -146.0726776123,-3.4645113945007,-73.943954467773 direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 70 level_vertex_id = 104106 object_flags = 0xffffff3e custom_data = <<END [respawn] respawn_section = boar_weak ; sekcje respawnu max_spawn = 1 ; Maks ilość mobów w przeciągu jednego respawnu. idle_spawn = often ; rodzaj respawnera, odnosi się do prędkości zadziałania. END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 3.35619974136353 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_respawn properties
Respawner zrobiony. Byłoby wspaniale nie czekać, aż samo zadziała, ale sprawić, by zadziałało, kiedy tego potrzebujemy. Dlatego zrobimy spacerestryktor.
W pobliżu wejścia do bunkra Sidorowicza, który wywoła respawner:
[number] ; cse_abstract properties section_name = space_restrictor name = esc_boar_weak_restrictor position = -250.60289001465,-19.588600158691,-127.29279327393 direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 8 level_vertex_id = 9843 object_flags = 0xffffff3e custom_data = <<END [logic] active = sr_idle@esc_boar_weak_restrictor_start [sr_idle@esc_boar_weak_restrictor_start] on_actor_inside = {=gulag_empty(esc_boar_weak_smart)} sr_idle@esc_boar_weak_restrictor_out %=respawner_spawn(esc_boar_weak_respawner)% ; ф-ия =gulag_empty(name_smart) sprawdza czy to smart. ; ф-ия =respawner_spawn(name_smart) wywołuje wymuszony respawn [sr_idle@esc_boar_weak_restrictor_out] on_actor_outside = sr_idle@esc_boar_weak_restrictor_start END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 3.35619974136353 ; cse_alife_space_restrictor properties restrictor_type = 3
Zbieramy all.spawn, uruchamiamy nową grę, zabijamy dzika, wracamy do wejścia do bunkra, schodzimy po schodach i wracamy do smartu dzika.
Gratulacje, udało się zrobić respawner!
PRACA DOMOWA:
SpoilerZrobić smarta dla 3 dzików i respawner dla tego smarta. Zespawnować 3 NPC-ów pod mostem, obok wagonu.
Współrzędne:
character_profile = sim_stalker_master position = -35.753692626953,-10.425220489502,-72.881172180176 direction = 0,0,0 game_vertex_id = 111 distance = 3 level_vertex_id = 242232
character_profile = sim_stalker_veteran position = -41.189788818359,-10.432260513306,-77.327095031738 direction = 0,0,0 game_vertex_id = 77 distance = 3 level_vertex_id = 237361
character_profile = sim_stalker_master position = -41.189788818359,-10.432260513306,-77.327095031738 direction = 0,0,0 game_vertex_id = 77 distance = 3 level_vertex_id = 237361
Stworzyć dla tych NPC trzy logiki walker. Nazwy ścieżek, biorąc pod uwagę fakt, że później te NPC będą pod smartem.
Powtarzam: N.B.! Nazwa punktu ścieżki musi zaczynać się od nazwy smarta!!!
Współrzędne:
way_1
position = -48.911376953125,-10.037826538086,-66.358123779297 game_vertex_id = 77 level_vertex_id = 230506
look_1
position = -47.987903594971,-10.038272857666,-63.149391174316 game_vertex_id = 77 level_vertex_id = 231168
way_2
position = -47.224723815918,-10.038061141968,-65.55248260498 game_vertex_id = 77 level_vertex_id = 232424
look_2
position = -47.987903594971,-10.038272857666,-63.149391174316 game_vertex_id = 77 level_vertex_id = 231168
way_3
position = -47.224723815918,-10.038061141968,-65.55248260498 game_vertex_id = 77 level_vertex_id = 232424
look_3
position = -50.319923400879,-10.042634963989,-63.688987731934 game_vertex_id = 77 level_vertex_id = 229168
I trzy kmap współrzędne:
way_1_task
position = -48.911376953125,-10.037826538086,-66.358123779297 game_vertex_id = 77 level_vertex_id = 230506
way_1_fire
position = -48.808933258057,-10.04080581665,-63.063709259033 game_vertex_id = 77 level_vertex_id = 230516
way_2_task
position = -47.224723815918,-10.038061141968,-65.55248260498 game_vertex_id = 77 level_vertex_id = 232424
way_2_fire
position = -48.808933258057,-10.04080581665,-63.063709259033 game_vertex_id = 77 level_vertex_id = 230516
way_3_task
position = -47.224723815918,-10.038061141968,-65.55248260498 p0:game_vertex_id = 77 p0:level_vertex_id = 232424
way_3_fire
position = -48.808933258057,-10.04080581665,-63.063709259033 game_vertex_id = 77 level_vertex_id = 230516
Przetestuj działanie logiki na stworzonych NPC-ach.
way_*_task — miejsce, gdzie usiądzie NPC. Działa tylko pod smartem.
way_*_fire — tam, gdzie będzie się patrzył.Używa się tego, jeśli NPC siadają wokoło ogniska.
JEŚLI POD OGNISKIEM NIE MA SIATKI AI, WTEDY NIE MOŻNA USTAWIĆ TAM WAYPOINTU!
W przykładzie pod ogniskiem nie ma SI, więc wszystkie fire są zespawnowane obok ogniska.
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1204-soc-urok-po-sozdaniyu-respawn-monstrov/
-
NAZWA: Wyświetlenie współrzędnych GG [SoC]
AUTOR: marlock08 (ARTYKUŁ), Alex KireevNIEZBĘDNE PLIKI:
Spoiler- scripts/bind_stalker.script
- config/ui/ui_custom_msgs.xml
OPERACJE NA PLIKACH:
Spoiler1. Otwieramy plik bind_stalker.script, szukamy linijki object_binder.update(self, delta) i dopisujemy:
function actor_binder:update(delta) object_binder.update(self, delta) posihion.posihion_mod()
Linię posihion.posihion_mod() można napisać na końcu tej funkcji, po self.bCheckStart = false end, pomiędzy dwoma end
Jak to wygląda:
Spoilerlevel_tasks.add_lchanger_location() self.bCheckStart = false end posihion.posihion_mod() end
2. Otwieramy plik ui_custom_msgs.xml i na początku po <header> dodajemy:
<header> <cs_debug x="450" y="80" width="600" height="100" complex_mode="1"> <text font="graffiti22" r="240" g="217" b="182" a="255" align="l"/> </cs_debug>
Tutaj możesz zmienić pozycję wyświetlanego tekstu.
Początkowo tekst jest wyświetlany na środku ekranu, ale aby zmienić miejsce tekstu, wystarczy zmienić wartości x i y.
Początek znajduje się w lewym górnym rogu ekranu. Oś "X" jest pozioma i skierowana od lewej do prawej. Oś "Y" jest pionowa i skierowana z góry na dół.3. Pozostało napisać sam skrypt
W folderze gamedata/scripts utwórz plik posihion.script i dodaj do niego następujące linie:
Spoiler------------------------------------- Wyświetlenie informacji level_vertex_id, game_vertex_id, pos function posihion_mod() local hud = get_hud() local cs = hud:GetCustomStatic("cs_debug" ) if cs == nil then hud:AddCustomStatic("cs_debug", true) cs = hud:GetCustomStatic("cs_debug" ) end local lvid, gvid = db.actor:level_vertex_id(), db.actor:game_vertex_id() -- Przypisujemy wartość level i game vertex local pos, dir = db.actor: position(), db.actor:direction() -- Przypisujemy pozycję gracza i kierunek patrzenia local pos2 = level.vertex_position(lvid) local valid = pos2:distance_to(pos) <= 0.7 local msg = string.format("lvid: %d\\n", lvid) .. -- Level vertex string.format("gvid: %d\\n", gvid) .. -- Game vertex string.format("pos: %.2f,%.2f,%.2f\\n", pos.x, pos.y, pos.z) .. -- Współrzędne GG, zaokrąglone do 2 miejsc po przecinku -- string.format("dir: %f,%f,%f\\n", dir.x, dir.y, dir.z) .. -- Kierunek patrzenia, ZAKOMENTOWANE string.format("valid: %s", tostring(valid)) -- Pozycja GG, na ziemi, w powietrzu lub na obiekcie if cs ~= nil then cs:wnd():SetText(msg) -- Wyświetlenie end end
PRZYCISK DLA WYGODY:
Spoilerfunction on_key_press(dik) if (dik == DIK_keys.DIK_RCONTROL) then posihion_mod() end end function on_game_start() RegisterScriptCallback("on_key_press",on_key_press) end
INNE WAŻNE INFORMACJE:
SpoilerWażne, po przekazaniu argumentów do stringa, jeśli nie jest to ostatnia linia, należy postawić dwie kropki:
string.format("dir: %f,%f,%f\\n", dir.x, dir.y, dir.z) .. -- To nie jest ostatnia linijka, KROPKI TRZEBA DODAĆ string.format("valid: %s", tostring(valid)) -- To jest ostatnia linijka, KROPEK NIE TRZEBA DODAWAĆ if cs ~= nil then
Lista dodatkowych opcji, które można wyświetlić:
string.format("bleeding: %f\\n",db.actor.bleeding).. -- Utrata krwi string.format("satiety: %f\\n",db.actor.satiety).. -- Sytość string.format("section: %s\\n",db.actor:section()).. -- Sekcja, dział??? string.format("name: %s\\n",db.actor:name()).. -- Nazwa??? string.format("health: %.2f\\n", db.actor.health).. -- Zdrowie string.format("morale: %.2f\\n", db.actor.morale).. -- Morale, reputacja??? string.format("power: %.2f\\n", db.actor.power).. -- Wytrzymałość string.format("psy_health: %.2f\\n", db.actor.psy_health).. -- Psi-oddziaływanie??? string.format("radiation: %.2f\\n", db.actor.radiation).. -- Radiacja
Nie wszystko może działać.
SKRYPT WYŚWIETLANIA NA EKRANIE WSPÓŁRZĘDNYCH GG, PASKA ZDROWIA I PANCERZA:
SpoilerSkrypt wyświetlania na ekranie współrzędnych GG, paska zdrowia i pancerza:
function posihion_mod() local hud = get_hud() local cs = hud:GetCustomStatic("cs_debug" ) if cs == nil then hud:AddCustomStatic("cs_debug", true) cs = hud:GetCustomStatic("cs_debug" ) end local outfit = db.actor:get_current_outfit() -- Funkcja otrzymania pancerza local armor = 0 if outfit then -- Jeśli pancerz jest armor = outfit:condition() -- To otrzymujemy jej stan else armor = 0 -- W przeciwnym wypadku pancerza nie ma end local pos = db.actor:position() -- Pozycja aktora local msg = string.format("Pos: %.2f,%.2f,%.2f\\n", pos.x, pos.y, pos.z) .. -- Współrzędne GG string.format("Health: %.2f\\n", db.actor.health).. -- Życie string.format("Armor %.2f\\n", armor) -- Pancerz if cs ~= nil then cs:wnd():SetText(msg) end end
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/2589-socotobrazhenie-koordinat-gg/
-
NAZWA: Tworzenie pancerza [SoC]
AUTOR: GromeZNIEZBĘDNE OPERACJE:
SpoilerPierwszą rzeczą, którą musimy zrobić, aby stworzyć zbroję, jest dodanie jej do konfigu. W tym celu wchodzimy do rozpakowanego folderu gamedata -> config -> misc -> outfit.
1. Tam musimy skopiować dowolną linię, odpowiednią dla naszej zbroi. Musimy wymyślić naszą nazwę jak np. novice_outfit - przykładowo wymyślamy takie: green_outfit.
2. Następnie musimy przeanalizować linie.
Visual odpowiada za zbroję w postaci wyrzuconej z plecaka (czyli przedmiotu), zamieńmy ją na (killer_outfit).
Actor Visual odpowiada za wizualny model naszej postaci podczas noszenia (można ją zobaczyć z drugiej lub trzeciej osoby). Wszystkie wizualizacje znajdują się wzdłuż ścieżki gamedata -> meshes -> actors gdzie wybieramy naszą frakcję. Powiedzmy, że Powinność. I wchodzimy do modelu, który znaleźliśmy w przykładzie actors\dolg\stalker_do_exoskeleton.ogf
Następnie, linie odpowiadają za naszą nazwę zbroi w ekwipunku - pamiętaj o wpisaniu nazwy zbroi, w przeciwnym razie nastąpi wylot!
inv_name = outfit_soldier_name inv_name_short = outfit_soldier_name (Kurtka nowicjusza) description = outfit_soldier_description inv_name = green_outfit_name inv_name_short = green_outfit_name (Nasz pancerz, który robimy) description = green_outfit_description
Wtedy mamy linię
inv_weight = 3.0 zmieniamy jego wagę na wymyśloną przez nas (albo ujemną albo dodatnią, ujemna - mniejsza waga, dodatnia - większa waga) inv_weight = 2.0 (uzyskano ujemną wagę zbroi)
Następnie linijka slotu
slot = 6 (zostawiamy jak jest)
Następnie w ekwipunku mamy linię ikonki zbroi w inwentarzu.
3. Zmienimy to poprzez program SIE, poniżej będą współrzędne naszego pancerza, wpiszemy wybrane współrzędne dowolnego pancerza (w przykładzie wybierzemy ikonę skórzanej kurtki bandyty)
inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 0 inv_grid_y = 18 (zastąpione poniżej) inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 12 inv_grid_y = 0
Następnie linia:
full_icon_name = npc_icon_novice_outfit
odpowiada za Visual naszej postaci w zbroi, dlatego aby użyć innego modelu wizualnego postaci w zbroi należy wejść w gamedata -> config -> ui -> ui_icons_npc.
Po otwarciu pliku ui_icons_npc pojawią się linie:
<ui_texture> <file_name>ui\ui_icons_npc</file_name> <texture id="npc_icon_without_outfit" x="384" y="384" width="128" height="320" /> <texture id="npc_icon_novice_outfit" x="0" y="704" width="128" height="320" /> <texture id="npc_icon_bandit_outfit" x="0" y="384" width="128" height="320" /> <texture id="npc_icon_killer_outfit" x="256" y="704" width="128" height="320" /> <texture id="npc_icon_monolit_outfit" x="384" y="704" width="128" height="320" /> <texture id="npc_icon_specops_outfit" x="256" y="384" width="128" height="320" /> <texture id="npc_icon_military_outfit" x="640" y="384" width="128" height="320" /> <texture id="npc_icon_military1_outfit" x="1024" y="704" width="128" height="320" /> <texture id="npc_icon_stalker_outfit" x="896" y="704" width="128" height="320" /> <texture id="npc_icon_scientific_outfit" x="768" y="704" width="128" height="320" /> <texture id="npc_icon_exo_outfit" x="128" y="704" width="128" height="320" /> <texture id="npc_icon_exosv_outfit" x="1024" y="384" width="128" height="320" /> <texture id="npc_icon_exodo_outfit" x="1158" y="384" width="128" height="320" /> <texture id="npc_icon_svoboda_light_outfit" x="640" y="704" width="128" height="320" /> <texture id="npc_icon_svoboda_heavy_outfit" x="128" y="384" width="128" height="320" /> <texture id="npc_icon_dolg_outfit" x="512" y="704" width="128" height="320" /> <texture id="npc_icon_dolg_scientific_outfit" x="512" y="384" width="128" height="320" /> <texture id="npc_icon_ecolog_outfit" x="896" y="384" width="128" height="320" /> <texture id="npc_icon_protection_outfit" x="768" y="384" width="128" height="320" /> </ui_texture>
Możemy skopiować dowolną linijkę, następnie wpisać naszą nazwę:
<ui_texture> <file_name>ui\ui_icons_npc</file_name> <texture id="npc_icon_without_outfit" x="384" y="384" width="128" height="320" /> <texture id="npc_icon_novice_outfit" x="0" y="704" width="128" height="320" /> <texture id="npc_icon_bandit_outfit" x="0" y="384" width="128" height="320" /> <texture id="npc_icon_killer_outfit" x="256" y="704" width="128" height="320" /> <texture id="npc_icon_green_outfit" x="256" y="704" width="128" height="320" /> <- NASZ PANCERZ (wzięto z pancerza najemników) <texture id="npc_icon_monolit_outfit" x="384" y="704" width="128" height="320" /> <texture id="npc_icon_specops_outfit" x="256" y="384" width="128" height="320" /> <texture id="npc_icon_military_outfit" x="640" y="384" width="128" height="320" /> <texture id="npc_icon_military1_outfit" x="1024" y="704" width="128" height="320" /> <texture id="npc_icon_stalker_outfit" x="896" y="704" width="128" height="320" /> <texture id="npc_icon_scientific_outfit" x="768" y="704" width="128" height="320" /> <texture id="npc_icon_exo_outfit" x="128" y="704" width="128" height="320" /> <texture id="npc_icon_exosv_outfit" x="1024" y="384" width="128" height="320" /> <texture id="npc_icon_exodo_outfit" x="1158" y="384" width="128" height="320" /> <texture id="npc_icon_svoboda_light_outfit" x="640" y="704" width="128" height="320" /> <texture id="npc_icon_svoboda_heavy_outfit" x="128" y="384" width="128" height="320" /> <texture id="npc_icon_dolg_outfit" x="512" y="704" width="128" height="320" /> <texture id="npc_icon_dolg_scientific_outfit" x="512" y="384" width="128" height="320" /> <texture id="npc_icon_ecolog_outfit" x="896" y="384" width="128" height="320" /> <texture id="npc_icon_protection_outfit" x="768" y="384" width="128" height="320" /> </ui_texture>
cost = cena naszego pancerza.
4. Następnie mamy konfiguracje zbroi. Zmieniamy na własne.
immunities_sect = sect_green_outfit_immunities <--Zmieniamy tutaj! ; NO RESISTANCE burn_protection = 0.1 strike_protection = 0.2 shock_protection = 0.1 wound_protection = 0.2 radiation_protection = 0.1 telepatic_protection = 0.0 chemical_burn_protection = 0.1 explosion_protection = 0.1 fire_wound_protection = 0.2 bones_koeff_protection = kurtka_mask_damage [sect_green_outfit_immunities] <--Zmieniamy tutaj! burn_immunity = 0.04 współczynniki wytrzymałości samego kombinezonu strike_immunity = 0.01 shock_immunity = 0.04 wound_immunity = 0.025 radiation_immunity = 0.1 telepatic_immunity = 0.00 chemical_burn_immunity = 0.04 explosion_immunity = 0.04 fire_wound_immunity = 0.015
5. Opis pancerza
Ścieżka: gamedata -> config -> text -> rus
Szukamy tam pliku: string_table_outfit, otwieramy go!
Dla przejrzystości kopiujemy dowolną linię z nazwą, na przykład przyjmujemy nazwę z bandyckiej kurtki:
<string id="bandit_outfit_name"> <text>Kurtka bandziora</text> </string>
<string id="bandit_outfit_name"> <text>Kurtka moro</text> <---Zamienione </string>
Następnie szukamy dowolnej linii z opisem (description):
<string id="killer_outfit_description"> <text>tekst.......</text> </string>
<string id="green_outfit_description"> <text>Fajna kurtka moro</text> <-zamienione </string>
6. Dodajemy towar do konfigu handlu u Sidorowicza.
Ścieżka: gamedata -> config -> misc -> trade_trader
;Pancerze killer_outfit = 1, 0.1
-----------------------------
Kopiujemy
;Pancerze killer_outfit = 1, 0.1
-----------------------------
;Pancerze killer_outfit = 1, 0.1 green_outfit = 1, 1 (1, 1 - prawdopodobieństwo sprzedaży)
SIE ICON EDITOR:
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/4245-sozdanie-broni-stalker-tch/
-
NAZWA: Smart_cover w Zew Prypeci [CoP]
AUTOR: SGWSTĘP:
SpoilerOd twórcy:
"Postanowiłem napisać mały samouczek na temat Smart_cover(-ów) w Zew Prypeci. A jest to związane z Zewem Prypeci z jednego powodu… Ostatnio zacząłem pracować z SDK 0.7, a ponieważ pracuję nad moim modem V.A.V.I.L.O.N., to postanowiłem któregoś dnia ustawić kilka Smart_cover'ów, ale niestety nie wszystko udaje się za pierwszym razem. Ustawiłem Smart_cover, ale NPC nie chcą działać w tym smart cover'ze. Czytałem tutoriale jakie mogłem znaleźć, ale w końcu całkiem przypadkowo znalazłem w plikach przyczynę dlaczego nie działały, i teraz wyjaśnię co było powodem :D"
PIERWSZE OPERACJE:
SpoilerNa początek stwórzmy nasz Smart_cover, autor zdecydował się stworzyć go obok bara Brodacza, tak to wygląda:
nazwiemy go:
zat_a2_animpoint_23
Teraz, aby to pojawiło się w naszej grze, zbierzemy wszystko w all.spawn, dlatego po ustawieniu i skonfigurowaniu, przechodzimy w prawo i widzimy przycisk compile, wybieramy opcję make game, a następnie klikamy OK. Po tym jak program zbierze nasze dane, kompletujemy all.spawn, do tego SDK posiada plik tool_create_spawn.cmd.
Klikamy i czekamy, aż all.spawn zostanie zebrany, po zakończeniu przechodzimy do X-Ray CoP SDK\editors\gamedata\spawns i wybieramy nasz all.spawn, ale to tylko all.spawn z naszej lokacji, którą edytowaliśmy, rozpakowujemy i widzimy nasze pliki, w przypadku autora są to alife_zaton i way_zaton. Kopiujemy go do rozpakowanego all.spawn z czystej gry ze zgodą na zamianę plików, kompletujemy i odkładamy na miejsce.
GŁÓWNE:
SpoilerTutaj wprowadziliśmy do gry edytowany przez nas all.spawn, ale aby nasz Smart_cover mógł być używany przez NPC, nadal musimy wykonać następujące czynności, dopisać go do smart terrain.
Aby to zrobić, otwieramy gamedata\configs\scripts\zaton\smart\zat_stalker_base_smart.ltx i po linii:
zat_a2_animp_22 = zaton\zat_a2_logic.ltx
dodajemy nasz:
zat_a2_animp_23 = zaton\zat_a2_logic.ltx
Następnie przechodzimy tutaj gamedata\configs\scripts\zaton\zat_a2_logic.ltx i po otwarciu pliku szukamy tej linii:
[logic@zat_a2_animp_22] active = animpoint@zat_a2_animp_22 suitable = {=check_npc_name(sim_default) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(stalker_raider) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(zat_b14_stalker_) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(artefact_hunter) =npc_in_zone(zat_a2_sr_noweap)} true prior = 100
i po niej dodajemy nasz:
[logic@zat_a2_animp_23] active = animpoint@zat_a2_animp_23 suitable = {=check_npc_name(sim_default) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(stalker_raider) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(zat_b14_stalker_) =npc_in_zone(zat_a2_sr_noweap)} true, {=check_npc_name(artefact_hunter) =npc_in_zone(zat_a2_sr_noweap)} true prior = 150
Idziemy dalej i szukamy tej linii:
[animpoint@zat_a2_animp_22]:animpoint@zat_a2_animp_gen_reach cover_name = zat_a2_animpoint_22 on_info = {=npc_in_zone(zat_a2_sr_light)} animpoint@zat_a2_animp_22_reached
właściwie i po tym dodajemy nasz:
[animpoint@zat_a2_animp_23]:animpoint@zat_a2_animp_gen_reach cover_name = zat_a2_animpoint_23 on_info = {=npc_in_zone(zat_a2_sr_light)} animpoint@zat_a2_animp_23_reached
I jeszcze dalej jest ta linijka:
[animpoint@zat_a2_animp_22_reached]:animpoint@zat_a2_animp_gen cover_name = zat_a2_animpoint_22
i po niej także dodajemy naszą:
[animpoint@zat_a2_animp_23_reached]:animpoint@zat_a2_animp_gen cover_name = zat_a2_animpoint_23
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1280-cop-smart_cover-v-zov-pripyati/
-
NAZWA: Zabranie pieniędzy ze zwłok [SoC]
AUTOR: RETRIXPOTRZEBNE PLIKI:
Spoiler- gamedata/scripts/treasure_manager.script
- gamedata/scripts/lootmoney.script (NOWY PLIK)
OPERACJE NA PLIKACH:
SpoilerZnajdujemy w rozpakowanym katalogu gamedata plik w ścieżce gamedata/scripts/treasure_manager.script.
W pliku treasure_manager.script znajdujemy następującą konstrukcję kodu:
--' Юзание инициатора (возможность выдать тайник) function CTreasure:use(npc) printf("TREASURE USE") end
Po linii TREASURE USE piszemy następujący kod:
if (npc and db.actor) then lootmoney.lootmoney(npc) end
W efekcie wykonanej pracy otrzymujemy w pliku treasure_manager.script następującą konstrukcję:
--' Юзание инициатора (возможность выдать тайник) function CTreasure:use(npc) printf("TREASURE USE") if (npc and db.actor) then lootmoney.lootmoney(npc) end
Teraz w katalogu z grą względem ścieżki gamedata/scripts tworzymy nowy dokument tekstowy lootmoney.txt. Otwieramy plik za pomocą notatnika lub innego edytora tekstu i zapisujemy go jako lootmoney.script z kodowaniem ANSI. Możesz wziąć gotowy skrypt LUA, wyczyścić go i zmienić jego nazwę. To ma niewielkie znaczenie.
W pliku gamedata/scripts/lootmoney.script piszemy taki kod:
function lootmoney(npc) if npc ~= nil and not string.find(npc:section(),"arena") and npc:character_community()~="arena_enemy" then local money = npc:money() if money ~= nil and money ~=0 then local deadmoney = money local npc_rank npc_rank = ranks.get_obj_rank_name(npc) if npc_rank ~= nil then if npc_rank == "novice" and deadmoney >=400 then deadmoney=math.random(25,400) elseif npc_rank == "experienced" and deadmoney >=500 then deadmoney=math.random(50,500) elseif npc_rank == "veteran" and deadmoney >=600 then deadmoney=math.random(100,600) elseif npc_rank == "master" and deadmoney >=700 then deadmoney=math.random(200,700) end end local news_texti = "\\n%c[255,255,0,0]Martwy stalker: %c[default]"..npc:character_name().."\\n%c[255,255,0,0]Znaleziono pieniądze: %c[default]"..game.translate_string(tostring(deadmoney).."rub.") db.actor:give_game_news(news_texti, "ui\\ui_iconsTotal", Frect():set(0,0,83,47), 1, 4000) db.actor:give_money(deadmoney) game_stats.money_quest_update(deadmoney) npc:give_money(-money) game_stats.money_quest_update(-money) end end end
Teraz wystarczy zapisać i zamknąć pliki. Sposób powinien zadziałać. Podczas przeszukiwania zwłok stalkerów automatycznie pobierana jest określona suma pieniędzy, podobnie jak otrzymuje się informacje o schowkach i artykułach w encyklopedii.
Struktura tego ficzera została wzięta z LootMoney MOD.
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1583-soc-snyatie-deneg-s-trupov/
-
NAZWA: Logika restryktora
AUTOR: AziatkaVictorTen temat został stworzony w celu zebrania wszystkich "sekcji sr" w jednym miejscu. Informacje mogą być uniwersalne dla różnych części serii.
SR_IDLE:
SpoilerTen schemat w rzeczywistości nie ma żadnych funkcji. Zwykle jest używany do używania timerów i warunków włączenia lub jako połączenie między sekcjami. Jest używany wszędzie i często, bez niego nie można było normalnie napisać logiki.
Struktura:
[sr_idle] *Działania*
Przykład 1:
[logic] active = sr_idle [sr_idle] on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%
W przykładzie taka logika:
CytatJeśli GG znajduje się wewnątrz tego restryktora i mamy infoportion "val_raid_start" i brakuje "esc_return" i "esc_trader_speak", to dadzą nam "esc_return" oraz "esc_trader_speak", i wykonuje się funkcja "esc_return_dv".
Przykład 2:
[logic] active = sr_idle@start [sr_idle@start] on_game_timer = 100 | sr_idle@end %+info1% [sr_idle@end] on_info = {+info2} nil %+info3%
W przykładzie 2 taka logika:
Cytat10 sekund po uruchomieniu logiki (on_game_timer liczy czas gry, więc mnożymy sekundy przez time_factor, który domyślnie wynosi 10), pojawia się infoportion "info1", a aktywną sekcja staje się "sr_idle@end", gdzie mając infoportion "info2", wydadzą nam "info3" i logika się zakończy.
Plik: gamedata\scripts\sr_idle.script
P.S. Pisanie "nil" jest OBOWIĄZKOWE, w przeciwnym wypadku wasza logika może po prostu utknąć w tej sekcji i będzie się dziwić, czemu dostajesz tysiąc zadań lub wiadomości. Zamiast "nil" można stworzyć pustą sekcję i po prostu przełączać na nią, ale nie wiadomo, jak może to wpłynąć na wydajność przy częstym używaniu.
SR_NO_WEAPON:
SpoilerSekcja służy do zabraniania GG wyciągania broni w określonej strefie, nie ma żadnych ustawień i tak naprawdę ich nie potrzebuje.
Struktura:
[logic] active = sr_no_weapon [sr_no_weapon]
Plik: gamedata\scripts\sr_no_weapon.script
SR_SOUND:
SpoilerSchemat ma na celu odtworzenie dźwięku, gdy aktor wejdzie w space_restrictor. Istnieje również analogia w postaci funkcji "=play_sound()".
Parametry:
- snd - ścieżka do dźwięku lub listy dźwięków oddzielonych przecinkami (ścieżka jest względna w stosunku do folderu gamedata\sounds).
-
type - rodzaje dźwięków oddzielonych przecinkami. Dla wygody, rodzaje zestawów dźwięków zostały wprowadzone do tabeli sound_types pliku kontrolnego. W sumie są trzy:
- floor_wooden;
- rats_panic;
- random.
- delay - opóźnienie odtwarzania dźwięku w sekundach czasu rzeczywistego, domyślnie 0.
- idle - długość opóźnienia po rozpoczęciu ostatnio odtwarzanego dźwięku. Żeby np. "wycie" było nie częściej niż raz na kilka minut. Określane w sekundach czasu gry, tj. "sekundy * time_factor". Wartość domyślna = 0.
- rnd - prawdopodobieństwo (w procentach), że dźwięk zostanie odtworzony. Wartość domyślna to 100.
- position - ustawia nazwę ścieżki, w której wierzchołkach może być odtwarzany dźwięk. Istnieje zastrzeżona wartość "random". Oznacza losową miejsce w promieniu od 15 do 50 metrów od gracza. Jeśli ten parametr nie zostanie ustawiony, przyjmowana jest pozycja gracza.
- slide_velocity - prędkość (m/s) przemieszczania dźwięku wzdłuż punktów patrolowej ścieżki. Wartość domyślna to 3.
- slide_sound_once = true/false - jeśli ustawione na true, odtworzy dźwięk raz, nawet jeśli nie dotarł do ostatniego punktu ścieżki, jeśli false, to gdy dźwięk się skończy i nie dotrze do ostatniego punktu ścieżki , Zagraj jeszcze raz. Wartość domyślna to fałsz.
- play_at_actor = true/false - powoduje, że dźwięk odtwarzany jest cały czas z pozycji aktora. Jeśli jest równe "true" i jest ustawiona ścieżka przemieszczenia dźwięku (lub losowo), wówczas złapiesz wylot.
Struktura:
[logic] active = sr_sound [sr_sound] snd = dźwięk
Przykład:
[logic] active = sr_idle [sr_idle] on_actor_inside = sr_sound@shooting [sr_sound@shooting] snd = characters_voice\scenario\garbage\grey_grey_1 play_at_actor = true on_signal = sound_end| nil on_timer = 20000| nil
W przykładzie taka logika:
CytatKiedy GG wchodzi w restrykktor, to sekcja zmienia się na "sr_sound@shooting" i zaczyna odtwarzać dźwięk i po 2000 sekundach lub kiedy zakończy się dźwięk - logika kończy się.
Plik: gamedata\scripts\sr_sound.script
SR_TIP:
SpoilerSekcja służy do wysyłania wiadomości do GG, często wykorzystywana w fabularnych modach.
Parametry:
- name - linia z id tekstu zarejestrowanego w folderze gamedata\config\text.
- type = news/tips - parametr jest elementarny i na nic nie wpływa.
- sender - ustawia warunkowy identyfikator ikonki postaci, od którego przyszła wiadomość.
-
Domyślnie to ikonka handlarza. W SoC możliwe są następujące wartości: default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer.
- W CoP używane są ikonki, które zostały zapisane w news_manager.script
- cond = {+info -info =func !func ~number} - potrzebne logiczne warunki, dzięki którym podpowiedź zadziała.
- single = true/false - jeśli jest true, to wiadomość zostanie wydana tylko raz. Domyślnie false.
- timeout - opóźnienie wyświetlenie wiadomości w sekundach. Domyślnie - 0.
- showtime - czas wyświetlenia wiadomości na ekranie. Ustawiane w milisekundach. Domyślnie - 5000.
Struktura:
[sr_tip] name = rad_barman_spam type = tips cond = {+bar_deactivate_radar_done} sender = barman showtime = 25000
Plik: gamedata\scripts\sr_tip.script
SR_LIGHT:
SpoilerLogika włączająca lub wyłączająca latarki w restryktorze u NPC.
Struktura:
[sr_light] light_on = true/false
Plik: gamedata\scripts\sr_light.script
SR_TERRITORY:
SpoilerSchemat ten polega na tym, że wychwytuje wszelkiego rodzaju zdarzenia zachodzące wewnątrz restryktora. Jak dotąd wyłapuje tylko trafienia i śmierć NPC. Jednakże schemat działa tylko z graczem, trafienia i śmierć są liczone tylko od gracza.
Parametry:
- territory_hit = {+info -info =func !func ~number} %+info -info =func% - efekty, które wystąpią po zadaniu trafienia graczowi znajdującemu się w tej strefie.
- territory_death = {+info -info =func !func ~number} %+info -info =func% - efekty, które wystąpią po śmierci z "rąk" gracza znajdującego się w tej strefie.
Struktura:
[logic] active = sr_territory [sr_territory] territory_death = nil %+info%
Plik: gamedata\scripts\sr_territory.script
SR_MAPSPOT:
SpoilerPo wejściu na restryktora podświetla się on na mapie.
Parametry:
- hint - linijka z id tekstu zarejestrowanego w folderze gamedata\config\text.
- location - nazwa rodzaju znacznika, zarejestrowanego w pliku config\ui\map_spots.xml i wszystkiego, co jest po include. Domyślnie - crlc_small.
Struktura:
[sr_mapspot] hint = gar_swamp location = crcl_big
Plik: gamedata\scripts\sr_mapspot.script
SR_PARTICLE:
SpoilerSystem ten odtwarza cząsteczki, zarówno statyczne, jak i poruszające się, w określonym miejscu i czasie. Ten schemat polega na śledzeniu cząstek/particles, gracz nie musi do niego wchodzić.
Parametry:
- name - ścieżka do cząstki względem pliku particles.xr.
-
path - ścieżki poruszania się cząstki. Możliwe są dwa przypadki:
- Kiedy zostaje ukazana ścieżka animacji kamery (ścieżka jest względna do folderu gamedata\anims). Dla nazwy pliku trzeba obowiązkowo dodać rozszerzenie .anm (np. arena.anm).
- Kiedy zostanie podana nazwa ścieżki patrolowej.
-
mode - parametr obowiązkowy i ma ustawiane dwie wartości:
- 1 - w przypadku wskazania animacji kamery dla parametru path;
- 2 - w przypadku wskazania patrolowej ścieżki dla parametru path.
- looped = true/false - flaga zapętlenia cząstek. Przy true, po zakończeniu odtwarzania cząstek, będą uruchamiane od początku, ale bez opóźnień. Jednakże sygnał particle_end nie zostanie wydany. Przy false sygnał zostanie wydane, kiedy wszystkie źródła cząsteczek zostaną odtworzone.
Struktura:
[logic] active = sr_particle [sr_particle] name = anomaly2\gravity_blast_03 path = ścieżka mode = 2 looped = false on_signal = particle_end | nil
Plik: gamedata\scripts\sr_particle.script
SR_SOUND_ACT:
SpoilerSchemat odtwarza dźwięk w głowie aktora. Wszelkiego rodzaju rozmowy w PDA i inne rzeczy. Jeśli określono theme, dźwięk będzie odtwarzany w pętli, losowo wybierając jeden z dźwięków określonych w theme, jeśli określony jest dźwięk, zostanie on odtworzony raz.
Parametry:
- snd - nazwa dźwiękowego pliku względem folderu gamedata\sounds.
- delay - opóźnienie przed odtworzeniem. Domyślnie - 0.
- delay_max - między odtwarzaniem dźwięku zostanie wzięty losowy odstęp czasu pomiędzy delay i delay_max.
- theme - nazwa utworu z pliku sound_theme.script.
- stereo = true/false - przy ustawieniu tego parametru do pliku, który jest ustawiony przez parametr snd lub w dźwiękowym theme, automatycznie zostaną dodane sufiksy _r i _l w celu wczytania lewego i prawego kanałów i odpowiednio wszystko to zostanie odtworzone.
Struktura:
[logic] active = sr_sound_act [sr_sound_act] theme = sar_monolith_call delay = 10000 delay_max = 15000 stereo = true
Plik: gamedata\scripts\sr_sound2d.script
SR_TIMER:
SpoilerSchemat do wykonania dowolnej akcji w zależności od stanu timera.
Parametry:
- type - typ licznika.
- dec - dekrementujący, tzn. liczący w dół;
- inc - inkrementujący, tzn. liczący do góry.
-
start_value - początkowa wartość licznika w rzeczywistych milisekundach.
- Dla dekrementujących liczników ustawiać obowiązkowo. Dla inkrementujących, jeśli nie ustawiono, to liczy się od 0.
- on_value = число | %+info -info =func% sekcja - wykonuje działanie w zależności od stanu licznika.
- string - linia z id tekstu zarejestrowanego w folderze gamedata\config\text.
Struktura:
[logic] active = sr_timer [sr_timer] type = dec start_value = 1000000 on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor% string = st_helmet_countdown
Plik: gamedata\scripts\sr_timer.script
SR_PSY_ANTENNA:
SpoilerStrefy z tą sekcją pozwalają kontrolować efekty psi-oddziaływania (na Jantarze i Radarze). Teraz możesz kontrolować intensywność promieniowania i intensywność otrzymania obrażeń.
Parametry:
- eff_intensity - zwiększenie/zmniejszenie w procentach od bazowej wartości intensywności psi-oddziaływania.
- hit_intensity - zwiększenie/zmniejszenie w procentach od bazowej wartości zadanych obrażeń.
- phantom_prob - prawdopodobieństwo pojawienia się fantomów w procentach. Domyślnie - 0.
- postprocess - plik posteffectu, względem folderu gamedata\anims. Rozszerzenie dodawać obowiązkowo! Domyślnie - psy_antenna.ppe.
- mute_sound_threshold - limit do którego można obniżyć dźwięk poziomu. 0 - głuszy całkowicie, domyślna wartość.
Struktura:
[logic] active = sr_psy_antenna [sr_psy_antenna] eff_intensity = -10 hit_intensity = 0 phantom_prob = 45
Plik: gamedata\scripts\sr_psy_antenna.script
SR_TELEPORT:
SpoilerSchemat pozwala na teleportację aktora w obrębie lokacji.
Parametry:
- point - patrolowa ścieżka z jednego punktu, dokąd przemieści się aktor.
- look - patrolowa ścieżka z jednego punktu, gdzie będzie patrzył aktor po przemieszczeniu się.
- prob - prawdopodobieństwo przemieszczenia się do danego punktu. Domyślnie - 100.
- timeout - opóźnienie teleportacji w milisekundach. Domyślnie - 900.
Struktura:
[logic] active = sr_teleport [sr_teleport] point1 = aes2_teleport_walk_exit1 look1 = aes2_teleport_look_exit1 prob1 = 10 point2 = aes2_teleport_walk_exit2 look2 = aes2_teleport_look_exit2 prob2 = 20 timeout = 0
Plik: gamedata\scripts\sr_teleport.script
SR_CUTSCENE:
SpoilerTen schemat ma na celu odgrywanie animację kamery z pewnym efektem (pp_effector). Sekwencja działań realizowana przez schemat, polega na natychmiastowym przeniesieniu gracza na początek ścieżki point i skierowaniu jego wzroku na początek ścieżki look, utracie kontroli nad graczem i rozpoczęciu animacji kamery cam_effector, po zakończeniu której gracz odzyskuje kontrolę.
Parametry:
- point - ścieżka do pierwszego punktu, do którego przenosi się gracz.
- look - ścieżka do pierwszego punktu, na który patrzy gracz.
- pp_effector - plik, znajdujący się w folderze gamedata\anims\ i zawierający efekt (nazwa pliku jest zapisywana bez rozszerzenia).
- cam_effector - plik, znajdujący się w folderze gamedata\anims\camera_effects\ i zawierający animację kamery (nazwa pliku jest zapisywana bez rozszerzenia).
Struktura:
[logic] active = sr_cutscene [sr_cutscene] point = agr_cutscene_walk look = agr_cutscene_look cam_effector = agroprom_demo on_signal = cameff_end | nil
Plik: gamedata\scripts\sr_cutscene.script
ŹRÓDŁO:
-
NAZWA: Zmiana wytrzymałości rzeczy w dowolnym momencie gry [CoP]
AUTOR: FalkineIsakuWYJAŚNIENIE:
SpoilerTen tutorial będzie dotyczyć tego, jak zmienić trwałość/wytrzymałość rzeczy GG w dowolnym momencie gry. (w temacie będzie na początku gry)
PRACA W XR_EFFECTS:
SpoilerSą dwa sposoby:
Zmiana oryginalnej funkcji lub usunięcie starej i zrobienie nowej. (Można zostawić starą i zrobić nową)
Szukamy w naszym pliku: "function damage_actor_items_on_start", tutaj chyba zrozumiale, ale na wszelki wypadek objaśnienia:function damage_actor_items_on_start(actor, npc) "damage_actor_items_on_start" - można zmienić. local actor = db.actor - Nie ruszać local obj = actor:object("helm_respirator") "helm_respirator" - to sekcja przedmiotu, któremu chcemy zwiększyć wytrzymałość. if obj ~= nil then - Nie ruszać obj:set_condition(0.8) "0.8" - To nowy stan przedmiotu, który możemy ustawić. end - Nie ruszać end - Nie ruszać
Zgodnie z tym schematem możliwe jest utworzenie nowej funkcji.
AKTYWACJA:
SpoilerNa początek wyjaśnijmy jak usunąć standardową aktywację funkcji (na początku oryginalnego ZP na Zatonie)
Wchodzimy do "configs\scripts\zaton\zaton_a1_logic.ltx" i usuwamy %=damage_actor_items_on_start% (jest w 5 linijce)Jak wywołać taką funkcję znowu, ale z inną nazwą i w innej logice.
Otwieramy waszą logikę restryktora i na samym początku, po pierwszym "on_info/on_game_timer" piszemy: %=nazwa_waszej_funkcji%
Przykład:on_info = {+esc_start_game !surge_started} %=nazwa_waszej_funkcji%
I to wszystko
TROCHĘ SŁÓW OD DENIS2000:
SpoilerJest zmieniany stan obiektu (odwrotność zużycia przedmiotu). Wytrzymałość (a dokładniej stopień, z jakim psuje się przedmiot pod wpływem czynników zewnętrznych) jest ustawiany w konfigu obiektu w sekcji z nazwą wskazaną w parametrze immunities_sect.
Autorska funkcja Denis2000:
function damage_actor_items_on_start() local actor = db.actor local slot_tab = {2,3,7,12} for i = 1, #slot_tab do local item_in_slot = actor:item_in_slot(slot_tab[i]) if item_in_slot ~= nil then item_in_slot:set_condition((math.random(30)+40)/100) end end end
Zmienia ona stan przedmiotów w slotach 2,3,7,12 u GG, to znaczy broni, hełmu i pancerza. Zmienia na losową wartość w przedziale 0,4-0,7, przy tym nie ma znaczenia jaki dokładnie przedmiot jest wydany na starcie gry.
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/3993-cop-izmenenie-prochnosti-veshtey-v-lyuboy-moment-igry/
-
NAZWA: Zmiana obrazu podczas uruchamiania gry [CoP] [CS] [SoC]
AUTOR: FalkineIsakuWYJAŚNIENIE:
SpoilerObraz na początku gry - małe okienko na początku gry, po którym zostaje uruchomiona sama gra.
Dany tutorial pasuje do wszystkich części Stalkera.
NIEZBĘDNE PROGRAMY:
SpoilerDo tego przyda się nam program "Resource Hacker", "Adobe Photoshop (lub dowolny inny graficzny edytor)" i sam Stalker.
PRACA Z OBRAZEM:
SpoilerOdpalamy program Resource Hacker, klikamy File ---> Open i szukamy tam nasz XrEngine.exe w GŁÓWNYM folderze Stalkera.
W lewym okienku klikamy Bitmap --> 123 i następnie PPM na 0 --> Save *.bmp resourse (zapisujemy tam gdzie trzeba)
Uruchamiamy Photoshop i otwieramy nasz plik z rozszerzeniem .bmp. Na stare zdjęcie nakładamy nowe, zapisujemy w formacie .bmp (najważniejsza rzecz to głębia, ustawiamy 24-bit).
Znowu odpalamy Resource Hacker i znowu naciskamy PPM na 0, klikamy "Replace Bitmap" ---> Open file with new bitmap i wybieramy nasze .bmp, klikamy Replace i... cieszymy się naszym nowym obrazkiem. Tylko nie zapomnijcie zapisać.ŹRÓDŁO:
https://ap-pro.ru/forums/topic/4019-cop-cs-soc-izmenenie-kartinki-pri-zapuske-igry/
-
NAZWA: Stworzenie płatnej osobistej skrytki [CoP]
AUTOR: FalkineIsakuPRACA W LEVEL EDITOR:
SpoilerPrzykład będzie na osobistej skrytce na Zatonie.
Wydzielamy nasz inventory box i w custom data ustawiamy mu taką logikę:
[story_object]
story_id = zat_a2_actor_treasure - story id waszej skrytki[logic]
cfg = scripts\zaton\actor_inventory_box.ltx - ścieżka do logiki (warto utworzyć w folderze waszej lokacji nową logikę specjalnie dla skrytki)Kompilujemy spawn.
PRACA Z LOGIKĄ:
SpoilerNa początek wchodzimy do configs/text/rus/ui_st_screen.xml i dodajemy w dowolne miejsce taką sekcję:
<string id="actor_inventory_box_locked"> <text>Skrzynka zamknięta</text> </string>
Dalej wchodzimy w configs/scripts/wasza_lokacja/actor_inventory_box.ltx i wstawiamy taką sekcję:
[logic] active = ph_idle@locked [ph_idle@open_timer_1_day] nonscript_usable = true - czy można użyć skrzynki? tips = actor_inventory_box_use - napis po najechaniu on_game_timer = 864000 | ph_idle@locked %-zat_actor_buy_actor_inventory_box_1_day% - po jednym dniu skrzynka stanie się niedostępna [ph_idle@open_timer_3_day] nonscript_usable = true tips = actor_inventory_box_use on_game_timer = 2592000 | ph_idle@locked %-zat_actor_buy_actor_inventory_box_3_day% [ph_idle@locked] nonscript_usable = false tips = actor_inventory_box_locked on_info = {+zat_actor_buy_actor_inventory_box_1_day} ph_idle@open_timer_1_day on_info1 = {+zat_actor_buy_actor_inventory_box_3_day} ph_idle@open_timer_3_day
STWORZENIE DIALOGU W CELU KUPNA SKRYTKI (DIALOG EDITOR):
SpoilerNajpierw utwórzmy skrypty, wchodzimy więc w dialogs_***.script
Robimy funkcję sprawdzającą, czy GG posiada pieniądze:function zat_a2_actor_has_7000(first_speaker, second_speaker) return db.actor:money() >= 7000 end
Sprawdzanie na 7000 RUB.
Teraz robimy skrypt dla zabieranie tych pieniędzy od GG:
function zat_a2_actor_relocate_from_actor_7000(first_speaker, second_speaker) dialogs.relocate_money_from_actor(first_speaker, second_speaker, 7000) end
Teraz dopisujemy je do dialogu, dokładnie tak:
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/4024-cop-sozdanie-platnogo-lichnogo-yashtika/
-
NAZWA: Wysłanie wiadomości GG z nazwą nadawcy [CoP]
AUTOR: FalkineIsakuWYJAŚNIENIE:
SpoilerWysłanie wiadomości do GG z nazwą nadawcy za pomocą skryptów.
PS. Zebrane w jakiś sposób z news_manager.script.OBJAŚNIENIE DO SKRYPTU I SAM SKRYPT:
SpoilerZapisujemy w xr_effects.script:
function nazwa_funkcji(actor, type, amount) local news_caption = game.translate_string("Nazwa_nadawcy_wiadomości") local news_text = game.translate_string("Tekst_wiadomości") db.actor:give_game_news(news_caption, news_text, "Ikonka nadawcy (nie z news_manager.script, a wprost z ui\textures_descr\***", nil, czas wyświetlenia wiadomości) end
Przykład:
function esc_test_sms(actor, type, amount) local news_caption = game.translate_string("st_test_sms_caption") local news_text = game.translate_string("st_test_sms_text") db.actor:give_game_news(news_caption, news_text, "ui_inGame2_Fanat", nil, 10000) end
Wywołujemy standardowo: on_info = {warunek} %=esc_test_sms%
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/3997-cop-otpravka-soobshteniya-gg-s-imenem-otpravitelya/
-
NAZWA: Okienko "Czy na pewno chcesz przejść na inną lokację?" [CoP]
AUTOR: FalkineIsakuWYJAŚNIENIE:
SpoilerOkienko z pytaniem: "Czy na pewno chcesz przejść na inną lokację?" zostało wyciętę z CoP, ale pojawia się kiedy wchodzimy w restryktor, po kliknięciu "Tak" zostaniemy przeniesieni/teleportowani do level_changer; a po kliknięciu na "Nie" - teleportuje nas z dala od restryktora. Pliki są wzięte z amk-mod do CoP.
I wygląda ono tak:
PRACA W SDK:
SpoilerNa początek robimy przejście, ale w tym temacie o tym informacji. W internecie są lekcje.
Tworzymy space_restrictor i w jego Custom data zapisujemy taką logikę:[story_object] story_id = nazwa_restryktora [logic] cfg = scripts\ścieżka\do_logiki\restryktora.ltx
I ustawiamy typ restryktora: Not A
Zalecane jest od razu zapisać współrzędne, dokąd będzie teleportować przy nacisnięciu na "Tak" i "Nie".
Kompilujemy spawn i przechodzimy do logiki.PRACA Z LOGIKĄ:
SpoilerNa początek pobieramy to archiwum: https://drive.google.com/drive/folders/1k8uV66bnn5Dfq7O2sksU3qMVJhaWx_-m?usp=share_link i wrzucamy do folderu z grą (jest tam xr_effects, podstawowy, możecie używać swojego, jeśli macie go zmienionego). Po tym idziemy do naszego pliku logiki restryktora i zapisujemy to:
[logic] active = sr_idle@in [sr_idle@in] on_info = {=actor_in_zone(nazwa_restryktora)} %=nazwa_funkcji_która_będzie_w_xr_effects% sr_idle@out [sr_idle@out] on_info = {!actor_in_zone(nazwa_restryktora)} sr_idle@in
Teraz wchodzimy do xr_effects.script i zapisujemy taką funkcję:
function nazwa_funkcji() amk_wnd_lv.StartWnd("nazwa_restryktora") end
Po tym idziemy do configs\misc\amk\amk_lv.ltx
I tak jak w przykładzie, zapisujemy współrzędne:
[nazwa_restryktora] Yes=nazwa_restryktora_yes No=nazwa_restryktora_no
[nazwa_restryktora_yes] - współrzędne teleportacji po naciśnięciu na "Tak" x= y= z= [nazwa_restryktora_no] - współrzędne teleportacji po naciśnięciu na "Nie" x= y= z=
I to wszystko.
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/4265-cop-vy-deystvitelno-hotite-pereyti-na-druguyu-lokaciyu/
-
NAZWA: Prototyp dynamicznych wiadomości
AUTOR: ?Aby zrobić ten prototyp, musisz utworzyć skrypt o nazwie podobnej jak twoja_nazwa.script i posiadać oryginalny plik bind_stalker.script.
TWORZENIE WŁASNEGO PLIKU SKRYPTOWEGO:
SpoilerNapiszmy coś takiego:
-- Prototyp dynamicznych wiadomości local ant_spam ={ "Słyszałem, że na ATP z Doliny Mroku zombie chodzą. Ostrożniej tam.", "Timycz: Kto będzie spamował, temu coś wyrwę.", "Ktoś wie, gdzie podziewa się Striełok?", "Wojskowi kompletnie oszaleli! Dwa tysiące rubli za przejście na północ Kordonu - nieźle!", "Pojawił się Chuck Norris u nas. To bandzior z taką ksywką. Debil kompletny.", "Kombat kiedyś mówił, że Topol zaginął. Niewiadomo gdzie. Minęli się w podziemiu Agropromu", "Powinność: Cholera, przejdźcie na swoje fale. Inaczej wydacie plany Wolności", "Wolność: Tasak znowu na Kota wpadł. Kogoś wkrótce wezwą do walki zgodnie z prawem Strefy.", "Похоже мне еще в лагере сидеть. Блин долг когда я этот Сидоровичу то отдам?!" } time_news = 0 -- zmienna odstępu czasu function time_update_spam() -- funkcja odstępu czasu local time = time_global() -- zmienna czasu if time_news < time then time_news = time + 30000 -- czas, po którym zostanie wypisana wiadomość twoja_nazwa.update_spam() end end function update_spam() news_manager.send_tip(db.actor, (ant_spam[math.random(9)]), nil, nil, 30000) end
ZMIANY W BIND_STALKER.SCRIPT:
SpoilerWchodzimy do bind_stalker.script i po linijce:
xr_sound.update_actor()
piszemy:
twoja_nazwa.time_update_spam()
Teraz w grze będziesz otrzymywał wiadomości w ciągu kilku sekund. Im więcej czasu w wierszu time_news = time + 30000, tym dłuższy będzie odstęp czasu.
Możesz także dodać swój news - po linijce "Mod Antdiablon freeplay 2.0 - najlepszy" postaw przecinek i wpisz swój tekst w nowym wierszu, w cudzysłowie, ale na końcu po cudzysłowie postaw przecinek. a jeśli to ostatni tekst, to go nie umieszczaj.
Następnie policz, ile wiadomości jest łącznie i w wierszu:
news_manager.send_tip(db.actor, (ant_spam[math.random(9)]), nil, nil, 30000)
zamiast 9 wstaw odpowiednią ilość.
ŹRÓDŁO:
https://ap-pro.ru/forums/topic/1575-prototip-dinamicheskih-novostey/
-
NAZWA: Zmiana menu głównego [CoP]
AUTOR: FalkineIsakuZMIANA TŁA MENU:
SpoilerWchodzimy do configs\ui\ui_mm_main.xml.
To, co znajduje się przed "<button h="25"/>" - to tło menu. Jeśli chcesz zmienić obraz, zmień "ui_actor_main_menu.dds". Jeśli chcesz zrobić "Wideo-menu" niezbędny będzie plik o formacie .ogm z rozdzielczością "1920x1080". Wrzucacie go do textures\ui\ i zmieniacie.ZMIANA PRZYCISKÓW:
SpoilerJeśli chcesz usunąć napisy, to usuwacie "<btn name="btn_credits" caption="ui_mm_credits" />"
W całym pliku, tak samo jest w przypadku z ustawieniami, nową grą, itd.Jeśli chcesz zmienić pozycję ikonek to wystarczy zmienić
"<shniaga_wnd x="40" y="320" width="270" height="380">" (14 linijka)
Zmieniać należy x="*" y="*"ZMIANA NAPISU W LEWYM DOLNYM ROGU:
SpoilerZmieniamy napis - "ver. 1.6.02"
Wchodzimy do scripts i otwieramy plik ui_main_menu.script
Linijka 28:
_ver:TextControl():SetText ("TEST") - to, co jest w cudzysłowach można zmienić na własny tekst, albo angielskimi, albo rosyjskimi literami.MAŁY DODATEK DLA TYCH, KTO ROBI WIDEO-MENU:
SpoilerKiedy wejdziesz do opcji z menu "zapisz grę" lub "wczytaj grę", to widzimy niezbyt przyjemny obrazek. Dla poprawki zmieniamy w plikach ui_mm_save_dlg.xml i ui_mm_load_dlg.xml,
To:
<auto_static x="500" y="130" width="432" height="160" stretch="1">
<texture width="432" height="160">ui\video_voroni_crop</texture>
</auto_static>
<auto_static x="413" y="352" width="576" height="416" stretch="1">
<texture width="576" height="416">ui\video_water_crop</texture>
</auto_static>na to:
<auto_static x="0" y="0" width="1024" height="768" stretch="1">
<texture x="0" y="0" width="1920" height="1080">ui\nazwa_waszego_wideo_pliku</texture>
</auto_static>ŹRÓDŁO:
https://ap-pro.ru/forums/topic/4008-cop-izmenenie-glavnogo-menyu/
-
NAZWA: Zbiór skryptów [CoP]
AUTOR: ?DAJEMY PRZEDMIOT GG:
SpoilerWydanie jednego przedmiotu:
function nazwa_funkcji(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "nazwa_przedmiotu", "in") end
Wydanie kilku jednakowych przedmiotów:
function nazwa_funkcji(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "nazwa_przedmiotu", "in", ilość) end
Skrypt do dialogu:
<action>nazwa_skryptu.nazwa_funkcji</action>
ZABIERAMY PRZEDMIOT GG:
SpoilerZabranie jednego przedmiotu:
function nazwa funkcji(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "nazwa przedmiotu") end
Zabranie kilku jednakowych przedmiotów:
function nazwa funkcji(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "nazwa przedmiotu", liczba_przedmiotów) end
Dodanie skryptu do dialogu:
<action>nazwa skryptu.nazwa funkcji</action>
SPAWNUJEMY PRZEDMIOT DO EKWIPUNKU GG:
Spoilerfunction nazwa_funkcji() local obj = alife():create("RZECZ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end
Dodanie skryptu do dialogu:
<action>nazwa_skryptu.nazwa_funkcji</action>
SPRAWDZANIE POSIADANIA PRZEDMIOTU PRZEZ GG:
SpoilerPierwszy wariant:
function nazwa_funkcji() return db.actor:object("nazwa_przedmiotu") end
Drugi wariant:
function nazwa_funkcji(first_speaker, second_speaker) return first_speaker:object("название предмета") ~= nil end
Dodanie skryptu do dialogu:
<precondition>nazwa_skryptu.nazwa_funkcji</precondition>
SPRAWDZANIE POSIADANIA JEDNEGO Z KILKU PRZEDMIOTÓW GG:
Spoilerfunction Название функции(first_speaker, second_speaker) return first_speaker:object("nazwa_przedmiotu") ~= nil or first_speaker:object("nazwa_przedmiotu") ~= nil or first_speaker:object("nazwa_przedmiotu") ~= nil end
Dodanie skryptu do dialogu:
<precondition>nazwa_skryptu.nazwa_funkcji</precondition>
SPRAWDZANIE ILOŚCI PIENIĘDZY GG:
SpoilerPierwszy wariant:
function nazwa_funkcji(first_speaker, second_speaker) return first_speaker:money() >= ilość end
Drugi wariant:
function nazwa_funkcji() return db.actor:money() >= ilość end
Dodanie skryptu do dialogu:
<precondition>nazwa_skryptu.nazwa_funkcji</precondition>
NAGŁA ŚMIERĆ GG:
Spoilerfunction nazwa_funkcji(npc, actor) npc:kill(actor) end
Dodanie skryptu do dialogu:
<action>nazwa_skryptu.nazwa_funkcji</action>
LECZENIE GG:
SpoilerDodanie skryptu do dialogu:
<action>dialogs.medic_magic_potion</action>
ODDANIE PIENIĘDZY DLA GG PRZEZ NPC:
Spoilerfunction nazwa_funkcji(first_speaker, second_speaker) dialogs.relocate_money_to_actor(first_speaker, second_speaker, ilość) end
Dodanie skryptu do dialogu:
<action>nazwa_skryptu.nazwa_funkcji</action>
OD MAKDM:
SpoilerDla spawnu przedmiotu do inwentarza GG wystarczy wskazać ID GG:
Spoilerlocal obj = alife():create( "RZECZ", vector(), 0, 0, db.actor:id() )
Dialog może zaczynać i NPC i GG, dlatego do niektórych funkcji, wywoływanych z dialogu, lepiej dodawać sprawdzanie:
Spoilerlocal actor = dialogs.who_is_actor(first_speaker, second_speaker)
lub
local npc =dialogs. who_is_npc(first_speaker, second_speaker)
Funkcje dla pliku xr_effects.script:
SpoilerCzyszczenie lokacji ze zbędnej broni. Broń w schowkach nie jest usuwana:
function cleaner_weapons( actor, obj ) local manag = treasure_manager.get_treasure_manager() for i = 1,65534 do local object = alife():object( i ) if object then local section = object:section_name() if string.find( section, "wpn_" ) or string.find( section, "grenade_" ) then if object.parent_id == 65535 and manag.items_from_secrets[ i ] == nil then alife():release( alife():object( object.id ), true ) end end end end end
Wydanie losowych pieniędzy GG (używane przy posiadaniu elektronicznego portfela) w granicach 500 rubli lub hrywien:
function give_random_money_to_actor( actor, npc ) local num = math.random( 500 ) actor:give_money( num ) xr_sound.set_sound_play( actor:id(), "pda_tips" ) news_manager.relocate_money( actor, "in" , num ) end
Skierowanie kamery w stronę ścieżki podczas cut-sceny:
function actor_look( actor, npc, p ) local point = patrol( p[1] ) actor:actor_look_at_point( point:point(0) ) end
Zrobić squady (squad) neutralnym(-i) w stosunku do GG:
function set_squads_neutral_to_actor( actor, npc, p ) if p then for k,v in pairs( p ) do local squad = get_story_squad( v ) if squad then squad:set_squad_relation("neutral") end end end end
Zrobić squady (squad) wrogim(-i) w stosunku do GG:
function set_squads_enemy_to_actor( actor, npc, p) if p then for k,v in pairs( p ) do local squad = get_story_squad( v ) if squad then squad:set_squad_relation("enemy") end end end end
ŹRÓDŁO:
S.T.A.L.K.E.R. The Eternal Suffering
w Nowości ze Świata Modów
Opublikowano
Źródło: https://ap-pro.ru/forums/topic/4556-the-eternal-suffering/
Screeny nowych ficzerów:
Kilka fot Radaru-2: