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

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

@dsh @Faustle Спасибо за подсказки. Следуя вашим советам столкнулся с новой проблемой: таймер между вызовом моей функции работает. Однако первичный вызов функции происходит без задержки, моментально. А это мне не подходит. То есть как только я гурзанул сейв сразу вызывается моя функция, и только после этого заводится таймер. Как можно вызвать задержку на выполнение ф-ции?

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

В продолжение  своей проблемы

Исходя из информации, полученной выше от ребят, получается мы имеем вызов моей функции action_timer() из bind_stalker из ф-ции actor_binder:update(delta). Значит моя ф-ция автоматически обновляется. Тогда вопрос, что я делаю не так?

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

local time_news = 0
local iTimer = 0

function action_timer()
time_news = amk.game_minutes() + 2
   if time_news < amk.game_minutes() then  
   news_main.do_RANDOM_NEWS()
    end 
end

Ведь по идее, исходя из это, мой скрипт должен работать следующим образом: объявленной переменной time_news присваивается значение - игровое время + 2 минуты. И если эта переменная меньше чем игровое время в данный момент, то выполняется другая основная моя ф-ция do_RANDOM_NEWS(). И того выходит, что после загрузки сейва через 2 минуты игрового времени должна непрерывно начать постоянно вызываться моя основная ф-ция do_RANDOM_NEWS(), но этого не происходит. Оказывается почему-то что всегда переменная time_news перманентно больше игрового времени в данный момент. Как так?

 

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

@_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
Ссылка на комментарий

Все 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
Ссылка на комментарий

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

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
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

AMK-Team.ru

×
×
  • Создать...