Skocz do zawartości

Lekcja odnośnie tworzenia punktu respawn dla mutantów [SoC]


Gość Diegtiariow

Rekomendowane odpowiedzi

Gość Diegtiariow

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/

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

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