Gość Diegtiariow Opublikowano 10 Czerwca 2023 Zgłoś Udostępnij Opublikowano 10 Czerwca 2023 NAZWA: Lekcja odnośnie tworzenia punktu respawn dla mutantów [SoC] AUTOR: ins33 Od twórcy: "Prędzej czy później każdy modder zastanawia się nad respawnem. Pierwsze próby stworzenia respawnera zakończyły się częściowym sukcesem. O pechu przeczytasz na końcu. Męcząc respawnera przez kilka dni, odłożyłem tę lekcję na najdalszą półkę. I nadszedł czas, ale tym razem musiałem zespawnować mutanty. I okazało się to dużo łatwiejsze!" NIEZBĘDNE OPERACJE: Spoiler Najpierw stwórzmy smarta, z jedną pracą: Tworzymy pliki alife_l01_escape_test.ltx i way_l01_escape_test.ltx w folderze ACDC\all. Zrobimy to dla wygody, przy pakowaniu wszystko dodane będzie w plikach lokacji. W acdc\all\all.ltx dodajemy pliki alife_l01_escape_test.ltx i way_l01_escape_test.ltx. Dodajemy smarta do alife_l01_escape_test.ltx: [number] ; cse_abstract properties section_name = smart_terrain name = esc_boar_weak_smart ; nazwa smartu position = -132.06704711914,-3.5775165557861,-79.952697753906 ; X,Y,Z direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 72 ; GV distance = 3 level_vertex_id = 119229 ; LV object_flags = 0xffffff3e custom_data = <<END [smart_terrain] type = esc_boar_weak_smart ; nazwa smartu cond = 100 ; warunki istnienia smartu. {+info –info ! function =function} capacity = 3 ; pojemność smartu END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_smart_terrain properties Stworzyliśmy smart terrain, dodajmy moba dla tego smarta: [number] ; cse_abstract properties section_name = boar_weak name = esc_boar_weak_test_0000 position = -126.9560546875,-4.6784887313843,-95.063812255859 direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 72 distance = 3 level_vertex_id = 125542 object_flags = 0xffffffbf custom_data = <<END [smart_terrains] esc_boar_weak_smart = true ; wskazujemy do jakiego smartu należy to zwierzę. END ; cse_visual properties visual_name = monsters\mutant_boar\mutant_boar ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 2 dynamic_out_restrictions = dynamic_in_restrictions = ; cse_alife_monster_abstract properties ; cse_ph_skeleton properties ; cse_alife_monster_base properties ; se_monster properties upd:health = 2 upd:timestamp = 0 upd:creature_flags = 0 upd:position = -126.9560546875,-4.6784887313843,-95.063812255859 upd:o_torso = 0,0,0 Zwierze dodane, dodajmy ścieżki. Otwieramy way_l01_escape_test.ltx: [esc_boar_weak_smart_home] points = p0 p0:name = wp00 p0:position = -123.97886657715,-4.0969734191895,-92.151412963867 p0:game_vertex_id = 72 p0:level_vertex_id = 128790 Uwaga! Nazwa punktu ścieżki zaczyna się od nazwy smarta! Teraz musimy stworzyć logikę i warunki pracy. Dlatego tworzymy gamedata\config\misc\gulag_escape_test.ltx. W gulag_task.ltx rejestrujemy nowy gułag #include "gulag_escape_test.ltx" i piszemy prostą logikę w gulag_escape_test.ltx: [logic@esc_boar_weak_smart_0000] active = mob_home@esc_boar_weak_smart_0000 [mob_home@esc_boar_weak_smart_0000] path_home = home ; WSKAZUJEMY NAZWĘ ŚCIEŻKI, BEZ NAZWY SMARTA!!! esc_boar_weak_smart_home home_min_radius = 20 home_max_radius = 30 Napisaliśmy logikę, teraz dodamy warunek. Tworzymy skrypt gulag_escape_test.script, rejestrujemy go w xr_gulag.script dodając do level_gulags = {*, gulag_escape_test}. W gulag_escape_test.script zapisujemy: local t = {} function load_job(sj, gname, type, squad, groups) --'-------------------------------------------------------------------------- --' ESCAPE --'-------------------------------------------------------------------------- --' Кабаны не далеко от вагончика if type == "esc_boar_weak_smart" then t = { section = "logic@esc_boar_weak_smart_0000", idle = 0, prior = 5, state = {0}, in_rest = "", out_rest = "" } table.insert(sj, t) end end function load_states(gname, type) if type == "esc_boar_weak_smart" then return function(gulag) return 0 end end end function load_ltx(gname, type) return nil end function checkStalker(npc_community, gulag_type, npc_rank, se_obj) end function checkMonster(npc_community, gulag_type) if gulag_type == "esc_boar_weak_smart" then return npc_community == "boar" end return false end Zrobione. Teraz mamy smarta z jednym zwierzątkiem. Sprawdźmy, czy nasz smart działa. Uruchamiamy grę i przejchodzimy do wagonika znajdującego się obok rannego. Spotkaliśmy dzika, dodamy teraz respawner. W alife_l01_escape_test.ltx dodajemy: [number] ; cse_abstract properties section_name = respawn name = esc_boar_weak_respawner ; nazwa respawnera position = -146.0726776123,-3.4645113945007,-73.943954467773 direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 70 level_vertex_id = 104106 object_flags = 0xffffff3e custom_data = <<END [respawn] respawn_section = boar_weak ; sekcje respawnu max_spawn = 1 ; Maks ilość mobów w przeciągu jednego respawnu. idle_spawn = often ; rodzaj respawnera, odnosi się do prędkości zadziałania. END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 3.35619974136353 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_respawn properties Respawner zrobiony. Byłoby wspaniale nie czekać, aż samo zadziała, ale sprawić, by zadziałało, kiedy tego potrzebujemy. Dlatego zrobimy spacerestryktor. W pobliżu wejścia do bunkra Sidorowicza, który wywoła respawner: [number] ; cse_abstract properties section_name = space_restrictor name = esc_boar_weak_restrictor position = -250.60289001465,-19.588600158691,-127.29279327393 direction = 0,0,0 version = 118 script_version = 6 ; cse_alife_object properties game_vertex_id = 8 level_vertex_id = 9843 object_flags = 0xffffff3e custom_data = <<END [logic] active = sr_idle@esc_boar_weak_restrictor_start [sr_idle@esc_boar_weak_restrictor_start] on_actor_inside = {=gulag_empty(esc_boar_weak_smart)} sr_idle@esc_boar_weak_restrictor_out %=respawner_spawn(esc_boar_weak_respawner)% ; ф-ия =gulag_empty(name_smart) sprawdza czy to smart. ; ф-ия =respawner_spawn(name_smart) wywołuje wymuszony respawn [sr_idle@esc_boar_weak_restrictor_out] on_actor_outside = sr_idle@esc_boar_weak_restrictor_start END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 3.35619974136353 ; cse_alife_space_restrictor properties restrictor_type = 3 Zbieramy all.spawn, uruchamiamy nową grę, zabijamy dzika, wracamy do wejścia do bunkra, schodzimy po schodach i wracamy do smartu dzika. Gratulacje, udało się zrobić respawner! PRACA DOMOWA: Spoiler Zrobić smarta dla 3 dzików i respawner dla tego smarta. Zespawnować 3 NPC-ów pod mostem, obok wagonu. Współrzędne: character_profile = sim_stalker_master position = -35.753692626953,-10.425220489502,-72.881172180176 direction = 0,0,0 game_vertex_id = 111 distance = 3 level_vertex_id = 242232 character_profile = sim_stalker_veteran position = -41.189788818359,-10.432260513306,-77.327095031738 direction = 0,0,0 game_vertex_id = 77 distance = 3 level_vertex_id = 237361 character_profile = sim_stalker_master position = -41.189788818359,-10.432260513306,-77.327095031738 direction = 0,0,0 game_vertex_id = 77 distance = 3 level_vertex_id = 237361 Stworzyć dla tych NPC trzy logiki walker. Nazwy ścieżek, biorąc pod uwagę fakt, że później te NPC będą pod smartem. Powtarzam: N.B.! Nazwa punktu ścieżki musi zaczynać się od nazwy smarta!!! Współrzędne: way_1 position = -48.911376953125,-10.037826538086,-66.358123779297 game_vertex_id = 77 level_vertex_id = 230506 look_1 position = -47.987903594971,-10.038272857666,-63.149391174316 game_vertex_id = 77 level_vertex_id = 231168 way_2 position = -47.224723815918,-10.038061141968,-65.55248260498 game_vertex_id = 77 level_vertex_id = 232424 look_2 position = -47.987903594971,-10.038272857666,-63.149391174316 game_vertex_id = 77 level_vertex_id = 231168 way_3 position = -47.224723815918,-10.038061141968,-65.55248260498 game_vertex_id = 77 level_vertex_id = 232424 look_3 position = -50.319923400879,-10.042634963989,-63.688987731934 game_vertex_id = 77 level_vertex_id = 229168 I trzy kmap współrzędne: way_1_task position = -48.911376953125,-10.037826538086,-66.358123779297 game_vertex_id = 77 level_vertex_id = 230506 way_1_fire position = -48.808933258057,-10.04080581665,-63.063709259033 game_vertex_id = 77 level_vertex_id = 230516 way_2_task position = -47.224723815918,-10.038061141968,-65.55248260498 game_vertex_id = 77 level_vertex_id = 232424 way_2_fire position = -48.808933258057,-10.04080581665,-63.063709259033 game_vertex_id = 77 level_vertex_id = 230516 way_3_task position = -47.224723815918,-10.038061141968,-65.55248260498 p0:game_vertex_id = 77 p0:level_vertex_id = 232424 way_3_fire position = -48.808933258057,-10.04080581665,-63.063709259033 game_vertex_id = 77 level_vertex_id = 230516 Przetestuj działanie logiki na stworzonych NPC-ach. way_*_task — miejsce, gdzie usiądzie NPC. Działa tylko pod smartem. way_*_fire — tam, gdzie będzie się patrzył. Używa się tego, jeśli NPC siadają wokoło ogniska. JEŚLI POD OGNISKIEM NIE MA SIATKI AI, WTEDY NIE MOŻNA USTAWIĆ TAM WAYPOINTU! W przykładzie pod ogniskiem nie ma SI, więc wszystkie fire są zespawnowane obok ogniska. ŹRÓDŁO: https://ap-pro.ru/forums/topic/1204-soc-urok-po-sozdaniyu-respawn-monstrov/ Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.