Перейти к контенту

Рекомендуемые сообщения

@_Sk8_AsTeR_ 

Для проверки нужно увеличить время. Допустим 10 поставить. Время в игре оно течет побыстрей...Пока сейв грузится - вполне может пройти пресловутые две минуты.

Ссылка на комментарий
1 hour ago, _Sk8_AsTeR_ said:

Оказывается почему-то что всегда переменная time_news перманентно больше игрового времени в данный момент. Как так?

Ну почему, почему. Потому, что в начале функции ты делаешь её больше. time_news устанавливай снаружи функции. А потом внутри функции, внутри if-а, что бы в следующий раз выполнялась.

  • Спасибо 1
Ссылка на комментарий

@dsh благодарю! Заучит логично, да! Приду домой и попробую сразу!  

@_Val_ апдейт Бинд_Сталкерский начинает крутиться только как загрузка завершится и ты в зоне окажешься. Причем с задержкой в доли секунды даже :)

Ссылка на комментарий

Тут вот писали: http://ap-pro.ru/forum/126-750-459608-16-1369681281 

Цитата

Если лога нет, нужно файл _g.script изменить. Тогда лог будет более чем подробным, но играть постоянно с такой настройкой не очень удобно.


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

 

Сейчас там:

function abort(fmt, ...)
 local reason = string.format(fmt, ...)
 assert("ERROR: " .. reason)
 printf("ERROR: " .. reason)
 dbglog("%s", reason)
 printf("%s")
end

 

Изменено пользователем aka_sektor

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий

Все 4 функции внутри:  assert(),  printf(),  dbglog() рассчитаны на какую-то конкретную правку движка. На стандартном ТЧ ни одна из них не выдаст ничего.

Далее, саму abort() кто-то должен вызвать, обнаружив проблему и передав туда корректные параметры, понимаемые string.format()

 

В общем, от вышеприведенных танцев с бубном в логе ничего вразумительного не появится. Более того, передав неправильные параметры, можно получить этот самый вылет без лога или с логом совершенно невменяемым в самой безобидной ситуации.

 

Так что для начала следует определиться с движком.

В стандартном - единственный способ записать в лог то, что мы хотим - это дать какую-нибудь неправильную команду консоли, например: get_console():execute( "load несуществующий_файл что-то еще" ), и, чтобы гарантированно получить запись в файл всего, что выдавали ранее - get_console():execute( "flush" )

 

  • Полезно 1
Ссылка на комментарий
1 час назад, Dennis_Chikin сказал:

Более того, передав неправильные параметры, можно получить этот самый вылет без лога

Интересно. Глянул как в оригинале, получается строчка в моде добавлена:

dbglog("%s", reason)

Из-за неё может быть проблема?

 

UPD:

Ещё сравнил вообще файлы, там добавлено такое:

--[[function printf(fmt,...) 
	local con = get_console() 
	con:execute(string.gsub(string.format(fmt,...), " ", "_")) 
	con:execute("flush") 
end]]

function dbglog(fmt,...)
	local msg = string.format(fmt, ...)
	local msg_no_ws = string.gsub(msg, "%s", "_")
	get_console():execute("dbg:" .. msg_no_ws)
end

--function printf(fmt,...)
--  local arg={...}
--  if arg==nil or arg[0]==nil then
--    mylog(fmt)
--  else
--    mylog(string.format(fmt,...))
--  end
--end

--local bufferedmessages={}

--function mylog(msg)
--[[
  if msg==nil then
    return 
  end
  if db and db.actor then
    if bufferedmessages then
      for k,v in ipairs(bufferedmessages) do
        db.actor:give_game_news(v, "ui\\ui_iconsTotal", Frect():set(0,0,200,200), 0, 15000)
      end
      bufferedmessages=nil
    end
  db.actor:give_game_news(msg, "ui\\ui_iconsTotal", Frect():set(0,0,200,200), 0, 15000)
  else
    if bufferedmessages then
      table.insert(bufferedmessages,msg)
    end
  end
  if get_console() then
    get_console():execute("load "..msg)
    get_console():execute("flush")
  end
  ]]
--end

 

Изменено пользователем aka_sektor

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

Ссылка на комментарий

Ну, то есть, закомментировано все, кроме

function dbglog(fmt,...)
	local msg = string.format(fmt, ...)
	local msg_no_ws = string.gsub(msg, "%s", "_")
	get_console():execute("dbg:" .. msg_no_ws)
end

string.format() пытается повторить с собственным результатом то же, что делала в abort. Если там на входе в первом аргументе будет, к примеру, %s, а в последующих - true, false, или вообще nil, не говоря о таблице или userdata - вылет будет со странным и загадочным логом даже в абсолютно безобидной ситуации. Такое может организовать, к примеру, xr_logic.script из оригинала/амк и over 99% их потомков.

 

string.gsub() пытается заменить пробелы на подчеркивания, если до него вообще когда-нибудь дойдет очередь.

get_console() в таком виде действительно попытается записать что-нибудь в лог, но, если получившаяся в результате предшествующих операций строка будет не длиннее 200 с копейками байт, и если после этого на самом деле не случится безлоговый вылет.

 

А главное, повторюсь, тот abort() сначала должен быть вызван кем-то. В случае реального вылета вызвать его будет уже некому.

Мораль - тебе надо самому организовать вывод в лог, и ставить его в подозрительных местах.

 

К примеру, так:

my_script.script:

function abort( src, fmt, ... )
    get_console():execute( string_format( "load ~error~: [%s] %s", src, ( ... and string_format( fmt, ... ) ) or fmt or "" ) )
    get_console():execute( "load ~~~ Обнаружена ошибка. Описание ошибки смотрите выше. Игра остановлена." )
    get_console():execute( "load ~~~ Пожалуйста, не надо сообщать об ошибке в строке ***." )
    get_console():execute( "load ~~~ Какую-либо ценность имеют 10 строк ДО этого сообщения." )
    get_console():execute( "flush" )

   watchdog = src
    local error ; error = 1/error; get_console():execute( "quit" )
    -- Warning ! Может не срабатывать из апдейтов и иже с ними, если это не актор. Используейте watchdog.
end

 

bind_stalker.script:

 

function actor_binder:update( delta )
    if _my_script.watchdog then abort( "bind_stalker", "actor, ошибки в скрипте: %s", my_script.watchdog ) end

 

подозрительный скрипт:

где-то в подозрительном месте:

    obj.respawn_section = r_spawns( ini, section_name, "respawn_section", obj.sectSpawnProps, p )
        or abort( "мой_подозрительный_скрипт.script", "init_respawn_params, invalid section: [%s], line: [respawn_section] (%s)", section_name, obj.amk_name or obj_name )

 
результат: если ты всадил ошибку в олспавн, то у тебя при респане будет вылет с указанием неправильной секции и строки с ахинеей, вместо того, чтобы вылететь по "недостаточной памяти" или еще с какой "строкой 804".минут через 10 после того, как твой спавн повис наглухо

  • Нравится 1
  • Полезно 2
Ссылка на комментарий

Пытаюсь сделать разные звуки дыхания при разных надетых противогазах. Оригинальный скрипт из DMX мода для НарСоли...

И... мне не хватает умений переписать функцию function breathing():

Скрытый текст

local outfit_type = 0
local breathing_sound
function get_wearing_suit_with_helmet()
                  local outfit = db.actor:get_current_outfit()
    if outfit then
    local section = outfit:section()
    if string.find(section, "_gaz") or
    string.find(section, "neytral_exo_antigas")
    then outfit_type = outfit_type +1
end
    if  string.find(section, "specnaz_m1") or
    string.find(section, "military_outfit") or string.find(section, "militaryspec_outfit") or
    string.find(section, "exo_") or string.find(section, "_exoskeleton")
    then outfit_type = outfit_type +2
end
    if  string.find(section, "military_commander_outfit") or
    string.find(section, "ecolog_outfit") or
    string.find(section, "protection_outfit") or
    string.find(section, "scientific")
    then outfit_type = outfit_type +3
end

function breathing()
    if get_wearing_suit_with_helmet() and amk.load_variable("option_hud",2)==2 and db.actor.power > 0.18 then
        if not (breathing_sound and breathing_sound:playing()) and outfit_type = 1 then
        breathing_sound = xr_sound.get_safe_sound_object([[actor\gasmask_idle_1]]))
        breathing_sound:play_at_pos(db.actor, vector(), 0, sound_object.s2d + sound_object.looped)
end
if outfit_type = 2 then
        breathing_sound = xr_sound.get_safe_sound_object([[actor\gasmask_idle_2]]))
        breathing_sound:play_at_pos(db.actor, vector(), 0, sound_object.s2d + sound_object.looped)
end
if outfit_type = 3 then
        breathing_sound = xr_sound.get_safe_sound_object([[actor\gasmask_idle_3]]))
        breathing_sound:play_at_pos(db.actor, vector(), 0, sound_object.s2d + sound_object.looped)
end
    elseif breathing_sound and breathing_sound:playing() then
        breathing_sound:stop() breathing_sound = nil
    end
end

Прошу помощи :).

Ссылка на комментарий

Парни,_у меня вопрос(Игра Тч):

Вот я заспавнил НПС на Кордоне,_в Деревне новичков,_так вот когда я в него стреляю или убиваю остальные сталкеры на это внимания не обращают._А как сделать так, чтобы они за него заступались? 

То есть,_когда я буду в него стрелять то другие Нпс встанут с костра и начнут тоже в меня стрелять?

Изменено пользователем HellRatz
  • Согласен 1
Ссылка на комментарий
1 минуту назад, DaSTi002 сказал:

когда я в него стреляю или убиваю

За что!!!???

Ай-яй-яй, какой ты злой... Нельзя стрелять в людей без очень веских оснований... 

 

3 минуты назад, DaSTi002 сказал:

как зделать так чтобы они за него заступались?

А ты их познакомил с новым членом сталкерского сообщества? Нет? Вот так-то... 

С чего бы им заступаться за незнакомца ?  

И ещё, они могут не реагировать из-за того, что ты пишешь не туда, куда надо (не в ту тему)... 

 

5 минут назад, DaSTi002 сказал:

Тоисть

Пыркымтыклбалкосимар. 

Ссылка на комментарий

@DaSTi002 В оригинальном ТЧ, если убьешь сталкера в деревне новичков с одного выстрела попаданием в голову, то НПСы не будут на тебя обижаться, а перейдут в схему опасности.

Ссылка на комментарий
10 часов назад, TIGER_VLAD сказал:

@DaSTi002 В оригинальном ТЧ, если убьешь сталкера в деревне новичков с одного выстрела попаданием в голову, то НПСы не будут на тебя обижаться, а перейдут в схему опасности.

Это потому, что одни в одном гулаге сидят. Убивая одного, они будут реагировать. А если сталкер отдельно от всех - его как угодно вали, никто не чухнется.

Сталкер - наше всё!

Ссылка на комментарий

Ну, спасибо 

 

Другой вопрос:

Можно ли значки кровотечения, голода и т.д. из Теней Чернобыля заменить на Зов Припятские? 

Если можно то как?

Объясните пожалуйста. 

  • Смешно 1
  • Сочувствую 1
Ссылка на комментарий

Нет, в сталкере нет возможности изменять содержимое графический файлов при помощи скриптов. Да и xml, по большому счету, тоже. Хотя есть некоторые трюки с записью "в память" и "перезагрузкой" измененного, но в данном случае (как и большинстве других), этот трюк совершенно бесполезен.

 

Есть возможность копирования файлов из иерархии сталкера, типа

local f = getFS()
local f1 = f:update_path( "$game_config$", "file1.ltx" )
local f2 = f:update_path( "$game_config$", "file2.ltx" )
f:file_copy( f1, f2 )
Но это тоже ничего не дает.

Ссылка на комментарий
7 часов назад, AndrewMor сказал:

Это потому, что одни в одном гулаге сидят. Убивая одного, они будут реагировать. А если сталкер отдельно от всех - его как угодно вали, никто не чухнется.

 

И что случилось с обработкой gamedata\config\creatures\game_relations.ltx

[communities_sympathy]/*_goodwill/*_reputation ?

 

Правда, не вполне понимаю, зачем с этим все еще и что-то делать скриптово, как и в предыдущем вопросе про реализацию фотошопа на LUA.

Ссылка на комментарий
В 28.11.2017 в 09:47, DaSTi002 сказал:

Можно ли значки кровотечения, голода и т.д. из Теней Чернобыля заменить на Зов Припятские? 

Можно, редактируй текстуру, где эти значки все расположены.

В 28.11.2017 в 13:41, Dennis_Chikin сказал:

Нет, в сталкере нет возможности изменять содержимое графический файлов при помощи скриптов.

Полагаю, парень имел в виду заменить значки изначально, а не динамически прям во время игры менять одни на другие.

  • Согласен 1
Ссылка на комментарий

Какую логику написать нпс, чтобы он был бессмертным и не реагировал на нпс, монстров вокруг него, на выстрелы тоже не реагировал!? ТЧ.

Изменено пользователем BossBoroda
Ссылка на комментарий

@AndreySol 

Сложновато для того, кто не в курсе - что такое СДК от слова вообще. Да и не непись это получается - а голем какой-то. 

В принципе спорно и утверждение, что метод лучше - чем приравнивание в сталкеру Сахарову.

 

Изменено пользователем _Val_
Ссылка на комментарий
5 часов назад, _Val_ сказал:

@AndreySol 

Сложновато для того, кто не в курсе - что такое СДК от слова вообще. Да и не непись это получается - а голем какой-то. 

В принципе спорно и утверждение, что метод лучше - чем приравнивание в сталкеру Сахарову.

 

Мне в сдк и надо настроить торговца, как логику торговли прописать знаю, а вот остальное нет! Ошибки появляются какие-то, иногда вылеты(

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...