Случайная подборка модов
ReBorn 2.50 «Артефакты смерти»
3.5
История Кота
3.4
Новый Арсенал 4.5
3.7
Холодная кровь
3.4
The Project Medeiros
3.7
Объединенный Пак 2.1
3.1
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
Архив - только для чтения
⚙ Модострой: Вопросница
Российская Федерация  Wolfstalker
Среда, 24.02.2016, 00:25 | Сообщение # 1
Статус:
Легенда:
Сообщений: 2258
Награды: 15
Регистрация: 05.04.2010

В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга


• Не флудить
• Предварительно просматривайте раздел, ведь ответ на ваш вопрос может быть там
• В своем вопросе указывайте платформу моддинга — Тень Чернобыля, Чистое небо или Зов Припяти




F.A.Q

  Злобная реклама
Среда, 24.02.2016, 00:25
Статус:
Сообщений: 666
Регистрация: 05.04.2010
Соединенные Штаты  Joni_009
Четверг, 24.03.2016, 12:55 | Сообщение # 586
Статус:
Бывалый:
Сообщений: 1008
Награды: 14
Регистрация: 25.05.2014

Цитата denis2000 ()
Вероятно флаг combat в смарт ковере установлен, но с такими анимациями это может привести к вылету.

Вот что прописано в smart_cover.
  Злобная реклама
Четверг, 24.03.2016, 12:55
Статус:
Сообщений: 666
Регистрация: 25.05.2014
Российская Федерация  antonnkz76
Четверг, 24.03.2016, 12:56 | Сообщение # 587
5 лет в Зоне
Статус:
Опытный:
Сообщений: 2342
Награды: 9
Регистрация: 26.02.2012

denis2000, скорее всего ты прав, только что это тестил и пока что все говорит в пользу этого. Сравнил еще с секциями ПЫСовских аномалий, там для некоторых типов созданы секции аномалий с припиской _noart, и там написано мол не рождаются артефакты. Надо поэксперементировать с рождением артов.
  Злобная реклама
Четверг, 24.03.2016, 12:56
Статус:
Сообщений: 666
Регистрация: 26.02.2012
Российская Федерация  Dmitrii2015
Четверг, 24.03.2016, 12:57 | Сообщение # 588
Статус:
Гость:
Сообщений: 33
Награды: 0
Регистрация: 20.10.2015

denis2000, а где он находится (кондлист)?
  Злобная реклама
Четверг, 24.03.2016, 12:57
Статус:
Сообщений: 666
Регистрация: 20.10.2015
Украина  _S_k_i_F_
Четверг, 24.03.2016, 13:26 | Сообщение # 589
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

Joni_009, поставь галочки на is combat cover и can fire. А если хочешь чтобы НПС не воевал, то в логику ему
Код
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true

-----------------------------------------------------------------------
Нужна помощь! У меня стоит отрезание частей мутантов, но если часть не отрезал и пересохранился, то её уже отрезать нельзя. Как быть? Уже очень долго разными способами пытался исправить этот момент, но ничего не получается. Вот мой биндер монстров
Код
-----------------------------------------------------------------------------------
-- Monster binding
-----------------------------------------------------------------------------------

function bind(obj)
    printf("_bp: monster.bind: name='%s', id='%d'", obj:name(), obj:id())

    -- Для спауна
    --xr_spawner.spawn_client(obj)

    local new_binder = generic_object_binder(obj)
    obj:bind_object(new_binder)
end

local last_update = 0 -- combat
------------------------------------------------------------------------------------
class "generic_object_binder" (object_binder)

function generic_object_binder:__init(obj) super(obj)
    self.loaded = false
end

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
end

function generic_object_binder:reinit()
    object_binder.reinit(self)

    db.storage[self.object:id()] = { }

    self.st = db.storage[self.object:id()]

    self.object:set_callback(callback.patrol_path_in_point, self.waypoint_callback, self)
    self.object:set_callback(callback.hit,     self.hit_callback,  self)
    self.object:set_callback(callback.death,    self.death_callback,    self)
    self.object:set_callback(callback.sound,     self.hear_callback,  self)
end

function generic_object_binder:update(delta)
    object_binder.update(self, delta)

     local npc = self.object
  local npc_st = db.storage[npc:id()]
  local invulnerability = utils.cfg_get_string(npc_st.ini, npc_st.active_section, "invulnerable", npc, false, "", nil)
           if invulnerability ~= nil then
   local condlist = xr_logic.parse_condlist(npc, npc_st.active_section, "invulnerable", invulnerability)  
    local invulner = xr_logic.pick_section_from_condlist(db.actor, npc, condlist) == "true"
     if npc:invulnerable() ~= invulner then
      npc:invulnerable(invulner)
     end
   end
    
    if xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] and self.object:best_enemy() == nil then
  xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] = nil
    end

    local squad = get_object_squad(self.object)
    local object_alive = self.object:alive()
    --' printf("_bp: generic_object_binder: UPDATE [name='%s' time=%d]",
    --'    self.object:name(), time_global())

    if not object_alive then
  return
    end

    self.object:set_tip_text("")
    local st = db.storage[self.object:id()]
    if st ~= nil and st.active_scheme ~= nil then
  xr_logic.try_switch_to_another_section(self.object, st[st.active_scheme], db.actor)
    end
    -- Апдейт отряда
    if squad ~= nil then
  if squad:commander_id() == self.object:id() then
   squad:update()
  end
    end

    self.object:info_clear()

    local active_section = db.storage[self.object:id()] and db.storage[self.object:id()].active_section
    if active_section then
  self.object:info_add("section: " .. active_section)
    end
    local best_enemy = self.object:best_enemy()
    if best_enemy then
  self.object:info_add("enemy: " .. best_enemy:name())
    end
    self.object:info_add(self.object:name().." ["..self.object:team().."]["..self.object:squad().."]["..self.object:group().."]")

    if alife():object(self.object:id()) == nil then
  return
    end

    if squad ~= nil then
  self.object:info_add("squad_id: " .. squad:section_name())
  if squad.current_action ~= nil then
   local target = squad.assigned_target_id and alife():object(squad.assigned_target_id) and alife():object(squad.assigned_target_id):name()
   self.object:info_add("current_action: " .. squad.current_action.name .."["..tostring(target).."]")
  end
    end

-- Если есть враг , то идем в комбат !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    if self.object:get_enemy() then
  if xr_logic.mob_captured(self.object) then
   xr_logic.mob_release(self.object)
  end
  return
    end

    if squad and squad.current_action and squad.current_action.name == "reach_target" then
  local squad_target = simulation_objects.get_sim_obj_registry().objects[squad.assigned_target_id]
  if squad_target == nil then return end
    --    printf("_bp: mob_reach_task:reset_scheme: %s", self.object:name())

  local target_pos, target_lv_id, target_gv_id = squad_target:get_location()
    --    if not xr_logic.mob_captured(self.object) then
   xr_logic.mob_capture(self.object, true)
    --    end
  if squad:commander_id() == self.object:id() then
   action(self.object, move(move.walk_with_leader, target_pos),
    cond(cond.move_end))
  else
   local commander_pos = alife():object(squad:commander_id()).position
   if commander_pos:distance_to(self.object:position()) > 10 then
    action(self.object, move(move.run_with_leader, target_pos),
    cond(cond.move_end))
   else
    action(self.object, move(move.walk_with_leader, target_pos),
    cond(cond.move_end))
   end
  end
  return
    end

    if self.st.active_section ~= nil then
  xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)
    end
end

function generic_object_binder:extrapolate_callback()
    -- Проверяем, что объект еще в онлайне
    if db.storage[self.object:id()] == nil or
   db.storage[self.object:id()].object == nil
    then
  return
    end

    local cur_pt = self.object:get_current_point_index()
    if self.object:get_script()    == false then
  return false
    end

    local patrol_path = self.object:patrol()
    if not level.patrol_path_exists(patrol_path) then
  return false
  --abort("bind_monster:extrapolate_callback(). There is no patrol path [%s]", tostring(patrol_path))
    end
    if patrol(patrol_path):flags(cur_pt):get() == 0 then
  --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: true", cur_pt)
  return true
    end
    --printf("_bp: generic_object_binder: extrapolate_callback: cur_pt = %d: false", cur_pt)
    return false
end

function generic_object_binder:waypoint_callback(obj, action_type, index)
    if self.st.active_section ~= nil then
  xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "waypoint_callback", obj, action_type, index)
    end
end

function generic_object_binder:death_callback(victim, who)
    printf("stop_dead_id"..self.object:id())

    xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] = nil

    release_body_manager.get_release_body_manager():moving_dead_body(self.object)

    self:hit_callback(victim, 1, vector():set(0,0,0), who, "from_death_callback")
    if who:id() == db.actor:id() then
  xr_statistic.inc_killed_monsters_counter()
  xr_statistic.set_best_monster(self.object)
    end

    if self.st.mob_death then
  xr_logic.issue_event(self.object, self.st.mob_death, "death_callback", victim, who)
    end

    if self.st.active_section then
  xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
    end
    --' Наносим небольшой импульс вперед.
    local h = hit()
    h.draftsman = self.object
    h.type = hit.fire_wound
    h.direction = db.actor:position():sub(self.object:position())
    h:bone("pelvis")
    h.power = 1
    h.impulse = 10
    self.object:hit(h)

    local obj_clsid = self.object:clsid()
    if obj_clsid == clsid.poltergeist_s then
  printf("releasing object ["..self.object:name().."]")
  if alife():object(self.object:id()) ~= nil then
   alife():release(alife():object(self.object:id()), true)
  end
    end
  self:exist_use()
end

function generic_object_binder:exist_use()
    local ini = system_ini()
    if ini:line_exist(self.object:section(), "Spawn_Inventory_Item_Section") then
     local conf = ini:r_string(self.object:section(), "Spawn_Inventory_Item_Section")
  local items = {}
     for s in string.gfind(conf, "%s*([^,]+)%s*") do
      table.insert(items, s)
     end
     self.item = items[1]
  if self.item and system_ini():section_exist(self.item) then
      self.item_count = tonumber(items[2]) or 1
         self:set_use(ini)
  end
    end
end

function generic_object_binder:set_use(ini)
    local character_use = (ini:r_string(self.object:section(), "character_use")) or "monstr_character_use"
    self.object:set_tip_text(character_use)
    self.object:set_callback(callback.use_object, self.on_use, self)
    self.sound_use = sound_object("material\\dead-body\\collide\\hithard0"..tostring(math.random(1, 6)).."hl")
    if not self.use then self.use = true end
end

function generic_object_binder:on_use(obj, who)
local active_slot = db.actor:active_slot() and db.actor:active_slot() == 1
if not active_slot then return end
    for i=1, self.item_count do
     alife():create(self.item, who:position(), who:level_vertex_id(), who:game_vertex_id(), who:id())
    end
    self.object:set_callback(callback.use_object, nil)
    self.object:set_tip_text("")
    self.use = false
    local ini = system_ini()
    local h = hit()
    h.draftsman = self.object
    h.type = hit.fire_wound
    h.direction = vector():set(0,1,0)
    h:bone( (ini:r_string(self.object:section(), "bone_impuls_abscission")) or "bip01_spine" )
    h.power = 1
    h.impulse = ( (ini:r_u32(self.object:section(), "impuls_abscission")) or 100 )
    self.object:hit(h)
    self.sound_use:play_at_pos(self.object, self.object:position(), sound_object.s3d)
end

function generic_object_binder:hit_callback(obj, amount, local_direction, who, bone_index)
--    printf("HIT_CALLBACK: [%s] amount[%s]", obj:name(), amount)

    if(who:id()==db.actor:id()) then
  xr_statistic.set_best_weapon(amount)
    end

    if self.st.hit then
  xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index)
    end

    if amount > 0 then
  printf("HIT_CALLBACK: %s amount=%s bone=%s who:id() = [%s] actor:id() = [%s]", obj:name(), amount, tostring(bone_index), who:id(), db.actor:id())
    end
end

function generic_object_binder:hear_callback(self, who_id, sound_type, sound_position, sound_power)
    if who_id == self:id() then
  return
    end
    xr_hear.hear_callback(self, who_id, sound_type, sound_position, sound_power)
end

function generic_object_binder:net_spawn(sobject)
    if not object_binder.net_spawn(self, sobject) then
  return false
    end

    local on_offline_condlist = db.storage[self.object:id()] and db.storage[self.object:id()].overrides and db.storage[self.object:id()].overrides.on_offline_condlist
    if on_offline_condlist ~= nil then
  xr_logic.pick_section_from_condlist(db.actor, self.object, on_offline_condlist)
    end

    if not self.object:alive() then
  return true
    end
    if alife():object(self.object:id()) == nil then
  return false
    end

--    local pos = self.object:position()
--    printf("net_spawn mpos[%s][%s][%s]", tostring(pos.x), tostring(pos.y), tostring(pos.z))

    db.add_obj(self.object)

--******************************* Телепорт на первую точку пути работы смарттеррейна...*****************************
    local se_obj = alife():object(self.object:id())
    if db.spawned_vertex_by_id[se_obj.id] ~= nil then
  self.object:set_npc_position(level.vertex_position(db.spawned_vertex_by_id[se_obj.id]))
  db.spawned_vertex_by_id[se_obj.id] = nil
    elseif db.offline_objects[se_obj.id] ~= nil and db.offline_objects[se_obj.id].level_vertex_id ~= nil then
  printf("changing position for object[%s] from %s to %s : level vertex [%s] to [%s]", se_obj:name(), vec_to_str(se_obj.position), vec_to_str(level.vertex_position(db.offline_objects[se_obj.id].level_vertex_id)), tostring(se_obj.m_level_vertex_id), tostring(db.offline_objects[se_obj.id].level_vertex_id))
  self.object:set_npc_position(level.vertex_position(db.offline_objects[se_obj.id].level_vertex_id))
    elseif se_obj.m_smart_terrain_id ~= 65535 then
  local smart_terrain = alife():object(se_obj.m_smart_terrain_id)
  if smart_terrain.arriving_npc[se_obj.id] == nil then
   local smart_task = smart_terrain.job_data[smart_terrain.npc_info[se_obj.id].job_id].alife_task
   self.object:set_npc_position(smart_task:position())
  end
    end
--******************************************************************************************************************

    smart_terrain.setup_gulag_and_logic_on_spawn( self.object, self.st, sobject, modules.stype_mobile, self.loaded)

    return true
end

function generic_object_binder:net_destroy()
    self.object:set_callback(callback.death,    nil)
    self.object:set_callback(callback.patrol_path_in_point, nil)
    self.object:set_callback(callback.hit,     nil)
    self.object:set_callback(callback.sound,     nil)
    xr_sound.stop_sounds_by_id(self.object:id())

    xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] = nil

    local st = db.storage[self.object:id()]
    if st and st.active_scheme then
  xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy")
    end

-- Запоминаем позицию и активную секцию --------
if db.offline_objects[self.object:id()] then
    db.offline_objects[self.object:id()].level_vertex_id = self.object:level_vertex_id()
    db.offline_objects[self.object:id()].active_section = db.storage[self.object:id()].active_section
end
------------------------------------------------n

    db.del_obj(self.object)
    db.storage[self.object:id()] = nil
    object_binder.net_destroy(self)
end

function generic_object_binder:reload(section)
    object_binder.reload(self, section)
    --printf("generic_object_binder:reload(): self.object:name()='%s'", self.object:name())
end

function generic_object_binder:net_save_relevant()
    --printf("generic_object_binder:net_save_relevant(): self.object:name()='%s'", self.object:name())
    return true
end

function generic_object_binder:save(packet)

    set_save_marker(packet, "save", false, "generic_object_binder")
    object_binder.save(self, packet)
    xr_logic.save_obj(self.object, packet)
    set_save_marker(packet, "save", true, "generic_object_binder")
end

function generic_object_binder:load(reader)
    self.loaded = true
    set_save_marker(reader, "load", false, "generic_object_binder")
    object_binder.load(self, reader)
    xr_logic.load_obj(self.object, reader)
    set_save_marker(reader, "load", true, "generic_object_binder")
end
  Злобная реклама
Четверг, 24.03.2016, 13:26
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Соединенные Штаты  Joni_009
Четверг, 24.03.2016, 13:30 | Сообщение # 590
Статус:
Бывалый:
Сообщений: 1008
Награды: 14
Регистрация: 25.05.2014

Цитата _S_k_i_F_ ()
Joni_009, поставь галочки на is combat cover и can fire.

Ну если их поставить, то вылет сразу поймаешь.
  Злобная реклама
Четверг, 24.03.2016, 13:30
Статус:
Сообщений: 666
Регистрация: 25.05.2014
Российская Федерация  denis2000
Четверг, 24.03.2016, 13:57 | Сообщение # 591
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Цитата Dmitrii2015 ()
а где он находится (кондлист)?

Мы не телепаты! Кондлисты в твоих правках.


Цитата _S_k_i_F_ ()
поставь галочки на is combat cover и can fire.

Так наоборот! Это же не боевое укрытие, галок быть не должно.
Цитата _S_k_i_F_ ()
А если хочешь чтобы НПС не воевал, то в логику ему

Вот это стоит попробовать.
Сообщение отредактировал denis2000 - Четверг, 24.03.2016, 13:57
  Злобная реклама
Четверг, 24.03.2016, 13:57
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Украина  _S_k_i_F_
Четверг, 24.03.2016, 14:07 | Сообщение # 592
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, посмотрел у себя ради интереса - везде у меня такие настройки смарт ковров и все отлично работает
  Злобная реклама
Четверг, 24.03.2016, 14:07
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Соединенные Штаты  Joni_009
Четверг, 24.03.2016, 14:08 | Сообщение # 593
Статус:
Бывалый:
Сообщений: 1008
Награды: 14
Регистрация: 25.05.2014

Цитата _S_k_i_F_ ()
А если хочешь чтобы НПС не воевал, то в логику ему

Ну и толку заменил я на true, и еще переместил smart_cover в другое место. Теперь где-то около 50 метров от НПС, вылетает раньше мог вплотную подойти к нему. Лог вылета тот же что не так? я понять не могу.
Сообщение отредактировал Joni_009 - Четверг, 24.03.2016, 14:09
  Злобная реклама
Четверг, 24.03.2016, 14:08
Статус:
Сообщений: 666
Регистрация: 25.05.2014
Российская Федерация  denis2000
Четверг, 24.03.2016, 14:23 | Сообщение # 594
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Цитата _S_k_i_F_ ()
везде у меня такие настройки смарт ковров и все отлично работает

Рад за вас! Но я говорил о другом, если смарт ковер не предназначен для занятия НПС во время боя, то эти галки ставить не надо.
  Злобная реклама
Четверг, 24.03.2016, 14:23
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Украина  _S_k_i_F_
Четверг, 24.03.2016, 14:26 | Сообщение # 595
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, извиняюсь, я не правильно понял. Тогда не нужны эти галки.
  Злобная реклама
Четверг, 24.03.2016, 14:26
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  denis2000
Четверг, 24.03.2016, 14:31 | Сообщение # 596
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Joni_009, А логику то не покажите?


Цитата _S_k_i_F_ ()
Уже очень долго разными способами пытался исправить этот момент, но ничего не получается.

Вам нужно сохранять в пакет состояние переменных self.use, self.item, self.item_count и при загрузке восстанавливать их начения, плюс если self.use = true, то регистрировать колбек callback.use_object.
Сообщение отредактировал denis2000 - Четверг, 24.03.2016, 14:32
  Злобная реклама
Четверг, 24.03.2016, 14:31
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Соединенные Штаты  Joni_009
Четверг, 24.03.2016, 14:33 | Сообщение # 597
Статус:
Бывалый:
Сообщений: 1008
Награды: 14
Регистрация: 25.05.2014

Цитата denis2000 ()
Joni_009, А логику то не покажите?

Вы про эту логику?
Код
[logic@bandit_mark]
suitable = {=check_npc_name(bandit_mark)}
active = animpoint@bandit
prior = 200

[animpoint@bandit]
cover_name = bandit_mark_smart_cover
avail_animations = sit_normal
combat_ignore_cond = true
сombat_ignore = combat_ignore
combat_ignore_keep_when_attacked = true
invulnerable = true
meet = meet

[meet]
no_move = true
abuse = false
allow_break = false
meet_on_talking = false
trade_enable = true
close_distance = 5
close_anim = wait_na
close_victim = actor
use = {=actor_has_weapon} false, true
snd_on_use = {=actor_has_weapon} meet_hello, nil
Сообщение отредактировал Joni_009 - Четверг, 24.03.2016, 14:36
  Злобная реклама
Четверг, 24.03.2016, 14:33
Статус:
Сообщений: 666
Регистрация: 25.05.2014
Украина  _S_k_i_F_
Четверг, 24.03.2016, 14:54 | Сообщение # 598
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, а по подробнее можно. Пробовал так
в save(packet)
Код
package:w_u8(self.use)

в load(reader)
Код
self.use    = package:r_u8()

Но ничего не получилось.
  Злобная реклама
Четверг, 24.03.2016, 14:54
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  ins33
Четверг, 24.03.2016, 15:04 | Сообщение # 599
Dream Reader Mod
Статус:
Опытный:
Сообщений: 2269
Награды: 1
Регистрация: 17.01.2012

denis2000,
Предположим это так, сам не проверял, так что утверждать обратное не могу.
Цитата ins33 ()
Smart_terains читается только в all.spawn.
искать ответ в втором архиве, не благодарное дело, но это почти дословная цитата, на подобный вопрос.

И может в ТЧ no_move = true тоже работает?
  Злобная реклама
Четверг, 24.03.2016, 15:04
Статус:
Сообщений: 666
Регистрация: 17.01.2012
Российская Федерация  denis2000
Четверг, 24.03.2016, 15:18 | Сообщение # 600
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Joni_009, avail_animations = animpoint_sit_normal
Спрашивал же: Надеюсь все же animpoint_sit_normal а не просто sit_normal
  Злобная реклама
Четверг, 24.03.2016, 15:18
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Поиск: