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

Скриптование


Svoboда

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

Есть какой-то простой способ узнать, находится ли актор в укрытии, защищённом от выбросов? И в зависимости от этого вернуть true или false

Кто знает, помогите, подскажите.

Я нашел ответ на свой вопрос: нужно использовать (surge_manager.actor_in_cover())

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


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

LUA error: ...ow of chernobyl\gamedata\scripts\ogse_signals.script:269: attempt to index local 'module' (a nil value)

Почему происходит этот вылет ? Кто знает, кто подскажет ?

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


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

function signals_mgr:subscribe_module( module_name )
  local module = _G[ module_name ]
  ASSERT(
    module,
    "signals_mgr:subscribe_module: Failed to subscribe module '%s'",
    module_name
  )
  ASSERT(
    type( module ) == "table",
    "signals_mgr:subscribe_module: Failed to subscribe module '%s', must be a table",
    module_name
  )
  ASSERT(
    type( module.attach ) == "function",
    "signals_mgr:subscribe_module: Failed to subscribe module '%s', has no 'attach' function",
     module_name
  )
  module.attach( self )
end

Строка 269 из скрипта выделена курсивом

  • Полезно 1

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


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

@naxac, Я в _g.script прописал пустую функцию ASSERT

Цитата

function ASSERT( cond, ... )
end

Вылет каким был — таким и остался.

Я вырезал все вызовы ASSERT из ogse_signals.script, теперь вылет такой:

Цитата

LUA error: ...ow of chernobyl\gamedata\scripts\ogse_signals.script:243: attempt to index local 'module' (a nil value)

Кусок кода:

Цитата

function signals_mgr:subscribe_module( module_name )
  local module = _G[ module_name ]
  module.attach( self )
end

Строчка 243 выделена курсивом

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


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

@naxac, А в каком смысле функция ASSERT не является рабочей?

Почему вариант

Цитата

function ASSERT( cond, ... )
end

не является рабочим ?

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


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

http://stalkerin.gameru.net/wiki/index.php?title=SoC._Один_из_методов_спавна

 

Я внедрил в геймдату готовый пример от Бардака. Суть примера: имеется файл db.script, в котором две функции: одна спавнит электру, другая — вертолёт. Начинать новую игру не обязательно, НО если после спавна сделать сохранение и загрузку то получаю вылет:

Цитата

Line          : 30
Description   : Specified story object is already in the Story registry!

Мои собственные догадки о причинах вылета такие: после загрузки скрипт второй раз пытается заспавнить электру и вертолёт, которые уже заспавнены. То есть скрипт пытается использовать такие story_id, которые уже использованы. Если это верное предположение, то возникает вопрос: как модифицировать скрипт Бардака, чтобы не было вылета? Самый простой способ?

Несколько минут спустя: моё предположение оказалось неверным. Даже если удалить скрипт от Бардака, сейв всё равно не грузится, всё равно происходит этот вылет. Значит проблема в том, что заспавненные объекты неправильно сохраняются. Почему сейв получается битым ?

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


Ссылка на сообщение
4 минуты назад, abramcumner сказал:

Модифицировать не надо, надо следить за стори_ид

В смысле ?

Если что, я не вносил никаких изменений в db.script от Бардака.

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


Ссылка на сообщение
24 минуты назад, abramcumner сказал:

Попробуй заменить "local story_id = packet:r_u32()" на "local story_id = packet:r_s32()" и "packet:w_u32(story_id)" на "packet:w_s32(story_id)", тоже в двух функциях. Меняется u32 на s32. Битый сейв удали.

Спасибо, сработало!

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

 

А есть какие-то уроки с детальным разбором нет-пакетов и как ими пользоваться? Да, я читал коммент Malandrinus в справочнике по функциям и классам https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam/?do=findComment&comment=258470

и даже кое-что понял, но этот коммент всё же вряд ли можно назвать уроком.

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


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

https://www.dropbox.com/s/wvub0j4ix30gecy/trade_manager.script?dl=0

Надо разбораться и понять, как работает функция update из этого скрипта. Имеются внешние локалы:

Цитата

local h24 = 24

local s24 = 3600 * h24

local c_time = game.CTime()

local actor = db.actor

local t_data = {}

local t_ini = {}

Имеется функция:

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

function update( npc )
	local tt = t_data[npc:id()]
	if ( tt.update_time or 0 ) >= time_global() then return end

	tt.update_time = time_global() + 60000 + npc:id()	-- хреновая, но рандомизация

	local str = pick_section( actor, npc, tt.buy_condition )
	if tt.current_buy_condition ~= str then
		npc:buy_condition( tt.config, str )
		tt.current_buy_condition = str
	end

	str = pick_section( actor, npc, tt.sell_condition )
	if tt.current_sell_condition ~= str then
		npc:sell_condition( tt.config, str )
		tt.current_sell_condition = str
	end

	if not tt.buy_supplies then return end

	str = pick_section( actor, npc, tt.buy_supplies )
	if ( tt.current_buy_supplies ~= str ) or ( not tt.resuply_time ) or tt.resuply_time < game.get_game_time() then

		npc:buy_supplies( tt.config, str )
		tt.current_buy_supplies = str
		c_time:setHMS( h24, 0, 0 )
		tt.resuply_time = game.get_game_time() + c_time
	end	
end

Из всех внешних локалов в теле этой функции используется только c_time. Но этот c_time нигде больше за пределами этой функции не используется, следовательно никакая информация через него не передаётся вовне.

 

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

Цитата

tt.update_time = time_global() + 60000 + npc:id()

эффект может быть весьма заметным и ощутимым.

 

Я не понимаю, каким образом вышеупомянутая функция может передать информацию (например update_time) за пределы себя. Кто может объяснить, помочь или хотя бы посочувствовать?

  • Сочувствую 2

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


Ссылка на сообщение
2 часа назад, Kirgudu сказал:

а результаты изменений, сделанных внутри функции update, доступны также и за её пределами.

Я о том и спрашивал. Но... Нужны детали.

2 часа назад, Kirgudu сказал:

Для общего понимания рекомендую почитать, что такое ссылочные типы данных и типы значений (reference type и value type).

Насколько я знаю, в Lua ссылочные типы отсутствуют. Так ведь ?

1 час назад, abramcumner сказал:

Это не чистая функция, у нее есть побочные эффекты в виде вызовов npc:buy_condition и аналогичных функций.

А почему после

npc:buy_condition( tt.config, str )

идет строка

tt.current_buy_condition = str

?

Для какой цели записывать что-то в локал tt, объявленный внутри функции, если вызов npc:buy_condition уже был ?

Я написал следующий код:

Цитата
function func()
local s
if s==nil then
print(64)
s=32
end
end
 
func()
func()

Проверил его тут: https://repl.it/languages/lua

Результат работы:

Цитата

64

64

То есть значение переменной s не сохраняется между двумя вызовами функции func.

Зачем тогда в скрипте торговли присваивание tt.current_buy_condition = str ? Как дальше это используется ?

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


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

https://www.dropbox.com/s/wvub0j4ix30gecy/trade_manager.script?dl=0

 

С этим скриптом имеются странности:

* Непись, зашедший в онлайн, потом оффлайн, а потом снова в онлайн, начинает торговать гитарой, губной гармошкой и кпк.

* Сразу после старта игры лишних предметов в ассортименте ни у кого нет. Они появляются после того, как актор успел побегать по локации.

* Если рядом с НПС, у которого в ассортименте есть гитара, губная гармошка и кпк, сохраниться и загрузиться, то лишних предметов после загрузки не будет.

 

Что приводит к возникновению этого бага? И как пофиксить? Кто сталкивался с этим ?

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

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


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

@naxac, А почему в оригинале такой проблемы не возникает ?

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


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

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

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


Ссылка на сообщение
04.04.2020 в 10:03, Zander_driver сказал:

Где treasure, obj, npc - это клиентские объекты тайника, перемещаемого итема, и НПС, соответственно. И делать надо в цикле, перебирая все итемы в тайнике.

А как сделать? Я же заранее не знаю, что окажется в тайнике.

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


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

Можно ли при определённых условиях заспавнить заданных размеров бокс, защищающий от выброса ? Какие есть способы ?

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


Ссылка на сообщение
3 минуты назад, Zander_driver сказал(а):

Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете"

Маленькое уточнение: вопрос о том, как вкрутить спавн бокса в оригинал ЗП.

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


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

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