Перейти к контенту

Рекомендуемые сообщения

Куфзук,

Влияет :) на память. Если смотреть на предыдущий пост - речь о монстрах. В этом случае - зависимость прямая.

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

Ссылка на комментарий

Сделал на новой локации смарт, камп_зону и смарт_каверы, но почему то НПС не реагируют на смарт_каверы, тупо рассаживаясь в лагере как попало...

[6001]

; cse_abstract properties

section_name = camp_zone

name = mil_a1_camp_zone

position = -236.838,-12.775,51.166

direction = 1,0,0.25

 

; cse_alife_object properties

game_vertex_id = 1072

distance = 0

level_vertex_id = 89304

object_flags = 0xffffff3e

custom_data = <<END

[camp]

cfg = scripts\camp.ltx

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 7

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

[6002]

; cse_abstract properties

section_name = smart_cover

name = mil_a1_animpoint_1

position = -239.131,-12.305,51.889

direction = 1,0,0.25

 

; cse_alife_object properties

game_vertex_id = 1072

distance = 0

level_vertex_id = 88262

object_flags = 0xffffffbf

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 2

 

; cse_smart_cover properties

cse_smart_cover__unk1_sz = animpoint_sit_low

cse_smart_cover__unk2_f32 = 0

enter_min_enemy_distance = 15

exit_min_enemy_distance = 10

 

; se_smart_cover properties

last_description = animpoint_sit_low

loopholes = animpoint_sit_low,1

 

[6003]

; cse_abstract properties

section_name = smart_cover

name = mil_a1_animpoint_2

position = -234.561,-12.655,53.732

direction = -0.889,0,-0.456

 

; cse_alife_object properties

game_vertex_id = 1072

distance = 0

level_vertex_id = 90351

object_flags = 0xffffffbf

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 2

 

; cse_smart_cover properties

cse_smart_cover__unk1_sz = animpoint_sit_low

cse_smart_cover__unk2_f32 = 0

enter_min_enemy_distance = 15

exit_min_enemy_distance = 10

 

; se_smart_cover properties

last_description = animpoint_sit_low

loopholes = animpoint_sit_low

 

[6004]

; cse_abstract properties

section_name = smart_cover

name = mil_a1_animpoint_3

position = -234.809,-12.653,50.682

direction = -0.491,0,0.87

 

; cse_alife_object properties

game_vertex_id = 1072

distance = 0

level_vertex_id = 90347

object_flags = 0xffffffbf

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 2

 

; cse_smart_cover properties

cse_smart_cover__unk1_sz = animpoint_sit_low

cse_smart_cover__unk2_f32 = 0

enter_min_enemy_distance = 15

exit_min_enemy_distance = 10

 

; se_smart_cover properties

last_description = animpoint_sit_low

loopholes = animpoint_sit_low

 

[6005]

; cse_abstract properties

section_name = smart_terrain

name = mil_a1

position = -237.397,-12.659,54.107

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 1072

distance = 0

level_vertex_id = 88775

object_flags = 0xffffff3e

custom_data = <<END

[smart_terrain]

cfg = scripts\military\smart\mil_a1.ltx

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 5

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; se_smart_terrain properties

 

На другой локе делал также и там работает.....

Изменено пользователем ZeeK

Не соответствует. N6260

Ссылка на комментарий
На другой локе делал также и там работает.....

Если ты уверен что на другой локе у тебя идентичный код, и они там работают, то вывод только один - ты локацию в скриптах регистрировал?

Freedom

Ссылка на комментарий

Вот пример с другой локи и там все работает, а разница только в координатах

[7173]

; cse_abstract properties

section_name = camp_zone

name = marsh_a2_camp_zone

position = 401.41619873047,4.1340670585632,265.68002319336

direction = -1,0,0

 

; cse_alife_object properties

game_vertex_id = 934

distance = 0

level_vertex_id = 403511

object_flags = 0xffffff3e

custom_data = <<END

[camp]

cfg = scripts\camp.ltx

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 5.84479999542236

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

[7174]

; cse_abstract properties

section_name = smart_cover

name = marsh_a2_animpoint_1

position = 402.14743041992,3.83748960495,267.6418762207

direction = -1,0,0

 

; cse_alife_object properties

game_vertex_id = 934

distance = 0

level_vertex_id = 404429

object_flags = 0xffffffbf

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 2

 

; cse_smart_cover properties

cse_smart_cover__unk1_sz = animpoint_sit_low

cse_smart_cover__unk2_f32 = 0

enter_min_enemy_distance = 15

exit_min_enemy_distance = 10

 

; se_smart_cover properties

last_description = animpoint_sit_low

loopholes = animpoint_sit_low,1

 

[7175]

; cse_abstract properties

section_name = smart_cover

name = marsh_a2_animpoint_2

position = 402.99615478516,3.8279237747192,265.46243286133

direction = 0,-1,0

 

; cse_alife_object properties

game_vertex_id = 934

distance = 0

level_vertex_id = 405424

object_flags = 0xffffffbf

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 2

 

; cse_smart_cover properties

cse_smart_cover__unk1_sz = animpoint_sit_low

cse_smart_cover__unk2_f32 = 0

enter_min_enemy_distance = 15

exit_min_enemy_distance = 10

 

; se_smart_cover properties

last_description = animpoint_sit_low

loopholes = animpoint_sit_low

 

[7176]

; cse_abstract properties

section_name = smart_cover

name = marsh_a2_animpoint_3

position = 401.12551879883,3.8237624168396,264.33709716797

direction = 2,0,0

 

; cse_alife_object properties

game_vertex_id = 934

distance = 0

level_vertex_id = 403957

object_flags = 0xffffffbf

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 2

 

; cse_smart_cover properties

cse_smart_cover__unk1_sz = animpoint_sit_low

cse_smart_cover__unk2_f32 = 0

enter_min_enemy_distance = 15

exit_min_enemy_distance = 10

 

; se_smart_cover properties

last_description = animpoint_sit_low

loopholes = animpoint_sit_low

 

 

Ниодну локу в скриптах не регистрировал...

Изменено пользователем ZeeK

Не соответствует. N6260

Ссылка на комментарий

ZeeK,

Координаты в алл спавне принято указывать целиком - это не скрипты. Если желаете усадить людей - гораздо проще и лучше просто указать типа такого

 

[kamp]

center_point = amerika_camp_center

path_walk = amerika_camp_center_task

radius = 2.1

 

И всё - никаких камп_зон и смарт_каверов. К тому же, у ПЫС не было дин аномалий, а если вы их используете - наловите вылетов по вертексам - придётся ещё и каждую зону в исключения прописывать

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

Ссылка на комментарий

Заметил такую фишку в ЗП, что когда отключен худ, то не слышно детекторов радиации и аномалий... Как сделать так, чтоб эти детекторы не пикали при выключенном худе, когда открыт инвентарь ГГ?

Изменено пользователем lambdist
Ссылка на комментарий

Здравствуйте, возникла проблема, делаю схему поведения, суть в том что если возле НПС есть трупы то он их будет обыскивать, вроде бы логический все верно, но на самом деле нет, НПС тупо стоят не идут на места где трупы, а при стрельбе по ним или разговоре вылет:

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...:\s.t.a.l.k.e.r\gamedata\scripts\xr_motivator.script:209: attempt to index field 'object' (a nil value)

 

Что значит эта ошибка знаю, но из-за чего возникла не могу сообразить.

 

Алгоритм построения схемы усвоил из урока на вики, изучением скриптов сталкера (схем поведения) более глубже изучил, но при создании своей схемы столкнулся с такой вот проблемой. Вот сам скрипт схемы:

 

priperty_base = 1777

property_object_for_shmon = priperty_base + 1

 

property_obj_base = 666

property_obj_item = property_obj_base + 1

 

time_run = 1000 * 5

dist = 30

tab_id_shmon = {}

bad_id = {}

 

local timer,last

 

class "evaluator_object_for_shmon" (property_evaluator)

 

function evaluator_object_for_shmon:__init(name, storage) super (nil, name)

self.st = storage

end

 

function evaluator_object_for_shmon:evaluate()

--fdb.how_table_in_table(tab_id_shmon)

self.position = self.object:position()

if timer == nil then

timer = time_global() + time_run

else last = timer - time_global()

end

if last == nil then

last = timer - time_global()

end

if last <= 0 then

timer = nil last = nil

local npc

for k=1, 65534 do

npc = level.object_by_id(k)

if npc and not npc:alive() and is_is_tab_id_shmon(k) and is_bad_id(k) and self.position:distance_to(npc:position()) < dist then

tab_id_shmon[self.object:name()] = {}

table.insert(tab_id_shmon[self.object:name()],k)

fdb.logS(">>npc:id() = "..k)

end

end

end

--fdb.logS("flush")

return is_chtonit(self.object)

end

 

 

class "action_go_to_shmon" (action_base)

 

function action_go_to_shmon:__init(obj, storage) super (nil, obj)

self.st = storage

end

 

function action_go_to_shmon:initialize()

action_base.initialize(self)

fdb.how_table_in_table(tab_id_shmon)

fdb.logS("flush")

self.obj.lv = self.object:level_vertex_id()

self.obj_item = level.object_by_id(tab_id_shmon[self.object:name()])

self.obj_item.lv = self.obj_item:level_vertex_id()

self.obj:set_dest_level_vertex_id(self.obj_item.lv)

end

 

function action_go_to_shmon:execute()

action_base.execute(self)

fdb.logS("function action_go_to_shmon:execute()")

if self.obj_item.lv ~= self.obj:level_vertex_id() then

self.obj_item.lv = self.obj_item:level_vertex_id()

self.obj:set_dest_level_vertex_id(self.obj_item.lv)

end

end

 

function action_go_to_shmon:finalize()

action_base.finalize (self)

end

 

 

function add_to_binder(npc,ini,scheme,section,st)

local manager = npc:motivation_action_manager()

manager:add_evaluator(property_object_for_shmon, evaluator_object_for_shmon("evaluator_object_for_shmon",st))

fdb.logS("flush")

local action = action_go_to_shmon(npc, st)

action:add_precondition (world_property(stalker_ids.property_alive, true))

action:add_precondition (world_property(stalker_ids.property_danger,false))

action:add_precondition (world_property(stalker_ids.property_enemy, false))

action:add_precondition (world_property(stalker_ids.property_anomaly,false))

action:add_precondition (world_property(property_object_for_shmon), true)

xr_motivator.addCommonPrecondition(action)

action:add_effect (property_object_for_shmon, false)

manager:add_action (property_obj_item, action)

end

 

---------------

function set_scheme(npc,ini,scheme,section)

local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)

st.enabled=true

end

 

function disable_scheme(npc,scheme)

local st = db.storage[npc:id()][scheme]

if st then

st.enabled = false

end

end

---------------

 

function is_is_tab_id_shmon(id)

local count = 0

local bool = true

for k,v in pairs(tab_id_shmon) do

for q=1,#v do

if v[q] == id then

count = count + 1

end

end

end

if count == 0 then

bool = true

else bool = false

end

return bool

end

 

function is_bad_id(id)

local bool = true

for k=1, #bad_id do

if bad_id[k] == id then

bool = false

break

end

end

return bool

end

 

function is_chtonit(npc)

local name = npc:name()

local bool = false

if tab_id_shmon[name] and #tab_id_shmon[name] > 0 and tab_id_shmon[name][1] ~= nil then

bool = true

end

return bool

end

 

 

Вот как подключил:

 

...

-- Загрузка модулей сталкеров:

----------------------------------------------------------------------

load_scheme("xr_danger", "danger", stype_stalker)

load_scheme("xr_abuse", "abuse", stype_stalker)

load_scheme("xr_walker", "walker", stype_stalker)

load_scheme("xr_remark", "remark", stype_stalker)

load_scheme("xr_sleeper", "sleeper", stype_stalker)

load_scheme("xr_kamp", "kamp", stype_stalker)

load_scheme("xr_camper", "camper", stype_stalker)

load_scheme("xr_meet", "meet", stype_stalker)

--load_scheme("xr_reactions", "reactions", stype_stalker)

load_scheme("xr_test", "test", stype_stalker)

load_scheme("xr_heli_hunter", "heli_hunter", stype_stalker)

load_scheme("xr_attendant", "follower", stype_stalker)

load_scheme("xr_combat", "combat", stype_stalker)

load_scheme("xr_death", "death", stype_stalker)

load_scheme("xr_use", "use", stype_stalker)

load_scheme("xr_hit", "hit", stype_stalker)

load_scheme("xr_wounded", "wounded", stype_stalker)

load_scheme("xr_rest", "rest", stype_stalker)

load_scheme("xr_meet", "actor_dialogs",stype_stalker)

load_scheme("xr_combat_ignore", "combat_ignore", stype_stalker)

load_scheme("xr_patrol", "patrol", stype_stalker)

load_scheme("xr_shmon", "shmon", stype_stalker)

...

 

 

function motivator_binder:net_spawn(sobject)

printf("motivator_binder:net_spawn(): self.object:name()='%s'", self.object:name())

--memusage.collect_info(self.object, "netspawn_start")

if not object_binder.net_spawn(self, sobject) then

return false

end

 

-- if self.object:spawn_ini():section_exist("dont_spawn_online") then

-- printf("!!!OFFLINE")

-- alife():object(self.object:id()).dont_spawn_online = true

-- end

 

db.add_obj(self.object)

 

-- Все CALLBACK-и ставить здесь:

local manager = self.object:motivation_action_manager()

manager:add_evaluator(xr_shmon.property_object_for_shmon, property_evaluator_const(false))

...

function addCommonPrecondition(action)

action:add_precondition (world_property(xr_shmon.property_object_for_shmon,false))

--action:add_precondition (world_property(xr_evaluators_id.reaction,false))

action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false))

action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0, false))

action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false))

action:add_precondition (world_property(xr_evaluators_id.abuse_base, false))

end

 

 

function disable_generic_schemes(npc, stype)

if stype == modules.stype_stalker then

xr_combat.disable_scheme(npc, "combat")

xr_use.disable_scheme(npc, "use")

xr_hit.disable_scheme(npc, "hit")

xr_meet.disable_scheme(npc, "actor_dialogs")

xr_heli_hunter.disable_scheme(npc, "heli_hunter")

xr_combat_ignore.disable_scheme(npc, "combat_ignore")

xr_shmon.disable_scheme(npc,"shmon")

elseif stype == modules.stype_mobile then

mob_combat.disable_scheme(npc, "mob_combat")

mob_trade.disable_scheme(npc, "mob_trade")

elseif stype == modules.stype_item then

ph_on_hit.disable_scheme(npc, "ph_on_hit")

elseif stype == modules.stype_heli then

xr_hit.disable_scheme(npc, "hit")

end

end

...

function enable_generic_schemes(ini, npc, stype, section)

if stype == modules.stype_stalker then

...

local heli_hunter_section = utils.cfg_get_string(ini, section, "heli_hunter", npc, false, "")

xr_heli_hunter.set_scheme(npc, ini, "heli_hunter", heli_hunter_section)

 

local shmoning = utils.cfg_get_string(ini, section, "shmon", npc, false, "")

xr_shmon.set_scheme(npc,ini,"shmon",shmoning)

...

 

 

Все скрипты валидны, помогите пожалуйста разобраться.

Обычно при подобных ошибках сам разбираюсь, так как не люблю загружать своими проблемами других, но в данном случае чувствую что сам не смогу разобраться, опыта не хватит ...

 

 

 

Если же отключить экшен типа так:

function add_to_binder(npc,ini,scheme,section,st)

local manager = npc:motivation_action_manager()

manager:add_evaluator(property_object_for_shmon, evaluator_object_for_shmon("evaluator_object_for_shmon",st))

fdb.logS("flush")

--[[local action = action_go_to_shmon(npc, st)

action:add_precondition (world_property(stalker_ids.property_alive, true))

action:add_precondition (world_property(stalker_ids.property_danger,false))

action:add_precondition (world_property(stalker_ids.property_enemy, false))

action:add_precondition (world_property(stalker_ids.property_anomaly,false))

action:add_precondition (world_property(property_object_for_shmon), true)

xr_motivator.addCommonPrecondition(action)

action:add_effect (property_object_for_shmon, false)

manager:add_action (property_obj_item, action)]]

end

 

Тогда НПС продолжают выполнять свою прежнюю работу, и работают только эвалуаторы, если же просто оставить так:

function add_to_binder(npc,ini,scheme,section,st)

local manager = npc:motivation_action_manager()

manager:add_evaluator(property_object_for_shmon, evaluator_object_for_shmon("evaluator_object_for_shmon",st))

fdb.logS("flush")

local action = action_go_to_shmon(npc, st)

--[[action:add_precondition (world_property(stalker_ids.property_alive, true))

action:add_precondition (world_property(stalker_ids.property_danger,false))

action:add_precondition (world_property(stalker_ids.property_enemy, false))

action:add_precondition (world_property(stalker_ids.property_anomaly,false))

action:add_precondition (world_property(property_object_for_shmon), true)

xr_motivator.addCommonPrecondition(action)

action:add_effect (property_object_for_shmon, false)

manager:add_action (property_obj_item, action)]]

end

 

То НПС опять начинают тупо стоять, и не идут к трупам ...

Изменено пользователем Куфзук
Ссылка на комментарий

У меня возникла проблема с acdc 1.0003: отказывается собирать all.spawn с новыми артами. И еще добавил локацию, собрал и все работает, но назад разобрать- разбирает какую-то ерунду.

Скажите, что я делаю не так?

 

Добавлено через 163 мин.:

еще подскажите такое: game.graph (я понял это Spawn doesn't correspond to the graph : REBUILD SPAWN! из-за него?)

Ссылка на комментарий

midichs

Если отказывается собирать all.spawn с новыми предметами (пусть то будут твои арты, или аномалии, например), нужно добавить их в acdc.pl. Ищешь такую строчку (у меня она 2095):

    af_cristall                => 'cse_alife_item_artefact',

И ниже добавляешь свой артефакт:

    название_арта                => 'cse_alife_item_artefact',

Если тебе нужно добавить свои патроны, то тоже куда-нибудь рядом добавляешь:

    название_патрона                => 'cse_alife_item_ammo',

Аномалии:

    название_аномалии            => 'se_zone_anom',

Предмет (типа еды и т.д.):

    название_предмета                    => 'cse_alife_item',

И так далее и так далее. В общем, добавляешь что тебе нужно, ориентируясь на уже добавленные секции.

-------

разбирает какую-то ерунду

Ерунда - понятие растяжимое.

-------

еще подскажите такое: game.graph (я понял это Spawn doesn't correspond to the graph : REBUILD SPAWN! из-за него?)

Спавн не соответствует графу. Переделайте спавн!

У тебя в game.graph добавлена новая локация? Но это уже не ко мне, я такие дела делать не пробовал. Просто читал, что такое нужно делать.

 

 

Добавлено через 16 мин.:

Взял скрипт из АМК - watcher_act. Нашёл вот это (всего лишь часть таблицы):

local valuable_clsid={
    [clsid.art_black_drops]=true,
    [clsid.art_dummy]=true,
    [clsid.device_pda]=true,
    [clsid.equ_stalker_s]=true,
    [clsid.obj_antirad]=true,
    [clsid.obj_food]=true,
    [clsid.wpn_ammo_vog25]=true,
    [clsid.wpn_knife_s]=true,
    [clsid.wpn_lr300_s]=true,
    [clsid.wpn_scope_s]=true,
    [clsid.wpn_silencer]=true,
}

За что она отвечает? Предметы, которые надо поднимать сталкерам? Каким образом тогда добавлять свои? Тут названия не такие, как в их секциях.

Изменено пользователем Disord
Ссылка на комментарий

Disord

Смотри lua_help - C++ class clsid - там перечислены все clsid'ы объектов сталкеров.

Список clsid - это перечисление (enum), делается в программировании для удобства использования, значение - определенное число, которое является идентификтором определенной группы объектов\ или одного объекта. Например clsid.obj_medkit это все виды аптечек, а clsid.obj_bolt - только болт.

Проверяется так if obj:clsid()==clsid.obj_medkit then (где obj - это юзердата объекта).

Изменено пользователем Garry_Galler
  • Спасибо 1
Ссылка на комментарий

eXiu А АИ сетка? Нпс твой домик не обойдут...

Цитата из ст_вики:

[vedro]:identity_immunities ;vedro — название спавн-секции предмета (Потом мы будем через него спавнить). Пишется латиницей.

$spawn = "physics\object" ;путь спавн-секции в дереве спавн-объектов в СДК (если не пользуетесь СДК, то особой важности не имеет).

visual = objects\dynamics\decor\vedro_01.ogf ;Путь до модели физического объекта из папки meshes.

class = O_PHYS_S

remove_time = 60000 ;Время через которое объект исчезнет. Число до от 0 до 9999, если поставить 9999 то он просуществует очень долго.

Так можно любой предмет в игру засунуть через спавн.

Изменено пользователем amik

Мой архив

Сталкером не занимаюсь.

Ссылка на комментарий

Уже не в тему ведем тему)). eXiu качай сталкер контент, там домиков много. Только в огм формат перегони через АЕ

Мой архив

Сталкером не занимаюсь.

Ссылка на комментарий

Всем привет! Есть проблема и вопрос :)

Вот у меня actor_binder:reinit() в bind_stalker есть 3 (как это называется?

:blush: ):

    self.object:set_callback(callback.use_object, self.use_callback, self)
    self.object:set_callback(callback.use_object, self.use_inventory_item, self)
    self.object:set_callback(callback.use_object, self.use_object, self)

Ниже 3 функции:

function actor_binder:use_inventory_item(item)
    --// xr_companion
    xr_companion.use_inventory_item(item:section())
    --// xr_companion
end

function actor_binder:use_callback(obj, who)
---------bolt mod------------------
    bolt_mod.on_actor_use(obj)
-----------------------------------
end

function actor_binder:use_object(obj)
    dis_mod.use_snd(obj)
end

Первая - отвечает за вызов окошка с выбором действий при использовании коротковолновой рации, вторая - произведение различные операций с фейковым болтом, а третья - за воспроизведение звука при употреблении еды/воды. Проблема в том, что одна из этих функций не работает - с коротковолновой рацией. Если удалить третью, со звуком, то первая работает. Почему так? Пробовал вызов функции из третьей функции use_snd переместить во вторую - не работает воспроизведение звука. Что такое и почему не работает?

 

Создал секцию респавна:

[12790]
; cse_abstract properties
section_name = respawn
name = respawn_boars
position = 147.049,5.436,273.007
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 4302
distance = 10
level_vertex_id = 989271
object_flags = 0xffffff3e
custom_data = <<END
[respawn]
respawn_section = boar_weak,12, boar_normal,6, boar_strong,3
max_count = 4
min_count = 5
max_spawn = 10
idle_spawn = medium
conditions = {=gulag_population_le(gar_old_boars:3)} 60,0
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_respawn properties

 

Выкосил весь гулаг gar_old_boars. Сколько примерно времени надо ждать респавна? Он в происходит в оффлайн?

 

Изменено пользователем Disord
Ссылка на комментарий
Всем привет! Есть проблема и вопрос :)

Вот у меня actor_binder:reinit() в bind_stalker есть 3 (как это называется?

:blush: ):

    self.object:set_callback(callback.use_object, self.use_callback, self)
    self.object:set_callback(callback.use_object, self.use_inventory_item, self)
    self.object:set_callback(callback.use_object, self.use_object, self)

Ниже 3 функции:

function actor_binder:use_inventory_item(item)
    --// xr_companion
    xr_companion.use_inventory_item(item:section())
    --// xr_companion
end

function actor_binder:use_callback(obj, who)
---------bolt mod------------------
    bolt_mod.on_actor_use(obj)
-----------------------------------
end

function actor_binder:use_object(obj)
    dis_mod.use_snd(obj)
end

Первая - отвечает за вызов окошка с выбором действий при использовании коротковолновой рации, вторая - произведение различные операций с фейковым болтом, а третья - за воспроизведение звука при употреблении еды/воды. Проблема в том, что одна из этих функций не работает - с коротковолновой рацией. Если удалить третью, со звуком, то первая работает. Почему так? Пробовал вызов функции из третьей функции use_snd переместить во вторую - не работает воспроизведение звука. Что такое и почему не работает?

Потому что не нужно вешать на один колбэк несколько функций, следует объединить их в одну.

Ссылка на комментарий

Вобщем, напоролся на непонятку при решении одной, кхм, задачи.

 

Задача была такая: Если гг передает определенный итем в инвентарь трупа или ящика, то - уже в инвентаре трупа\ящика удалить этот предмет и заспавнить другой.

Как я себе представляю метод решения: в дроп-колбэке отслеживаем скидывание предмета (а он срабатывает и на собственно дроп, и на передачу трупу\ящику, и на передачу в диалоге), затем проверяем наличие системного инфопоршня ui_car_body, сохраняем объект в переменную, и из метода actor:update(delta) смотрим парент этого объекта, если получаем не 0 и не -1 - значит спавним в инвентарь (нпс? а у нас труп\ящик...) по полученному ид нового владельца, а старый объект удаляем по его опять же ид.

Собственно как я это делал:

В actor_binder:on_item_drop (obj)
twoteam.drop_medics(obj)

* * *
function drop_medics(obj)
--- запускает систему замены предмета, если произошла передача ящику или трупу
if obj then
local section = obj:section()
if section == "medkit" then
    if db.actor:has_info("ui_car_body") then --- передача ящику/трупу
        twoteam.start_parent_respawn(obj, "wpn_pm")
    end
end
end
end

local respawn_parent_need = false --- ключ, надо или нет заменять предмет
local respawn_parent_object --- переданный объект, который потом удаляем
local respawn_parent_section = "" --- секция нового предмета --- эти объявлены просто в файле, вне всяких функций

function get_parent()
--- проверяет парент сохраненного объекта
if respawn_parent_object then
return respawn_parent_object:parent()
end
end

function start_parent_respawn(item, section)
--- сохраняет данные переданного объекта, и секцию того что нужно заспавнить вместо него
if item and section then
respawn_parent_need = true
respawn_parent_object = item
respawn_parent_section = section
return true
else return false
end
end

function wait_respawn() --- update замены в чужих инвентарях
--- вызывается из update актора, проверяет парент переданного объекта, если не 0 и не -1 запускает замену.
--- после замены обнуляет сохраненные данные, предотвращая повторные срабатывания
if respawn_parent_need and respawn_parent_object then
    local parent = twoteam.get_parent()
    if parent == 0 or parent == -1 then return nil 
    else
        twoteam.reitem_parent(respawn_parent_object, respawn_parent_section, parent)
        respawn_parent_need = false
        respawn_parent_object = nil
        respawn_parent_section = ""
    end
end
end

function reitem_parent(item, section, parentid)
--- заменяет предмет item (game_object*) на section. (string). замена происходит в инвентаре нпс/трупа/ящика с id = parentid. точнее, замена должна быть поидее...
    local sim = alife()
    if not (sim and item and section and parentid) then return end --- need msg to log
    local seid = item:id()
    if seid then
        local seobj = sim:object(seid)
        if seobj then
        sim:release(seobj, true) --- удаляем старый объект
        spawn.inv(section, parentid) --- спавним новый
        end
    end
end

function inv(item,npc_id) --- spawn.inv
    if npc_id == nil then
        npc_id = db.actor:id()
    end
    local obj = alife():create(item,vector():set(0,0,0),1,1,npc_id)
    return obj
end

 

Ну вот, комментариями снабдил для упрощения разбирательств :)

Что происходит в итоге: Когда передаю аптечку в инвентарь ящика, она оттуда просто исчезает, ПМ не спавнится. А когда передаю трупу, почему то виснет биндер актора. (определил по исчезновению матраса после даблклика).

Что я делаю не так? и можно ли через спавн по нпс_ид спавнить в инвентарь трупа/ящика, или это только для живых?

 

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Привет всем.

Начал учиться спауну. Для теста заспаунил модель вагончика.

Но вот небольшая проблемка.

Модель застряла в земле.....

328074.jpg

Как это исправить, подскажите пожалуйста... Зарание спасибо.

Ах да, это выравнивается выстрелом в вагон. Он как бы выстреливается и встаёт на место ровно....

 

А какие значения строки direction, в all.spawn. Куфзук

 

Добавлено через 56 мин.:

Куфзук,

[1089]
; cse_abstract properties
section_name = physic_object
name = trader_physic_object0013
position = -172.456924,-6.790123,-33.856129
direction = 0.958322,0.000000,0.285691

; cse_alife_object properties
game_vertex_id = 71
distance = 12.5999994277954
level_vertex_id = 78147
object_flags = 0xfffffffa

; cse_visual properties
visual_name = prop\prop_workers

; cse_ph_skeleton properties
skeleton_name = 

; cse_alife_object_physic properties
physic_type = 0x3
mass = 99999999999

 

 

Попробуй прописать в строке direction нули и вместо массы в много девяток, лучше пропиши вот такую кустом дату:

custom_data = <<END
[collide]
ignore_static
END

Куфзук

Изменено пользователем Куфзук
Ссылка на комментарий

:offtopic:

Для общей информации. Товарищ erlik (Garry_Galler) сделал недавно АИ схему по этому поводу:

AI схема - "Разборка в баре"

Тестовый вариант (имеет некоторые ограничения, поэтому возможно будет дорабатываться).

Для включения схемы просто зайдите в бар и возьмите чужое со стола.

За все дальнейшее я не отвечаю.

Есть возможность включить схему не только в баре - читайте комментарии к схеме в файле m_bar.script.

Но по умолчанию она включена только для бара.

 

Описание:

При попытке взять предмет, находящийся неподалеку от NPC, он может обидеться на это и дать по фейсу. Если попытаетесь уйти - бросится догонять, если не догонит - запустит вам чем-нибудь вслед.

Если попадете под удар - не ждите что NPC ограничится только одним ударом - их может быть гораздо больше, и каждый отнимает немного здоровья. Может и до полусмерти забить.

 

PS: Недоработки схемы прежде всего в том, что под нее берется только один сталкер за раз, а хотелось бы сделать, чтобы одновременно могли подключиться к действию и другие, хотя бы в качестве активных наблюдателей. НО, так как это моя первая AI схема, то много еще неясно и есть куча нюансов, в которых мне пока не удалось разобраться. Например, не получилось сделать временное отключение привязки сталкеров к рестриктору, из которого им запрещено выходить.(Сами методы то мне известны, только работают они не так как хотелось бы). Управление движением NPC тоже непростая, как выяснилось, штука Поэтому некоторые сталкеры могут двигаться кривовато. Кстати, Информатор в баре с трудом берется по контроль схемы - в большинстве случаев он не двигается с места - у меня только пару раз срывался и бежал догонять ГГ. Бармен тоже не хочет подчиняться.

В общем, есть еще куча "неясностей и непонятностей" (как сказала бы кэролловская Алиса), распутать которые мне еще предстоит.

 

Изменено пользователем amik

Мой архив

Сталкером не занимаюсь.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...