Envoyé par
Alixray
Ok merci, je vais voir ça.
EDIT: OMAGAD, quel c**. Merci ça marche!
EDIT 2: Vous connaissez pas un moyen pour que le pnj en question ne bouge pas?
Ca c'est dans les logics. J'ai perdu mon mod et j'avais pas mal travaillé sur le spawn, les schemes, etc. Mais il me reste un super exemple:
alife_l13_generators.ltx:
Code:
[9091]
; cse_abstract properties
section_name = smart_terrain ,-- type de section
name = smart_generators_village ;-- nom de la section
position = -110.64280700684,37.96125793457,-490.61651611328
direction = 0,0,0
; cse_alife_object properties
game_vertex_id = 2981
distance = 10.3999977111816
level_vertex_id = 198275
object_flags = 0xffffffbe
offline = false
custom_data = <<END
[smart_terrain]
type = smart_generators_village ;-- on précise le type de smart terrain. On pourrait y mettre un smart terrain générique du style general_lager
capacity = 2 ;-- PNJ max' pouvant être dans le smart terrain
;squad = 8
;groups = 5
communities = stalker ;-- type de pnj, ça se choppe dans gameplay_character.xml par exemple
END
; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 1.64799988269806
; cse_alife_space_restrictor properties
restrictor_type = 0
; se_smart_terrain properties
[9092]
; cse_abstract properties
section_name = stalker ;-- on veut spawner un stalker
name = village_stalker_0
position = -114.45696258545,37.383754730225,-478.50473022461 ;-- position
direction = 8.19198430690449e-006,-2.85659980773926,-2.44162747549126e-005 ;-- direction
; cse_alife_trader_abstract properties
money = 5000
character_profile = sim_stalker_master ;-- à récupérer dans les fichiers de conf.
; cse_alife_object properties
game_vertex_id = 2972
distance = 29.3999996185303
level_vertex_id = 193965
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
smart_generators_village = true ;-- le ST qu'occupera le PNJ
END
; cse_visual properties
visual_name = actors\neytral\stalker_neytral_exoskeleton
; cse_alife_creature_abstract properties
g_team = 0
g_squad = 18
g_group = 1
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =
upd:health = 1
upd:timestamp = 0x1d458
upd:creature_flags = 0x59
upd:position = -114.45696258545,37.383754730225,-478.50473022461 ;-- même position que plus haut
upd:o_model = 0
upd:o_torso = -2.85659980773926,8.19198430690449e-006,0
upd:g_team = 0
upd:g_squad = 18
upd:g_group = 1
; cse_alife_monster_abstract properties
upd:next_game_vertex_id = 65535 ;-- ne pas toucher
upd:prev_game_vertex_id = 65535 ;-- pareil
upd:distance_from_point = 0
upd:distance_to_point = 0
; cse_alife_human_abstract properties
predicate5 = 0,0,0,0,2
predicate4 = 0,1,1,0
; cse_ph_skeleton properties
upd:start_dialog =
; se_stalker properties
way_l13_generators.ltx:
Liste des points par lesquels passeront les stalker etc. Ca se comprend facilement.
Code:
[smart_generators_village_stalker_patrol0]
points = p0,p1,p2
p0:name = wp00
p0:position = -113.45696258545,37.383754730225,-478.50473022461
p0:game_vertex_id = 2972
p0:level_vertex_id = 193965
p0:links = p1(1)
p1:name = wp01
p1:position = -103.92042541504,37.586437225342,-478.10968017578
p1:game_vertex_id = 2994
p1:level_vertex_id = 205819
p1:links = p2(2)
p2:name = wp02
p2:position = -104.24591064453,37.516372680664,-476.03491210938
p2:game_vertex_id = 2994
p2:level_vertex_id = 205064
p2:links = p0(0)
gulag_generators.script (focalise toi sur la partie liée au smart_generators_village):
Cela permet d'appeler les logic en fonction d'un certains nombre de crytère
Code:
local t = {}
function load_job(sj, gname, type, squad, groups)
if type == "smart_generators_monolith" then --nom du type de smart terrain dont on veut charger le "job" (logic)
t = {}
t.section = "logic@smart_generators_monolith0" -- on appelle le logic dans gulag_*****.ltx
get_console():execute("appel_logic")
t.idle = 0
t.timeout = 0
t.prior = 100
t.state = {0}
t.squad = squad
t.group = groups[1]
t.position_threshold = 100
t.online = true
t.in_rest = ""
t.out_rest = ""
table.insert(sj, t)
end
if type == "smart_generators_giant" then
t = {}
t.section = "logic@smart_generators_giant0"
t.idle = 0
t.timeout = 0
t.prior = 100
t.state = {0}
t.squad = squad
t.group = groups[1]
t.position_threshold = 100
t.online = true
t.in_rest = ""
t.out_rest = ""
table.insert(sj, t)
end
if type == "smart_generators_village" then
t = {}
t.section = "logic@smart_generators_village0"
get_console():execute("appel_logic_village") -- retourne une erreur dans le fichier de log. Permet de vérifier la bonne exécution du script
t.idle = 0
t.timeout = 0
t.prior = 100
t.state = {0} -- état du smart terrain. On créé des états selon différentes conditions (jour, nui, pluie, soleil, etc). Libre à toi de faire ce qui te plait.
t.squad = squad
t.group = groups[1]
t.position_threshold = 100
t.online = true
t.in_rest = ""
t.out_rest = ""
table.insert(sj, t)
get_console():execute("job_village")
t = {section = "logic@smart_generators_village1",
idle = 0, timeout = 0, prior = 100, state = {0},squad = squad,
group = groups[1], position_threshold = 100, online = true, in_rest = "",
out_rest = "", predicate = function(obj_info) return obj_info.rank >= 900 end}
get_console():execute("table_insert")
table.insert(sj, t)
end
end
function load_ltx(gname, type) -- Ne pas toucher cette fonction
return nil
end
function load_states(gname, type) -- on charge l'état du smart terrain par cette fonction
if type == "smart_generators_monolith" then -- si le smart terrain est de type "smart_generators_monolit on appelle tel état
return function(gulag)
return 0 -- on apelle l'état 0
end
end
if type == "smart_generators_giant" then
return function(gulag)
return 0 -- äåíü
end
end
if type == "smart_generators_village" then
return function(gulag)
return 0 -- äåíü
end
end
end
function checkStalker(npc_community, gulag_type, npc_rank, se_obj) -- fonction qui permet de vérifier que le PNJ a bien le droit de se trouver dans le smart terrain
if gulag_type == "smart_generators_monolith" then
return npc_community == "monolith"
end
gulag_generators.ltx:
C'est dans ce fichier qu'on appelle les logic (voir le site du sdk pour plus de détails):
Code:
[logic@smart_generators_village0]
active = walker@smart_generators_village0
[walker@smart_generators_village0]
path_walk = stalker_patrol0
Smart_terrains_preset.ltx:
On spécifie quel type de PNJ/mutant peut spawn dans telle ou telle map:
Code:
[l13_generators]
monolith = novice, experienced, veteran, master
pseudo_gigant = normal, strong
cat = normal, strong
giant = normal, strong
Quoi que ça doit toujours trainer sur mon pc portable...
Concernant les attitudes des NPCs, tu trouveras pas mal de réponse ici:
http://sdk.stalker-game.com/en/index.php?title=Logic
Avec le code que je t'ai donné (en adaptant), tu peux faire beaucoup. Tout ce que je t'ai copié plus haut est fonctionnel et te montre la hiérarchie et les fichiers nécessaires à la création de smart terrain comprenant des PNJ ainsi que leur attittude.
A noter que tu peux créer un smart terrain et attendre que des PNJ généré automatiquement par les zones de respawns ne les remplissent automatiquement avec des Logics "de base".