Случайная подборка модов
New Level Changer 6.0. Начало
4.0
Опасный Вирус
2.4
Тайный путь
3.6
Gott Mit Uns - Бог С Нами
4.0
Сталкер: Конец Света
3.0
Paradise Lost
3.7
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
Архив - только для чтения
⚙ Модострой: Вопросница
Российская Федерация  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
Поиск: