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

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

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

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

Ссылка на комментарий
4 минуты назад, DMT сказал:

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

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

 

7 минут назад, DMT сказал:

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

Если объектов станет больше 65535.

 

8 минут назад, DMT сказал:

А есть какие-то уроки с детальным разбором нет-пакетов и как ими пользоваться?

По ссылке разбор класса net-packet, он простой. Тебе же нужно, что входит в нет-пакеты разных классов. Уроков не знаю, все нет-пакеты есть в acdc. Возможно в модулях Artos`a расписано какое поле, что значит.

  • Спасибо 1
Ссылка на комментарий
2 часа назад, abramcumner сказал:

каждом сохранении-загрузке

Ну это перебор, конечно. Если спаун нужен постоянно, надо его хотя бы ограничивать таймером или инфопорциями, выдающимися постепенно и в определённый момент. 

  • Согласен 1

Здесь могла быть ваша реклама.

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

Привет братья - сталкеры.

мне бы примерчик пользования модуля se_stor,  ну или хотя бы подскажите мод где можно подсмотреть.

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@DMT, Если хочешь чтобы спавн был один, то просто сделай через инфопоршень, самый простой подход. Пример под спойлером.

 

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

function fix_recept()

  if (not db.actor:has_info( "info_amk_recipt_drop_souls" )) and db.actor:has_info( "info_amk_recipt_souls" ) then
    db.actor:give_info_portion( "info_amk_recipt_soul_drops" )
    db.actor:give_info_portion( "info_amk_recipt_soul_fire" )
    db.actor:give_info_portion( "info_amk_recipt_soul_cristal" )
    db.actor:give_info_portion( "info_amk_recipt_soul_bengal" )
end

end

 

Ссылка на комментарий
4 часа назад, UriZzz сказал:

мне бы примерчик пользования модуля se_stor

Тебе какого рода примерчик-то нужен? В сборочном цехе смотрел? Там всё максимально подробно расписано - и автором, и я от себя добавил, даны примеры подключения для всех частей игры и даже подготовлены скрипты для оригиналов.

А использование... что может быть банальней трёх добавленных глобальных функций SetVar, GetVar и DelVar, тоже описанных? Ведь работа модуля и сводится как раз к сохранению, чтению и удалению переменных.

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

@Kirgudu, да, я знаю, просто хочу увидеть реализацию в коде, именно в ТЧ. Прописка функций записи, чтения, удаления конкретной переменной...

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

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий
4 часа назад, Kirgudu сказал:

что может быть банальней трёх добавленных глобальных функций SetVar, GetVar и DelVar

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

se_stor.set(key, value)

se_stor.get(key, value, default)

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

3 часа назад, UriZzz сказал:

просто хочу увидеть реализацию в коде, именно в ТЧ.

Вот парой строк выше, собственно, она и есть. Ну или через SetVar, GetVar... кому какие фломастеры ближе.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

@Zander_driver, насчёт фломастеров полностью согласен - кому как удобнее, тем более если скриптёр понимает, что именно делает. На мой взгляд, переопределить при замене (гипотетической) модуля четыре глобальные функции в одном месте проще, чем выискивать по всем скриптам вызовы внутренних функций модуля.

Выше, кстати, есть опечатка: должно быть "se_stor.get(key, default)"

 

9 часов назад, UriZzz сказал:

просто хочу увидеть реализацию в коде

Вызовы глобальных функций будут выглядеть так:

SetVar(key, value) -- установить значение переменной
GetVar(key, default_value) -- получить значение переменной (default_value - значение по умолчанию для переменных типа таблица)
DelVar(key) -- удалить переменную
HasVar(key) -- проверить наличие переменной в хранилище

Для всех частей игры работает одинаково.

Изменено пользователем Kirgudu
  • Спасибо 1
  • Нравится 1
Ссылка на комментарий
9 часов назад, Kirgudu сказал:

Выше, кстати, есть опечатка: должно быть "se_stor.get(key, default)"

Да, виноват-с... :blush: вы правы.

9 часов назад, Kirgudu сказал:

проще, чем выискивать по всем скриптам

Так я же и не выискивал. Вообще понятия не имею, где у меня se_stor дергается. Не помню)

Просто сам se_stor заменил на такой.

-----------------------------------------------------------------------------------------------------------
-- Заглушка для подключения всех скриптов, использующих se_stor Артоса, к SCRIPT_VARS_STORAGE движка OGSR
-----------------------------------------------------------------------------------------------------------

function get(var_name, default)
	local s = get_stored_vars()
	if s[var_name] ~= nil then return s[var_name] end
	return default
end
function set(var_name, value, f_check)
	local s = get_stored_vars()
	s[var_name] = value
end
--~

Для движка OGSR, se_stor выглядит вот так :) Это на всякий случай, если кто-то будет заморачиваться зачем-то установкой модуля se_stor на моды на этом движке.

Глобальные GetVar, SetVar, etc... на основе этих двух функций тоже дописать можно, при желании.

Изменено пользователем Zander_driver
  • Нравится 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
В 12.12.2019 в 23:47, mole venomous сказал:

вылет "...gamedata\scripts\amk.script:1403: attempt to perform arithmetic on local 'st' (a string value)"

Цитирую сам себя. Методом исключения нашёл объект проблемы. В реварде за квест был ремкит. Одно только наличие его у ГГ приводит к вылету при загрузке любого сейва. Тут понятно, почему жучинная ссылка на amk.script - кривая адаптация соляночных таймеров. Если попробовать загрузить сейв после вылета, он загрузится, но при очередном лоаде с игры - снова вылет. Мне теперь уже просто интересно, а почему вылетает при загрузке даже более раннего сохранения, где ремкомплект ещё не заспаунен у актёра?

Здесь могла быть ваша реклама.

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

@mole venomous, а что у тебя находится в amk.script, в строке 1403? Гадалки и телепаты в отпуске все.

Изменено пользователем naxac
  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

а что у тебя находится

Я думал не потребуется весь код, ибо я мог криво адаптировать (или не до конца) таймеры. А вообще это ф-ия get_num(str,idx), она одинакова и в оригинальном АМК, и в Солянке. А менял там коды работы с таймерами, начиная с ф-ии start_timer. Если уж вылет получаем, имея лишь ремкит в инвентаре, видимо, проверка начинается уже с кондиции самого repbox (они вроде рассчитаны на 5-кратное использование, из IMM). Ну чёрт с ним, это наверное, ещё возможно отследить и исправить. Я вот не пойму, почему вылетает при лоаде сейва, на котором никакой речи о присутствии ремкита нет.

Здесь могла быть ваша реклама.

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

@mole venomous, чекни измененные тобой скрипты луа-плагином (если в npp работаешь) или синтакс-чекером. Вернее всего, где-то ошибка и просто напросто бъётся сохранение.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
3 часа назад, naxac сказал:

где-то ошибка

С синтаксисом точно порядок, я за этим слежу (чекером всё равно проверил, на всякий).

https://yadi.sk/d/Y1lcpjRHV9kt8w  

Старый код далеко не всегда удаляю, а тот код, что не меняю, привожу с приятному глазу виду. Там вероятно, "цепная" реакция и ф-ии вызываются одна за другой. Буду по тихому "подменять". Я подумал, может кто сталкивался с подобными вылетами при правке служебных АМК-шных ф-ий, а то заниматься тупой копи-пастой неохота, лучше понять, где ошибся и не менять лишнего.

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

Здесь могла быть ваша реклама.

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

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

@DMT, функция не обязана что-то возвращать, чтобы проделать какую-либо работу. Вот здесь

local tt = t_data[npc:id()]

из массива менеджеров торговли (не знаю, из какого мода взят код, но это именно переделанный относительно оригинала trade_manager) читается экземпляр, соответствующий конкретному NPC. Далее происходит изменение свойств этого экземпляра (списков покупки/продажи) в зависимости от условий. При этом массив менеджеров торговли наполняется другой функцией (trade_init или её аналог), а результаты изменений, сделанных внутри функции update, доступны также и за её пределами.

 

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

  • Нравится 1
Ссылка на комментарий
12 часов назад, DMT сказал:

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

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

  • Согласен 1
Ссылка на комментарий
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 ? Как дальше это используется ?

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

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

Ну код же не такой. Код в функции такой:

local tt = {{a=1}, {b=0}}

function f(s)
  local t = tt[1]
  t.a = t.a + 1
  s.b = s.b - 1
  print(t.a, s.b)
end

print(tt[1].a,tt[2].b)
f(tt[2])
f(tt[2])
print(tt[1].a,tt[2].b)

Выводится:

1   0
2   -1
3   -2
3   -2

Как написал @Kirgudu, посмотри работу с таблицами в луа.

Изменено пользователем abramcumner
  • Спасибо 1
  • Согласен 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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