Jump to content

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


Recommended Posts

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/

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.