Случайная подборка модов
SZA: The Second Project
3.9
День одиночки
1.6
Призраки Прошлого 2
3.0
Old Good Stalker Mod v2.4 Gold
4.2
Хроники Кайдана
3.6
Dead Autumn 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
Российская Федерация  denis2000
Пятница, 03.11.2017, 12:47 | Сообщение # 8581
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Цитата stalker00 ()
А что что за переменная?

Это хороший вопрос, но адресовать его нужно вам.

Частенько причиной такого является превышение нетпакета объекта при его записи, дело в том что размер ограничен, но инструмента контроля превышения размера нет, в результате данные одного пакета перекрывают данные другого пакета, в результате порча сохранения и невозможность корректно считать из него данные.
Ищите в логе сообщения "SAVE DIF:", "WARNING! may be this is problem save point", "You are saving too much".
Сообщение отредактировал denis2000 - Пятница, 03.11.2017, 13:03
  Злобная реклама
Пятница, 03.11.2017, 12:47
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Германия  stalker00
Пятница, 03.11.2017, 13:01 | Сообщение # 8582
Статус:
Отмычка:
Сообщений: 104
Награды: 2
Регистрация: 02.03.2017

Понятно.Поковырялся в Атмосфер 3 для ЧН.Вероятнее всего либо изначально шла в модификации ошибка,либо не корректная адаптация.Скорее всего второе.По любому надо откатываться до старой версии без Атмосфер и апгреда стволов.Благо сохранил ее( работала великолепно,без замарочек прошел основную сюжетку и побочки).Оставалась только войну группировок "откатать".Но приспичило улучшить сборку( правильно говорят-лучшее враг хорошего).В общем попробую откатиться до предедущей версии+прибавлю только апгрейды.Посмотрим как пойдет.Благодарю за помощь.
  Злобная реклама
Пятница, 03.11.2017, 13:01
Статус:
Сообщений: 666
Регистрация: 02.03.2017
Российская Федерация  r_f_2004_
Пятница, 03.11.2017, 13:06 | Сообщение # 8583
Статус:
Новичок:
Сообщений: 216
Награды: 4
Регистрация: 23.03.2017

sektor_aka, Большое спасибо за информацию smile
denis2000, Немного отодвинул лампы от геометрии, скомпилировал спавн - лампы появились
Прикрепления: 8109411.jpg (252.8 Kb) · 3818502.jpg (309.5 Kb)
  Злобная реклама
Пятница, 03.11.2017, 13:06
Статус:
Сообщений: 666
Регистрация: 23.03.2017
Российская Федерация  yobakun
Пятница, 03.11.2017, 16:18 | Сообщение # 8584
Статус:
Новичок:
Сообщений: 270
Награды: 5
Регистрация: 30.07.2016

denis2000,
Написал вот так:
Код
function campfire_distance()
    for i=1,65534 do
  local s = alife():object(i)
  if s then
   local o = level.object_by_id(s.id)
   if get_clsid(o) == clsid.zone_campfire then
    local cf = o:get_campfire()
    if cf and o:position():distance_to(db.actor:position()) < 1.5 then
     log("campfire_distance true")
     return true
    else
     log("campfire_distance false")
     return false
    end
   end
  end
    end
end

Выдает
Код
stack traceback:
    ....e.r. - call of chernobyl 1.4\gamedata\scripts\_g.script:594: in function 'get_clsid'
    ...f chernobyl 1.4\gamedata\scripts\campfire_manager.script:80: in function 'campfire_distance'
    ...f chernobyl 1.4\gamedata\scripts\campfire_manager.script:14: in function 'func_or_userdata'
    ...- call of chernobyl 1.4\gamedata\scripts\axr_main.script:187: in function 'make_callback'
    ....e.r. - call of chernobyl 1.4\gamedata\scripts\_g.script:96: in function 'SendScriptCallback'
    ...f chernobyl 1.4\gamedata\scripts\bind_stalker_ext.script:183: in function <...f chernobyl 1.4\gamedata\scripts\bind_stalker_ext.script:165>
ERROR: get_clsid - obj is nil!


В alun_utils.script есть вот такая функция:
Код
function nearest_object(s,offline)
    local dist
    local nearest
    local min_dist
    local is_match
    for i=1, 65535 do
  local obj = alife_object(i)
  if (obj) then
   is_match = false
   if (type(s) == "string" and string.find(obj:name(),s)) then
    is_match = true
   elseif (type(s) == "number" and s == obj:clsid()) then
    is_match = true
   end

   if (is_match) then
    dist = obj.position:distance_to_sqr(db.actor:position())

    if not(min_dist) then
     min_dist = dist
     nearest = obj
    elseif (dist < min_dist) then
     min_dist = dist
     nearest = obj
    end
   end
  end
    end

    if (nearest) then
  if (simulation_objects.is_on_the_same_level(nearest, alife():actor())) then
   if (offline or min_dist <= alife():switch_distance()^2) then
    return nearest,min_dist
   end
  end
    end
end

Может из нее можно получить костер?
Сообщение отредактировал yobakun - Пятница, 03.11.2017, 16:23
  Злобная реклама
Пятница, 03.11.2017, 16:18
Статус:
Сообщений: 666
Регистрация: 30.07.2016
Российская Федерация  makdm
Пятница, 03.11.2017, 17:01 | Сообщение # 8585
Время Альянса
Статус:
Опытный:
Сообщений: 1787
Награды: 19
Регистрация: 22.11.2012

yobakun, вот так попробуй:

function campfire_distance()
local actor_pos = db.actor:position()
for i=1,65534 do
local s = alife():object( i )
if s and s:clsid() == clsid.zone_campfire and s.position:distance_to( actor_pos ) < 1.5 and s.online then
log("campfire_distance true")
return true
end
end
log("campfire_distance false")
return false
end

P.S. Скрипт поправил
Сообщение отредактировал makdm - Пятница, 03.11.2017, 19:56
  Злобная реклама
Пятница, 03.11.2017, 17:01
Статус:
Сообщений: 666
Регистрация: 22.11.2012
Российская Федерация  yobakun
Пятница, 03.11.2017, 17:54 | Сообщение # 8586
Статус:
Новичок:
Сообщений: 270
Награды: 5
Регистрация: 30.07.2016

makdm, спасибо, работает. Теперь вот тут где-то косяк, не могу понять.

Код
function item_use(obj)
  if obj:section() == "c_matches" then
   obj:set_remaining_uses(obj:get_remaining_uses()+1)
   if campfire_distance() then
   local roll = math.random(1,2)
    if roll == 1 then
     campfire_on(obj)
     log("turn_on:success")
    else
     obj:set_remaining_uses(obj:get_remaining_uses()-1)
     SetHudMsg(game.translate_string("st_fail"),3)
     log("turn_on:fail")
    end
   end
  end
  if obj:section() == "c_matches_old" then
   obj:set_remaining_uses(obj:get_remaining_uses()+1)
   if campfire_distance() then
    local roll = math.random(1,3)
    if roll == 1 then
     campfire_on(obj)
     log("turn_on:success")
    else
     obj:set_remaining_uses(obj:get_remaining_uses()-1)
     SetHudMsg(game.translate_string("st_fail"),3)
     log("turn_on:fail")
    end
   end  
   if obj:section() == "c_ignition_set" then
    obj:set_remaining_uses(obj:get_remaining_uses()+1)
    if campfire_distance() then
     campfire_on(obj)
     log("turn_on:success")
   end
  end
    end
end


Часть c c_matches и c_matches_old работает, а часть с c_ignition_set просто тратит спички.

Сама функция на сохранение выглядит так:
Код

function campfire_on(matches)
for i=1,65534 do
local s = alife():object(i)
if s then
local o = level.object_by_id(s.id)
if o  then
local cf = o:get_campfire()
if cf and o:position():distance_to(db.actor:position()) < 1.5 then
local flist = getFS():file_list_open_ex("$game_saves$",    bit_or(FS.FS_ListFiles,FS.FS_RootOnly),"*".. ui_load_dialog.saved_game_extension)
local f_cnt = flist and flist:Size() or 0

local inc = 0
if (f_cnt > 0) then
flist:Sort(FS.FS_sort_by_modif_down)
for it=0, f_cnt-1 do
local file_name = flist:GetAt(it):NameFull():sub(0,-6):lower()
-- grab last modified quicksave increment count
local d = tonumber( string.match(file_name,"campfire_autosave(%d+)") )
if (d) then
inc = d

break
end
end
end
    
inc = inc >= axr_main.config:r_value("mm_options","quicksave_cnt",2,5) and 1 or inc + 1
if (pre_timer == nil) then
get_console():execute("save campfire_autosave"..inc)
s_timer()
end
     
if not (cf:is_on()) then
if (rainy_is() == 1) then
local snd_obj = sound_object("interface\\inv_matches")
snd_obj:play(db.actor,0,sound_object.s2d)
-- xr_sound.set_sound_play(db.actor:id(),"inv_matches")
matches:set_remaining_uses(matches:get_remaining_uses()-1)
cf:turn_on()
-- return
break
else
matches:set_remaining_uses(matches:get_remaining_uses()-1)
local text = game.translate_string("st_fail")
SetHudMsg(text,3)
end
end
end
end
end
end
end

Здесь идет вторая проверка на дистанцию у костра, но попытка убрать
Код
for i=1,65534 do
local s = alife():object(i)
if s then
local o = level.object_by_id(s.id)
if o  then
local cf = o:get_campfire()
if cf and o:position():distance_to(db.actor:position()) < 1.5 then

ломает функцию.

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

P.S. Надеюсь, это не выглядит как попытка сделать все за меня.
Сообщение отредактировал yobakun - Пятница, 03.11.2017, 18:08
  Злобная реклама
Пятница, 03.11.2017, 17:54
Статус:
Сообщений: 666
Регистрация: 30.07.2016
Российская Федерация  denis2000
Пятница, 03.11.2017, 18:08 | Сообщение # 8587
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Цитата yobakun ()
Теперь вот тут где-то косяк, не могу понять.

Вот косяк:
Код
if campfire_distance() == 1 then

Функция возвращает бинарное значение, а вы сравниваете с числом.
Сообщение отредактировал denis2000 - Пятница, 03.11.2017, 18:10
  Злобная реклама
Пятница, 03.11.2017, 18:08
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  yobakun
Пятница, 03.11.2017, 18:10 | Сообщение # 8588
Статус:
Новичок:
Сообщений: 270
Награды: 5
Регистрация: 30.07.2016

denis2000, понял.

Попробовал вот так:

Код
function item_use(obj)
    if obj:section() == "c_matches" or obj:section() == "c_matches_old" or obj:section() == "c_ignition_set" then
  obj:set_remaining_uses(obj:get_remaining_uses()+1)
  if not campfire_distance() then
  return
  end
    end    
    if obj:section() == "c_matches" then
  local roll = math.random(1,2)
  if roll == 1 then
   campfire_on(obj)
   log("turn_on:success")
  else
   obj:set_remaining_uses(obj:get_remaining_uses()-1)
   SetHudMsg(game.translate_string("st_fail"),3)
   log("turn_on:fail")
  end
    end
    
    if obj:section() == "c_matches_old" then
  local roll = math.random(1,3)
  if roll == 1 then
   campfire_on(obj)
   log("turn_on:success")
  else
   obj:set_remaining_uses(obj:get_remaining_uses()-1)
   SetHudMsg(game.translate_string("st_fail"),3)
   log("turn_on:fail")
  end
    end
    if obj:section() == "c_ignition_set" then
  local roll = math.random(1,1)
  if roll == 1 then
   campfire_on(obj)
   log("turn_on:success")
  else
   obj:set_remaining_uses(obj:get_remaining_uses()-1)
   SetHudMsg(game.translate_string("st_fail"),3)
   log("turn_on:fail")
  end
    end
end

Часть кода из campfire_on(matches) перестала работать.
Код
if not (cf:is_on()) then
if (rainy_is() == 1) then
local snd_obj = sound_object("interface\\inv_matches")
snd_obj:play(db.actor,0,sound_object.s2d)
-- xr_sound.set_sound_play(db.actor:id(),"inv_matches")
matches:set_remaining_uses(matches:get_remaining_uses()-1)
cf:turn_on()
-- return
break
else
matches:set_remaining_uses(matches:get_remaining_uses()-1)
local text = game.translate_string("st_fail")
SetHudMsg(text,3)
end
end

Плюс утечка памяти и вылет через некоторое время.
Сообщение отредактировал yobakun - Пятница, 03.11.2017, 18:33
  Злобная реклама
Пятница, 03.11.2017, 18:10
Статус:
Сообщений: 666
Регистрация: 30.07.2016
Российская Федерация  atanda
Пятница, 03.11.2017, 18:28 | Сообщение # 8589
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

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

if xr_logic.try_switch_to_another_section(self.object, self.st, actor) then
    return true/false/or nothing
end    


Что делает данный метод я знаю - пытается переключить объект на другую схему, если хоть одно из условий переключения сработало.

Но что делает данный блок кода, точнее пытается сделать? Типа можно ли перейти во время апдейта активной схемы на другую схему и тем самым разрешает или запрещает?

Я прав?
  Злобная реклама
Пятница, 03.11.2017, 18:28
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Российская Федерация  denis2000
Пятница, 03.11.2017, 18:47 | Сообщение # 8590
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

buffy, Ну, если бы вы ориентировались не на имя функции, а на ее код, то вы бы поняли, что она не только проверяет возможность переключения, но и переключает на следующую секцию, при этом если переключение произошло возвращает true, следовательно приведенный вами код означает попробовать и переключиться на другую секцию логики, а если переключились выполнить код после then, то есть в данном случае просто завершить обработку колбека.
Сообщение отредактировал denis2000 - Пятница, 03.11.2017, 18:49
  Злобная реклама
Пятница, 03.11.2017, 18:47
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  atanda
Пятница, 03.11.2017, 18:56 | Сообщение # 8591
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

denis2000, о да... Я ещё плохо разобрался с xr_logic..
  Злобная реклама
Пятница, 03.11.2017, 18:56
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Российская Федерация  denis2000
Пятница, 03.11.2017, 18:59 | Сообщение # 8592
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

Цитата buffy ()
Я ещё плохо разобрался с xr_logic..

У вас одно несомненное преимущество - вы действительно пытаетесь разобраться!
  Злобная реклама
Пятница, 03.11.2017, 18:59
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  atanda
Пятница, 03.11.2017, 19:14 | Сообщение # 8593
Статус:
Бывалый:
Сообщений: 672
Награды: 7
Регистрация: 12.07.2017

denis2000, кстати у меня ещё одна проблемка была, которую я к сожалению не понял: в свою схему добавил hit_callback. Но он почему-то не обрабатывается вообще. То есть при хите моего физ. объекта не происходит, то, что было указано в блоке метода.
Сообщение отредактировал buffy - Пятница, 03.11.2017, 19:14
  Злобная реклама
Пятница, 03.11.2017, 19:14
Статус:
Сообщений: 666
Регистрация: 12.07.2017
Российская Федерация  denis2000
Пятница, 03.11.2017, 19:25 | Сообщение # 8594
Время Альянса
Статус:
Ветеран:
Сообщений: 4070
Награды: 16
Регистрация: 19.07.2013

buffy, Не для всех классов объектов можно зарегистрировать колбек на хит, а только для тех которые поддерживает эту возможность в движке.
  Злобная реклама
Пятница, 03.11.2017, 19:25
Статус:
Сообщений: 666
Регистрация: 19.07.2013
Российская Федерация  makdm
Пятница, 03.11.2017, 21:49 | Сообщение # 8595
Время Альянса
Статус:
Опытный:
Сообщений: 1787
Награды: 19
Регистрация: 22.11.2012

Цитата yobakun ()
makdm, спасибо, работает.

Да, пожалуйста.
Только всё это неправильно с точки зрения быстродействия работы скриптов.
Здесь нужно понимать, что все костры, находящиеся на активной локации ( на которой находится ГГ ) не зависят от параметра switch_distance, а по - русски, всегда ОНЛАЙН.
Поэтому достаточно в биндер костров ( bind_campfire.script ) добавить свою таблицу.

В самом верху файла пишите:

campfire_table = {}

Затем в методе net_spawn(server_object) пишите:

campfire_table[ self.object:id() ] = self.object

После этих добавлений ваша функция будет выглядеть так:

function campfire_distance()
local actor_pos = db.actor:position()
for k,v in pairs(bind_campfire.campfire_table) do
if v:position():distance_to( actor_pos ) < 1.5 then
log("campfire_distance true")
return true
end
end
log("campfire_distance false")
return false
end

Быстродействие - просто в разы. И никаких лишних телодвижений.
  Злобная реклама
Пятница, 03.11.2017, 21:49
Статус:
Сообщений: 666
Регистрация: 22.11.2012
Поиск: