Случайная подборка модов
Arsenal Mod
4.0
Погоня за Праздником 2: В Ожидании Чуда...
4.1
Lost World Condemned
3.5
Оставшийся умирать
4.3
Sins of the past. Пролог
3.3
Судьба Зоны 0.5
3.9
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
Архив - только для чтения
⚙ Модострой: Вопросница
Российская Федерация  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, 19:29 | Сообщение # 8221
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

denis2000, и так тоже не работает.
  Злобная реклама
Четверг, 05.10.2017, 19:29
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  denis2000
Четверг, 05.10.2017, 21:47 | Сообщение # 8222
Время Альянса
Статус:
Ветеран:
Сообщений: 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 | Сообщение # 8223
Золотой Обоз
Статус:
Опытный:
Сообщений: 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 | Сообщение # 8224
Время Альянса
Статус:
Ветеран:
Сообщений: 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 | Сообщение # 8225
Золотой Обоз
Статус:
Опытный:
Сообщений: 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 | Сообщение # 8226
Время Альянса
Статус:
Опытный:
Сообщений: 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 | Сообщение # 8227
Золотой Обоз
Статус:
Опытный:
Сообщений: 1311
Награды: 9
Регистрация: 09.08.2015

makdm, спасибо! Теперь работает. А что значит клиентский класс?
  Злобная реклама
Четверг, 05.10.2017, 23:21
Статус:
Сообщений: 666
Регистрация: 09.08.2015
Российская Федерация  denis2000
Пятница, 06.10.2017, 10:40 | Сообщение # 8228
Время Альянса
Статус:
Ветеран:
Сообщений: 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 | Сообщение # 8229
Статус:
Ветеран:
Сообщений: 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
Российская Федерация  atanda
Пятница, 06.10.2017, 12:20 | Сообщение # 8230
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

denis2000,
Окей, я продолжу. Раз костёр по описанию его в конфиге очень похож на аномалию, то это такой, как я понимаю, костыль -"псевдо-аномалия". Но всё же аномалия, тогда почему бы не применить к нему функцию disable_anomaly(), которая находится в классе game_object файла lua_help. Конечно я ещё не видал использования этой функции в других модификациях. Но я попробую и чуть позже отпишусь.
  Злобная реклама
Пятница, 06.10.2017, 12:20
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Российская Федерация  denis2000
Пятница, 06.10.2017, 13:28 | Сообщение # 8231
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

buffy, Да это работает. Вполне можете использовать этот метод.
  Злобная реклама
Пятница, 06.10.2017, 13:28
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  atanda
Пятница, 06.10.2017, 15:00 | Сообщение # 8232
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

denis2000, вобщем тут возникла проблемка, чтобы точно знать какой костёр мне потушить, я задал ему story_id в файле alife_l01_escape, путём видоизменения следующей секции добавлением туда story_id:
Код

[2191]

; cse_abstract properties
section_name = lights_hanging_lamp
name = lights_camp_fire_omni_r1_r2_0000
position = 107.139472961426, -1.79265999794006, -0.583568632602692
direction = -2.27373675443232e-013, 0, 0
id = 65535
version = 118
script_version = 6
spawn_id = 585
story_id = 50

; cse_alife_object properties
game_vertex_id = 0
level_vertex_id = 594270
object_flags = 0xffffffba

; cse_visual properties

; cse_ph_skeleton properties

; cse_alife_object_hanging_lamp properties
main_color = 0xfffab807
main_brightness = 0.40000001
main_color_animator = koster
main_range = 6
light_flags = 0x2a
health = 100
main_virtual_size = 0.1
ambient_radius = 2
ambient_power = 0.40000001
main_cone_angle = 2.0943952
glow_radius = 0.69999999

После запаковал, к слову запаковка прошла успешно.

Далее инициализировал стори_ид в game_story_ids

Далее прописал в main_menu:OnKeyboard(dik, keyboard_action) файла ui_main_menu.script следующий код:
Код

if dik == DIK_keys.DIK_S then
    local o = level_object_by_sid("test_campfire_turn_off")
    o:disable_anomaly()
    local vec = vector()
    vec.x = 107.1
    vec.y = -1.8
    vec.z = -0.6
    db.actor:set_actor_position(vec)
end


И вообщем ловлю вылет на том, что переменная "o" - nil. Не понимаю почему, ведь я всё сделал как надо и инициализировал story_id.
  Злобная реклама
Пятница, 06.10.2017, 15:00
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Российская Федерация  Overfirst
Пятница, 06.10.2017, 15:12 | Сообщение # 8233
Статус:
Бывалый:
Сообщений: 1081
Награды: 19
Регистрация: 11.06.2015

Цитата buffy ()
local o = level_object_by_sid("test_campfire_turn_off")

Функция level_object_by_sid должна получать число, а не строку.
  Злобная реклама
Пятница, 06.10.2017, 15:12
Статус:
Сообщений: 666
Регистрация: 11.06.2015
Российская Федерация  atanda
Пятница, 06.10.2017, 15:15 | Сообщение # 8234
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

BoBaH_671,
то есть мне просто прописать story_id?
  Злобная реклама
Пятница, 06.10.2017, 15:15
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Российская Федерация  Overfirst
Пятница, 06.10.2017, 15:16 | Сообщение # 8235
Статус:
Бывалый:
Сообщений: 1081
Награды: 19
Регистрация: 11.06.2015

Цитата buffy ()
local vec = vector()
vec.x = 107.1
vec.y = -1.8
vec.z = -0.6

А это ещё что?

Юзай сразу:
Код
db.actor:set_actor_position(vector():set(107.1, -1.8, -0.6))

По-хорошему бы так:
Код
if dik == DIK_keys.DIK_S then
    local o = level_object_by_sid(50)
    if o ~= nil then
         o:disable_anomaly()
         db.actor:set_actor_position(vector():set(107.1, -1.8, -0.6)) -- можно вынести за пределы блока if ... end
    end
end
  Злобная реклама
Пятница, 06.10.2017, 15:16
Статус:
Сообщений: 666
Регистрация: 11.06.2015
Поиск: