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

dsh mod


dsh

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

У @dsh, насклько я понимаю, реализована интересная схема, выпинывающая НПС из лагерей и заставляющая идти  гулять. Вот хотелось бы больше информации, что за функции, как подключается и тд...

Поделиться этим сообщением


Ссылка на сообщение

@dsh, дружище, благодарю за ответ, хочу продолжить свою тему про выпинывания НПС из лагерей. Изучаю и адаптирую для себя твои скрипты, но я уже готов стрелять я из-за проблем с кодировкой репозитория... Есть возможность папку скриптов залить на что-то типа ядрайва или гуглдиска? 

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@dsh, прошу прощения, приду домой-гляну. 

Суть в том, что по какой-то причине игровой движок безошибочный скрипт даже не компилит. 

У меня такое было однажды. Чтобы игра скомпилила скрипт маленький нужно было не копипастить с сайта, а самому руками набирать. Хрень какая-то 

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@dsh, дружище, а подскажи пожалуйста вот какой момент:

dsh.script:

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

function is_free_logic_gulag( name )
  if free_logic_gulag[ name ] == nil then
    local cond = get_string( "dsh.gulag.free_logic", name, false )  --проблемная строка
    if cond then
      local pc = xr_logic.parse_condlist(
        nil, "dsh.gulag.free_logic", name, cond
      )
      cond = xr_logic.pick_section_from_condlist(
        db.actor_proxy, db.actor_proxy, pc
      ) ~= nil
    end
    free_logic_gulag[ name ] = cond
  end
 return free_logic_gulag[ name ]

end

 

На эту функцию вылет:

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

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: d:\games\s.t.a.l.k.e.r\gamedata\scripts\dsh.script:3704: attempt to call global 'get_string' (a nil value)

Не могу понять, откуда берется эта глобальная переменная, что не так с аргументами функции или с самой функцией?

И что это за переменная Free_logic? В каком она скрипте? Не могу сориентироваться, вводят в заблуждение синтаксис: "dsh.gulag."

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

Поделиться этим сообщением


Ссылка на сообщение

@dsh, И так, я таки стартанул игру. Каким образом тестирую:

прямо во время игры вызываю функцию periodic_job()

Пробую ждать результатов...

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

21 минуту назад, dsh сказал:

Это не переменная. Это секция "dsh.gulag.free_logic" в одном из файлов, включенных в system.ltx, конкретнее в dsh.ltx.

Ага, а данная секция описывает животинок, которым разрешено покидать свои "сектора обитания", насколько я понял, верно?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@dsh, если глубже описывать, то такая ситуация:

я "влюбился" в твою скриптовую фишку, которая заставляет засидевшихся в лагере НПС проваливать прочь из гулага. И вот функция, тобою выше упомянутая "periodic_job()" запускается (вручную, например). Она запускает таймер, по истечению которого будет произведен перезапуск "periodic_job()", я верно понимаю систему? И эта же функция заставляет засидевшийся НПС топать прочь? 

Я хочу понять, получилось ли у меня адаптировать твою фишку, и для этого нужно каким-то образом уменьшить время, которое НПС будет сидеть в лагере. Иными словами хочется чтобы НПС уходили из гулага как можно быстрее, типа того. 

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

Поделиться этим сообщением


Ссылка на сообщение

@dsh, дружище, и снова времени доброго! Кажется у меня получилось твою схему себе адаптировать, бандосы с АТП внезапно пошли деревню новичков штурмовать, попутно зачистив мост. Есть один интересующий момент:

Я эксперимента ради убрал фильтры по условию To_late, bad_weather, радиус от ГГ и взгляд ГГ на НПС, раньше они добавляли неписей в таблицу "не готов уходить", я закомментил эти моменты. И теперь вот что иногда наблюдаю - после вызова функции "Периодик Джоб" в лагере иногда некоторые НПС просто встают ровно и ничего не делают, не проигрывают каких-либо анимаций, не получают никакую работу в гулаге. В связи с чем вопрос: твой скрипт даёт онлайн персонажам работу? Или я чего-то неправильно понимаю...

Поделиться этим сообщением


Ссылка на сообщение

@dsh, дружище, приветствую! А вот еще технический вопросик.

у тебя схема собирательства интересно сделана, с озвучкой лутания, вот вопрос по озвучке:

Твоя строчка кода:

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

snd_name = string.format(
      "characters_voice\\loot_monster\\%s\\loot_%s_1", comm, good_bad

Тут в строке первая переменная - определение фракции (а соответственно и папки с озвучкой), вторая переменная - рандом loot_bad или loot_god

 

И вот вопрос, а есть ли метод чтобы определить скриптово папки с озвучкой human_01 human_02 и human_03, чтобы голоса лута соответствовали голосу профиля НПС? А то сейчас, например, один сталкерский голос для human_01 и human_02 и human_03.

Блин, надеюсь понятно объяснил )

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@dsh, Дружище, а подскажи пожалуйста по твоему скрипту еще один момент:

Воспроизводим звук лута:

snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 0.7 )

В итоге звук играет не от лица НПС, а от позиции, т.е. НПС отошел, а его озвучка продолжает играться в том же месте, с привязкой к позиции. А как можно было бы заставить именно НПС проговорить звук?

Кст, по поводу предыдущей правочки, что я посмел сделать в твоем скрипте, на случай если ты захочешь её в следующий свой патч влупить (озвучка лута в зависимости от папок Human_01 human_02 и т.д, там реально те же бандосы разные голоса в зависимости от профиля имеют:

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

function postmortem_sound( npc, body )
  if not ( npc and body ) then return end
  if
    sound_timer[ npc:id() ]
    and sound_timer[ npc:id() ] > time_global()
  then
    return
  end
  local snd_name
  if IsStalker(body) then
    if npc:relation( body ) == game_object.friend then
      snd_name = dead_friend[ math.random( table.getn( dead_friend ) ) ]
    elseif npc:relation( body ) == game_object.neutral then
      snd_name = dead_neutral[ math.random( table.getn( dead_neutral ) ) ]
    elseif npc:relation( body ) == game_object.enemy then
      snd_name = string.format(
	  "reactions\\dead_enemy\\dead_enemy_%s", math.random( 6 )  --откорректировал 1
    ) 
    end
  elseif IsMonster(body) then
    snd_name = dead_mutant[ math.random( table.getn( dead_mutant ) ) ]
  end
  if not snd_name then return end
  local aster = npc:sound_prefix() --откорректировал 2
  local snd_obj = xr_sound.get_safe_sound_object( aster..""..snd_name ) --откорректировал 3
  if snd_obj and not snd_obj:playing() then
    snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 0.7 )
    sound_timer[ npc:id() ] = time_global() + snd_obj:length()
      + math.random( 15000, 25000 )
    return snd_obj:length()
  end
end

 

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

function beginloot_sound( npc, body )
  if not ( npc and body ) then return end
  if
    sound_timer[ npc:id() ]
    and sound_timer[ npc:id() ] > time_global()
  then
    return
  end
  local snd_name
  local comm = postloot_comm[ npc:character_community() ]
    and npc:character_community() or "stalker"
  if IsStalker(body) then
    snd_name = string.format(
	  "states\\loot\\loot_begin_%s", math.random( 3 ) --откорректировал 1
    )
  elseif IsMonster(body) then
    snd_name = string.format(
	  "states\\loot\\loot_begin_1" --откорректировал 2
    )
	else
  end
  if not snd_name then return end
  local aster = npc:sound_prefix() --откорректировал 3
  local snd_obj = xr_sound.get_safe_sound_object( aster..""..snd_name )  --откорректировал 4
  if snd_obj and not snd_obj:playing() then
    snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 0.7 )
    sound_timer[ npc:id() ] = time_global() + snd_obj:length()
      + math.random( 15000, 25000 )
    return snd_obj:length()
  end
end

 

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

function postloot_sound( npc, body, found )
  if not ( npc and body ) then return end
  if
    postloot_timer[ npc:id() ]
    and postloot_timer[ npc:id() ] > time_global()
  then
    return
  end
  local snd_name
  local comm = postloot_comm[ npc:character_community() ]
    and npc:character_community() or "stalker"
  local good_bad = found and "good" or "bad"
--  if body:is_stalker() then
  if IsStalker(body) then
    snd_name = string.format(
      "states\\loot\\loot_%s_%s", good_bad, math.random( 3 )  --откорректировал 1
    )
  elseif IsMonster(body) then
  local aster = npc:sound_prefix()  --откорректировал 2
    snd_name = string.format(
      "states\\loot\\loot_%s_1", good_bad  --откорректировал 3
    )
	else
  end
  if not snd_name then return end
  local aster = npc:sound_prefix()  --откорректировал 4
  local snd_obj = xr_sound.get_safe_sound_object( aster..""..snd_name )  --откорректировал 5
  if snd_obj and not snd_obj:playing()
  then
    snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 0.7 )
    postloot_timer[ npc:id() ] = time_global() + snd_obj:length()
      + math.random( 15000, 25000 )
    return snd_obj:length()
  end
end

 

Тут то, что я поменял, пометил фразой: "откорректировал"

:)

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

Поделиться этим сообщением


Ссылка на сообщение

@dsh, Приветствую снова! Я к тебе как-то приставал с просьбой о помощи по переносу твоей конкретной фишки (гуляющие сталкеры "dsh_walking_stalkers.script") к себе в игру. У меня получилось заставить их гулять, но у меня проблемы с таймерами почему-то. Не вызывается функция "periodic_job()" по истечению заданного времени. Причем я пытаюсь даже умышленно сделать ошибку и запускать по таймеру несуществующую ф-цию, но всё равно. Нет даже попытки вызова фунции. Подробности в спойлере:

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

function periodic_job()
  
.....тело функции где всё работает.....
  

local next_m = math.random( 1, 60 )
  dsh.start_gtimerDHMS(
    "dsh_walking_stalkers.periodic_job_error",
    0, 0, 0, 15, --взводим таймер на 15 секунд?
    "dsh_walking_stalkers.periodic_job_error"
  )

 

По итогу нет попыток вызова ни существующих, ни несуществующих функций dsh_walking_stalkers.periodic_job_error. То есть игра не вылетает. Просто игнорируются попытки вызова ф-ции по таймауту. Что это может быть, в какую сторону посмотреть?

Поделиться этим сообщением


Ссылка на сообщение

@dsh, такой логикой и руководствовался тоже, вот где я остановился.

Ф-ция "start_gtimerDHMS" внутри себя вызывает следующее:

return ogse_st_mgr.delayed_fun_start( name )

А вот функция delayed_fun_start (name) вот как себя ведёт:

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

function delayed_fun_start:start()
  if self._residual_time then
	amk.send_tip("проверка 1", "инфо", 1, 15, "common_channel")
    self.script_name = self.action_name
    savable_timer.start( self )
  else
	amk.send_tip("проверка 2", "инфо", 1, 15, "common_channel")   --в игре выдаётся этот тип, значит функция пошла сюда. 
    self._start_time    = self._start_time or game.get_game_time()
    self._high_priority = true
    register_any_timer( self )
  end
  return self
end

 

И далее я встал, не пойму что происходит дальше.

Как работает эта функция?

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

function start_gtimerDHMS( name, d, h, m, s, fname, ... )
	amk.send_tip(name, fname, 1, 15, "common_channel") --проверим, всё ли верно передаются в параметрах. Всё ок.
  return ogse_st_mgr.delayed_fun_start( name )
    :set_gdelayDHMS( d, h, m, s )
    :init( fname, ... )
    :start(true)	
end

 

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

  • Куратор(ы) темы:

AMK-Team.ru

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