Случайная подборка модов
Закоулки правды
3.6
Old Episodes. Episode 2. War of Zone.
3.1
Call of Chernobyl
4.5
Save and Protect: Killer
2.5
Sigerous Mod 2.2
4.1
Зона поражения 2: Ответный удар
4.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
Украина  _S_k_i_F_
Четверг, 05.10.2017, 12:45 | Сообщение # 8296
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

alanbrose, это в движке надо менять, в файле UICellItem.cpp
  Злобная реклама
Четверг, 05.10.2017, 12:45
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  atanda
Четверг, 05.10.2017, 14:53 | Сообщение # 8297
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

Добрый день всем! В каком файле проходит управление кострами в ТЧ? И есть ли оно там вообще?
  Злобная реклама
Четверг, 05.10.2017, 14:53
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Украина  _S_k_i_F_
Четверг, 05.10.2017, 16:31 | Сообщение # 8298
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

Такая проблема: есть массив created_afs, куда при спавне артефактов записываю их id
Код
local af_obj = alife():create(afs[j],position,lv_id,gv_id)
created_afs[af_obj.id] = af_obj.id

Потом при поднятии арта в коллбеке on_item_take вызываю ф-ция удаления айдишника поднятого арта из массива
Код
xrs_random_anomaly.remove_taken_af(obj.id)

Код
function remove_taken_af(af_id)
  if created_afs[af_id] ~= nil then
    table.remove(created_afs,af_id)
  end
end

Но айди арта не удаляется. Где ошибся? Заранее спасибо!
Сообщение отредактировал _S_k_i_F_ - Четверг, 05.10.2017, 17:47
  Злобная реклама
Четверг, 05.10.2017, 16:31
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  alanbrose
Четверг, 05.10.2017, 16:39 | Сообщение # 8299
Статус:
Отмычка:
Сообщений: 113
Награды: 4
Регистрация: 28.08.2015

buffy, gamedata/config/misc/zone_kampfire.ltx

Добавлено (05.10.2017, 16:39)
---------------------------------------------
_S_k_i_F_, жесть... Проще засечки на 70 процентах на текстуре сделать... Спасибо за ответ.

  Злобная реклама
Четверг, 05.10.2017, 16:39
Статус:
Сообщений: 666
Регистрация: 28.08.2015
Российская Федерация  denis2000
Четверг, 05.10.2017, 18:06 | Сообщение # 8300
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

buffy, Такого как в ЗП нет, совсем нет, даже в движке методы не предусмотрены.


Цитата _S_k_i_F_ ()
Где ошибся?

Пробуйте так:
Код
function remove_taken_af(af_id)
  if created_afs[af_id] ~= nil then
    created_afs[af_id] = nil
  end
end
Сообщение отредактировал denis2000 - Четверг, 05.10.2017, 18:11
  Злобная реклама
Четверг, 05.10.2017, 18:06
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  atanda
Четверг, 05.10.2017, 19:00 | Сообщение # 8301
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

denis2000,
Я, возможно, буду не прав, но описание костра в файле zone_kampfire на 70-80% идентично описанию аномалии в тех же файлах :zone_gravi, zone_mincer и др. То есть костёр можно считать в тч "псевдо_аномалией"?

Если же мои раздумья верны, я продолжу разговор.
  Злобная реклама
Четверг, 05.10.2017, 19:00
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Украина  _S_k_i_F_
Четверг, 05.10.2017, 19:29 | Сообщение # 8302
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, и так тоже не работает.
  Злобная реклама
Четверг, 05.10.2017, 19:29
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  denis2000
Четверг, 05.10.2017, 21:47 | Сообщение # 8303
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

_S_k_i_F_, Значит проблема не в предъявленных функциях, а в остальном коде.


Цитата buffy ()
Если же мои раздумья верны, я продолжу разговор.

Никто не против, развивайте мысль.
Сообщение отредактировал denis2000 - Четверг, 05.10.2017, 21:48
  Злобная реклама
Четверг, 05.10.2017, 21:47
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Украина  _S_k_i_F_
Четверг, 05.10.2017, 22:27 | Сообщение # 8304
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, вот полностью сам скрипт
Код
-- Файл: xrs_random_anomaly
-- Назначение: Рандомное заполнение локации аномалиями. Рандомный переспавн аномалий после выброса.
--------------------------------------------------------------------------------
-------------------Скрипты: makdm, 2014 для Припять:Точка Отсчёта
--------------------------------------------------------------------------------

random_anomaly_id = {} -- здесь будем хранить ID аномалий.
created_afs = {} -- массив созданных аномалиями артефактов

local ini = ini_file("misc\\dynamics_anomaly.ltx")

---------------------------------------------вызывается из логики рестриктора

function remove_taken_af(af_id)
  if created_afs[af_id] ~= nil then
    created_afs[af_id] = nil
  end
end

function control_random_anomaly( flag )

    local anomaly = {} -- массив аномалий
    local zone_off = {} -- массив офф-зон
    
       
    if flag == "release" then

  for k,v in pairs( random_anomaly_id ) do
   local se_obj = alife():object( v )
   if se_obj then
    alife():release( se_obj, true )
   end
  end
  random_anomaly_id = {}
  
  for k,v in pairs( created_afs ) do
   local af = alife():object( v )
   if af then
    alife():release( af, true )
   end
  end
  created_afs = {}
    
    elseif flag == "spawn" then
       
  local radius = 3
  local level_name = level.name()    
  local gv_id = 0
  local lv_id = 0
  while game_graph():valid_vertex_id( gv_id ) do
    
   local level = alife():level_name( game_graph():vertex( gv_id ):level_id() )
   if level == level_name then
    lv_id = game_graph():vertex( gv_id ):level_vertex_id()
    break
   end
  gv_id = gv_id + 1
  end
  
  local count_anom, pos_r_x, pos_r_z, pos_x_min, pos_x_max, pos_z_min, pos_z_max, anom_list, anom_in_list, zone_off_list, location
  
  for level in game_graph():levels() do
   location = alife():level_name(level.id)
   if ini:section_exist(location) and level_name == location then
    count_anom = ini:r_s32(location, "anomaly_count") -- читаем количество аномалий для локации
    pos_x_min = ini:r_s32(location, "pos_x_min")
    pos_x_max = ini:r_s32(location, "pos_x_max")
    pos_z_min = ini:r_s32(location, "pos_z_min")
    pos_z_max = ini:r_s32(location, "pos_z_max")
    anom_list = ini:r_string(location, "anomaly_list")
    anom_in_list = ini:line_count(anom_list)
    
    local result, anom_name, field_name, afs = "", "", "", ""
    
    for i=0,anom_in_list-1 do -- записываем все указанные в конфиге аномалии в таблицу
     result, anom_name, afs = ini:r_line(anom_list, i, "", "")
     table.insert(anomaly,anom_name)
    end
    
    result, field_name, zone_off_list = ini:r_line(location, 6) -- читаем офф-зоны
    local zone_off_ind = 1
    zone_off_list = parse_names(zone_off_list)
    while zone_off_list[zone_off_ind] ~= nil do -- записываем офф-зоны в таблицу
     table.insert(zone_off,zone_off_list[zone_off_ind])
     zone_off_ind = zone_off_ind + 1
    end
   end    
  end
  
  for i = 1,count_anom do
   local section = anomaly[ math.random( #anomaly ) ]
   pos_r_x = math.random( pos_x_min, pos_x_max )
   pos_r_z = math.random( pos_z_min, pos_z_max )
   local pos = vector():set( pos_r_x, 0, pos_r_z )
   local vert = level.vertex_id( pos )
   local position = level.vertex_position( vert )
  
   local right_position = true
   for k,v in pairs( zone_off ) do
    local zone = db.zone_by_name[ v ]
    if zone then
     if zone:inside( position ) then
      right_position = false
     end
    end
   end
   
   if right_position == true then
    --[[local del_zone
     if level.name() == "escape" then
      del_zone = db.zone_by_name["esc_anomaly_del"]
     elseif level.name() == "marsh" then
      del_zone = db.zone_by_name["mar_anomaly_del"]    
     else
      del_zone = nil
     end
     if (del_zone == nil) or (del_zone ~= nil and not del_zone:inside(position)) then]]
    local s_obj = create_anomaly( section, radius, position, lv_id, gv_id )
    random_anomaly_id[ s_obj.id ] = s_obj.id
    local line_num = nil
    for k=0,anom_in_list-1 do -- получаем номер строки в конфиге данной аномалии
    result, anom_name, afs = ini:r_line(anom_list, k, "", "")
     if anom_name == section then line_num = k end
    end
    if line_num ~= nil then
    result, anom_name, afs = ini:r_line(anom_list, line_num, "", "") -- читаем в листе аномалий параметры <имя аномалии>:{массив артефактов для данной аномалии и вероятность спавна - нечетный:четный индекс - имя артефакта:вероятность спавна}
     afs = parse_names(afs)
     local j = 1
     local rnd
     while afs[j] ~= nil do -- проходим по всем записанным артефактам
      rnd = math.random(1, 100)
      if rnd <= tonumber(afs[j+1]) then
       local af_obj = alife():create(afs[j],position,lv_id,gv_id) -- спаним артефакт с заданной вероятностью
       created_afs[af_obj.id] = af_obj.id
      end
      j = j + 2
     end
    end
    --end
   end
  
  end

    
    end

end

-------------Запись/загрузка ключевых параметров при сохранении/загрузке игры

function save( packet )
    i = 0
    for k,v in pairs( random_anomaly_id ) do
  i = i + 1
    end
    packet:w_u16( i )
    for k,v in pairs( random_anomaly_id ) do
  packet:w_u32( k )
    end
    i = 0
    for k,v in pairs(created_afs) do
  i = i + 1
    end
    packet:w_u16(i)
    for k,v in pairs(created_afs) do
  packet:w_u32(k)
    end
end

function load( reader )    
    random_anomaly_id = {}
    n = reader:r_u16()
    for i = 1,n do
  local k = reader:r_u32()
  random_anomaly_id[ k ] = k
    end
    created_afs = {}
    n = reader:r_u16()
    for i = 1,n do
  local k = reader:r_u32()
  created_afs[k] = k
    end
end

function create_anomaly( zone_name, zone_radius, position, lv, gv )

----------------------------Создаём объект-аномалию
    
    local sobj = alife():create( zone_name, position, lv, gv )
    
    local packet = net_packet()
    packet:w_begin( 0 )
    
-------------------------------------Читаем нет-пакет   
    sobj:STATE_Write( packet )
    packet:r_seek( 2 )
    
    local game_vertex_id    =    packet:r_u16()
    local distance   =    packet:r_float()
    local direct_control    =    packet:r_s32()
    local level_vertex_id    =    packet:r_s32()
    local object_flags  =    packet:r_s32()
    local custom_data  =    packet:r_stringZ()
    local story_id   =    packet:r_s32()
    local spawn_story_id    =    packet:r_s32()
    local shape_count  =    packet:r_u8()
    for i = 1,shape_count do
    local shape_type = packet:r_u8()
    if shape_type == 0 then
  local center = packet:r_vec3()
  local radius = packet:r_float()
    else
  local box = packet:r_matrix()
    end
    end
    local restrictor_type    =    packet:r_u8()
    local max_power      =    packet:r_float()
    local owner_id      =    packet:r_s32()
    local enabled_time     =    packet:r_u32()
    local disabled_time     =    packet:r_u32()
    local start_time_shift    =    packet:r_u32()
    local offline_interactive_radius    =    packet:r_float()
    local artefact_spawn_count   =    packet:r_u16()
    local artefact_position_offset  =    packet:r_s32()
    local last_spawn_time    =    packet:r_u8()
    
------------------------------------------Меняем данные пакета
    
    local new_center = vector():set( 0, 0, 0 )
    owner_id  =    bit_not( 0 )
    restrictor_type    = 3
    max_power = 0
    offline_interactive_radius    = 30
    artefact_spawn_count    = 32
    last_spawn_time = 0
    
------------------------------------------------Пишем в пакет    
    
    packet:w_begin( 0 )
    packet:w_u16( game_vertex_id )
    packet:w_float( distance )
    packet:w_s32( direct_control )
    packet:w_s32( level_vertex_id )
    packet:w_s32( object_flags )
    packet:w_stringZ( custom_data )
    packet:w_s32( story_id )
    packet:w_s32( spawn_story_id )
    packet:w_u8( 1 )
    packet:w_u8( 0 )
    packet:w_vec3( new_center )
    packet:w_float( zone_radius )
    packet:w_u8( restrictor_type )
    packet:w_float( max_power )
    packet:w_s32( owner_id )
    packet:w_u32( enabled_time )   
    packet:w_u32( disabled_time )
    packet:w_u32( start_time_shift )
    packet:w_float( offline_interactive_radius )
    packet:w_u16( artefact_spawn_count )
    packet:w_s32( artefact_position_offset )
    packet:w_u8( last_spawn_time )

    packet:r_seek( 2 )
    sobj:STATE_Read( packet, packet:w_tell() )
  return sobj
end

С помощью news_message проверил - ф-ция remove_taken_af вызывается из on_item_take.
  Злобная реклама
Четверг, 05.10.2017, 22:27
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  denis2000
Четверг, 05.10.2017, 22:35 | Сообщение # 8305
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

_S_k_i_F_, Где вызов remove_taken_af?
  Злобная реклама
Четверг, 05.10.2017, 22:35
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Украина  _S_k_i_F_
Четверг, 05.10.2017, 22:51 | Сообщение # 8306
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, в actor_binder в методе on_item_take
Код
function actor_binder:on_item_take (obj)
    printf("on_item_take [%s]", obj:name())
    if isArtefact(obj) then
  xrs_random_anomaly.remove_taken_af(obj.id)
  Злобная реклама
Четверг, 05.10.2017, 22:51
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  makdm
Четверг, 05.10.2017, 22:56 | Сообщение # 8307
Время Альянса
Статус:
Опытный:
Сообщений: 1787
Награды: 19
Регистрация: 22.11.2012

Цитата _S_k_i_F_ ()
 xrs_random_anomaly.remove_taken_af(obj.id)

Передаешь NIL
OBJ - это клиентский класс объекта.

xrs_random_anomaly.remove_taken_af( obj:id())

Так передавай айдишник.
  Злобная реклама
Четверг, 05.10.2017, 22:56
Статус:
Сообщений: 666
Регистрация: 22.11.2012
Украина  _S_k_i_F_
Четверг, 05.10.2017, 23:21 | Сообщение # 8308
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

makdm, спасибо! Теперь работает. А что значит клиентский класс?
  Злобная реклама
Четверг, 05.10.2017, 23:21
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  denis2000
Пятница, 06.10.2017, 10:40 | Сообщение # 8309
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

_S_k_i_F_, Игра Сталкер (точнее ее движек) построен на концепции сервер-клиентского взаимодействия, поэтому некоторые объекты имеют два экземпляра - один на серверной стороне другой на клиентской. Соответственно методы взаимодействия с этими объектами различны. Объекты доступные в клиентской части иначе называют объектами находящимися в онлайне, а объекты не доступные соотвественно в оффлайне.
Сообщение отредактировал denis2000 - Пятница, 06.10.2017, 10:42
  Злобная реклама
Пятница, 06.10.2017, 10:40
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  sinaps
Пятница, 06.10.2017, 11:37 | Сообщение # 8310
Статус:
Ветеран:
Сообщений: 4757
Награды: 4
Регистрация: 02.04.2016

Подскажите пожалуйста как правильно экспортировать из 3Ds Max анимации idle для Call of Pripyat\Call of Chernobyl? Для каких костей, сколько в ней должно быть кадров? Делаю явно что-то не то, экспортируемые мной анимации имеют гораздо больший размер чем оригинальные, в SDK ActorEditor анимации воспроизводятся, а в игре движутся только руки, оружие стоит на месте.


Большое спасибо, разобрался, wpn_body был приделан к lead_gun как-то неправильно, но сколько кадров и почему такие больше файлы анимайи всё ещё не ясно...
Сообщение отредактировал sinaps - Пятница, 06.10.2017, 12:29
  Злобная реклама
Пятница, 06.10.2017, 11:37
Статус:
Сообщений: 666
Регистрация: 02.04.2016
Поиск: