DMT 2 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 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 и даже кое-что понял, но этот коммент всё же вряд ли можно назвать уроком. Ссылка на комментарий
abramcumner 1 146 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 4 минуты назад, DMT сказал: при каждом сохранении-загрузке спавнится ещё одна аномалия и ещё один вертолёт помимо тех, которые уже были заспавнены в прошлые разы. Это плохо. Игроки начинают часто загружаться, когда игра уже слишком сложная. А ты спавном вертолоетов и аномалия делаешь ее еще сложнее. Лучше перенеси вызов спавна в другое место или добавь каких-нибудь условий. 7 минут назад, DMT сказал: Так можно делать сколько угодно или после некоторого критического количества спавнов начнутся вылеты? Если объектов станет больше 65535. 8 минут назад, DMT сказал: А есть какие-то уроки с детальным разбором нет-пакетов и как ими пользоваться? По ссылке разбор класса net-packet, он простой. Тебе же нужно, что входит в нет-пакеты разных классов. Уроков не знаю, все нет-пакеты есть в acdc. Возможно в модулях Artos`a расписано какое поле, что значит. 1 Ссылка на комментарий
mole venomous 3 386 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 2 часа назад, abramcumner сказал: каждом сохранении-загрузке Ну это перебор, конечно. Если спаун нужен постоянно, надо его хотя бы ограничивать таймером или инфопорциями, выдающимися постепенно и в определённый момент. 1 Здесь могла быть ваша реклама. Ссылка на комментарий
UriZzz 1 004 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 Привет братья - сталкеры. мне бы примерчик пользования модуля se_stor, ну или хотя бы подскажите мод где можно подсмотреть. Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
I am Dead 912 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 @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 Ссылка на комментарий
Kirgudu 1 207 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 4 часа назад, UriZzz сказал: мне бы примерчик пользования модуля se_stor Тебе какого рода примерчик-то нужен? В сборочном цехе смотрел? Там всё максимально подробно расписано - и автором, и я от себя добавил, даны примеры подключения для всех частей игры и даже подготовлены скрипты для оригиналов. А использование... что может быть банальней трёх добавленных глобальных функций SetVar, GetVar и DelVar, тоже описанных? Ведь работа модуля и сводится как раз к сохранению, чтению и удалению переменных. Инструмент Ссылка на комментарий
UriZzz 1 004 Опубликовано 13 Декабря 2019 Поделиться Опубликовано 13 Декабря 2019 (изменено) @Kirgudu, да, я знаю, просто хочу увидеть реализацию в коде, именно в ТЧ. Прописка функций записи, чтения, удаления конкретной переменной... Изменено 13 Декабря 2019 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Zander_driver 10 333 Опубликовано 14 Декабря 2019 Поделиться Опубликовано 14 Декабря 2019 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. Ссылка на комментарий
Kirgudu 1 207 Опубликовано 14 Декабря 2019 Поделиться Опубликовано 14 Декабря 2019 (изменено) @Zander_driver, насчёт фломастеров полностью согласен - кому как удобнее, тем более если скриптёр понимает, что именно делает. На мой взгляд, переопределить при замене (гипотетической) модуля четыре глобальные функции в одном месте проще, чем выискивать по всем скриптам вызовы внутренних функций модуля. Выше, кстати, есть опечатка: должно быть "se_stor.get(key, default)" 9 часов назад, UriZzz сказал: просто хочу увидеть реализацию в коде Вызовы глобальных функций будут выглядеть так: SetVar(key, value) -- установить значение переменной GetVar(key, default_value) -- получить значение переменной (default_value - значение по умолчанию для переменных типа таблица) DelVar(key) -- удалить переменную HasVar(key) -- проверить наличие переменной в хранилище Для всех частей игры работает одинаково. Изменено 14 Декабря 2019 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
Zander_driver 10 333 Опубликовано 14 Декабря 2019 Поделиться Опубликовано 14 Декабря 2019 (изменено) 9 часов назад, Kirgudu сказал: Выше, кстати, есть опечатка: должно быть "se_stor.get(key, default)" Да, виноват-с... вы правы. 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... на основе этих двух функций тоже дописать можно, при желании. Изменено 14 Декабря 2019 пользователем 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. Ссылка на комментарий
mole venomous 3 386 Опубликовано 14 Декабря 2019 Поделиться Опубликовано 14 Декабря 2019 В 12.12.2019 в 23:47, mole venomous сказал: вылет "...gamedata\scripts\amk.script:1403: attempt to perform arithmetic on local 'st' (a string value)" Цитирую сам себя. Методом исключения нашёл объект проблемы. В реварде за квест был ремкит. Одно только наличие его у ГГ приводит к вылету при загрузке любого сейва. Тут понятно, почему жучинная ссылка на amk.script - кривая адаптация соляночных таймеров. Если попробовать загрузить сейв после вылета, он загрузится, но при очередном лоаде с игры - снова вылет. Мне теперь уже просто интересно, а почему вылетает при загрузке даже более раннего сохранения, где ремкомплект ещё не заспаунен у актёра? Здесь могла быть ваша реклама. Ссылка на комментарий
naxac 2 445 Опубликовано 14 Декабря 2019 Поделиться Опубликовано 14 Декабря 2019 (изменено) @mole venomous, а что у тебя находится в amk.script, в строке 1403? Гадалки и телепаты в отпуске все. Изменено 14 Декабря 2019 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
mole venomous 3 386 Опубликовано 15 Декабря 2019 Поделиться Опубликовано 15 Декабря 2019 1 час назад, naxac сказал: а что у тебя находится Я думал не потребуется весь код, ибо я мог криво адаптировать (или не до конца) таймеры. А вообще это ф-ия get_num(str,idx), она одинакова и в оригинальном АМК, и в Солянке. А менял там коды работы с таймерами, начиная с ф-ии start_timer. Если уж вылет получаем, имея лишь ремкит в инвентаре, видимо, проверка начинается уже с кондиции самого repbox (они вроде рассчитаны на 5-кратное использование, из IMM). Ну чёрт с ним, это наверное, ещё возможно отследить и исправить. Я вот не пойму, почему вылетает при лоаде сейва, на котором никакой речи о присутствии ремкита нет. Здесь могла быть ваша реклама. Ссылка на комментарий
naxac 2 445 Опубликовано 15 Декабря 2019 Поделиться Опубликовано 15 Декабря 2019 @mole venomous, чекни измененные тобой скрипты луа-плагином (если в npp работаешь) или синтакс-чекером. Вернее всего, где-то ошибка и просто напросто бъётся сохранение. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
mole venomous 3 386 Опубликовано 15 Декабря 2019 Поделиться Опубликовано 15 Декабря 2019 (изменено) 3 часа назад, naxac сказал: где-то ошибка С синтаксисом точно порядок, я за этим слежу (чекером всё равно проверил, на всякий). https://yadi.sk/d/Y1lcpjRHV9kt8w Старый код далеко не всегда удаляю, а тот код, что не меняю, привожу с приятному глазу виду. Там вероятно, "цепная" реакция и ф-ии вызываются одна за другой. Буду по тихому "подменять". Я подумал, может кто сталкивался с подобными вылетами при правке служебных АМК-шных ф-ий, а то заниматься тупой копи-пастой неохота, лучше понять, где ошибся и не менять лишнего. Изменено 15 Декабря 2019 пользователем mole venomous Здесь могла быть ваша реклама. Ссылка на комментарий
DMT 2 Опубликовано 15 Декабря 2019 Поделиться Опубликовано 15 Декабря 2019 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 Ссылка на комментарий
Kirgudu 1 207 Опубликовано 16 Декабря 2019 Поделиться Опубликовано 16 Декабря 2019 @DMT, функция не обязана что-то возвращать, чтобы проделать какую-либо работу. Вот здесь local tt = t_data[npc:id()] из массива менеджеров торговли (не знаю, из какого мода взят код, но это именно переделанный относительно оригинала trade_manager) читается экземпляр, соответствующий конкретному NPC. Далее происходит изменение свойств этого экземпляра (списков покупки/продажи) в зависимости от условий. При этом массив менеджеров торговли наполняется другой функцией (trade_init или её аналог), а результаты изменений, сделанных внутри функции update, доступны также и за её пределами. Для общего понимания рекомендую почитать, что такое ссылочные типы данных и типы значений (reference type и value type). 1 Инструмент Ссылка на комментарий
abramcumner 1 146 Опубликовано 16 Декабря 2019 Поделиться Опубликовано 16 Декабря 2019 12 часов назад, DMT сказал: А что тогда вообще делает эта функция? Она принимает аргумент npc, ничего не возвращает и ничего не пишет во внешние локалы. Как тогда вызов этой функции может на что-то повлиять в игре? Это не чистая функция, у нее есть побочные эффекты в виде вызовов npc:buy_condition и аналогичных функций. 1 Ссылка на комментарий
DMT 2 Опубликовано 16 Декабря 2019 Поделиться Опубликовано 16 Декабря 2019 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 ? Как дальше это используется ? Ссылка на комментарий
abramcumner 1 146 Опубликовано 16 Декабря 2019 Поделиться Опубликовано 16 Декабря 2019 (изменено) 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, посмотри работу с таблицами в луа. Изменено 16 Декабря 2019 пользователем abramcumner 1 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти