Kirgudu 1 264 Опубликовано 8 Декабря 2015 @vampirnik77, модуль работает независимо от уровней. В упомянутом посте находится комплект, который я проверил «от и до» на чистой игре и всех платформах. При условии соблюдения всех инструкций по подключению, добавления всех указанных вставок и удаления указанных кусков кода всё должно работать. Проверь, всё ли учёл при подключении, возможно что-то случайно пропустил. Обрати внимание на таблицу tPkChunks в модуле и методы ext_save и ext_load в биндере актора - если прикручиваешь не к чистой игре, а к моду, вполне возможно, что их содержимое следует поменять. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 8 Декабря 2015 @TIGER_VLAD, это ссылка на скомпилированный байт-код. Если говорить о частном случае сохранения данных, чанк представляет собой технологический нет-пакет, созданный для хранения данных конкретного внешнего модуля; данные пишутся в него стандартными для нет-пакета методами при сохранении. Сначала создаются такие чанки для всех внешних модулей, которые мы подключаем к хранилищу. Затем чанки побайтово копируются в нет-пакет специального игрового объекта (или нескольких объектов, если суммарный размер чанков того требует), который, в свою очередь, сохраняется в сейве. Описал несколько сумбурно - слов под конец рабочего дня не хватает. Возможно, гуру меня поправят или дополнят. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 9 Февраля 2016 @ZeeK, не изымается оно там, ибо кусок в оригинале закомментирован. Только деньги отдаются. А если есть желание изъятие восстановить, то ничто не мешает сделать нужный фильтр. Например, в функцию get_actor_inv добавить проверку на класс и в список для изъятия помещать только удовлетворяющие условиям предметы. Или сделать то же самое уже после, при переборе списка. Весь нужный код там уже практически есть, надо только доработать напильником согласно своим требованиям. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 12 Февраля 2016 (изменено) @ZeeK, local tbl = { ["wpn_knife"] = true, ["wpn_torch"] = true, ["wpn_pm"] = true } ... if not tbl[item:section()] then ... end Изменено 12 Февраля 2016 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 16 Февраля 2016 @Kondr48, прежде чем советовать, неплохо бы самому подучить матчасть. Очевидно, что sobj = nil, а не результат вызова серверного метода. И проверка нужна такая: local sobj = alife():object(self.object:id()) if sobj ~= nil then ... end @Wlad777, если серверный объект не найден, значит и спавнить негде. Так что такая проверка вполне подойдёт. нужен кликабельный список, при нажатии на элемент чтобы вызывалась функцияПоищи здесь информацию по CUIListWnd и CUIListItem (CUIListItemEx). На элементы списка можно будет повесить коллбек ui_events.LIST_ITEM_CLICKED - вот и возможное решение искомой задачи. 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 16 Февраля 2016 Удаляется, вестимо.Надо смотреть, что идёт перед добавленным куском кода. Причём не только в скрипте, но и, например, в секции on_death логики НПС, если обработка логики в мотиваторе идёт перед своим кодом. В общем, надо внимательно проинспектировать свои правки. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 7 Апреля 2016 @Romz, если я правильно помню, при переходе на другую локацию перед сохранением актору прописывается новая позиция (координаты и/или id вертексов или даже id новой локации). Используя известные методы по работе с графом, легко сравнить эту новую позицию с параметрами текущей локации и при несовпадении делать или не делать то, что требуется. Расписать подробно не могу, так как забежал сюда буквально на минутку. Но ты уже давно не новичок, сообразишь. Если я прав, конечно. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 7 Апреля 2016 Имхо, поскольку смена локации происходит одновременно с сохранением/загрузкой, достаточно сохранить параметры текущей локации всего один раз, скажем в actor_binder:__init. Делать это пусть даже на медленном апдейте избыточно. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 7 Апреля 2016 @Romz, позицию берёшь, надеюсь, серверного объекта? Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 8 Апреля 2016 (изменено) А вот это как раз слишком рано. Задумайтесь, как могут срабатывать колбеки до того, как инициализирован сам объект биндера? Это же его методы. Конечно они после __init будут срабатывать. А при чём тут биндер? Речь-то изначально шла о том, как отловить факт перехода на другую локацию перед этим самым переходом. А это происходит уж точно тогда, когда актор полностью инициализирован в процессе предыдущей загрузки. И значит можно сохранить текущую позицию, например id локации, один раз, в момент инициализации актора. @Romz, попробуй в on_item_drop проверять позицию не клиентского объекта, как ты это делаешь сейчас, а серверного. Примерно так: local sObj = alife():object(db.actor:id()) local vPos,idLv,idGv = sObj.position, sObj.m_level_vertex_id, sObj.m_game_vertex_id -- дальше можно вычислить id локации и сравнить с запомненным if idGv and game_graph():valid_vertex_id(idGv) then local oVertex = game_graph():vertex(idGv) if oVertex then local idLevel = oVertex:level_id() end end Засим из дискуссии удаляюсь по причине катастрофической нехватки времени. Удачи в поисках решения! Изменено 8 Апреля 2016 пользователем Kirgudu 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 14 Июля 2016 (изменено) @Kober(BRUC), 1. "local cly = 25" и т. п., если не ошибаюсь, видно только в пределах своей ветки if ... else. Следует объявить переменную до if, а внутри только задавать значение. 2. math.randomseed результат не возвращает, а только задаёт случайное смещение для последующего math.random. Присваивание переменной в данном случае лишнее. 3. Выбор фразы для печати ты делаешь в одной из веток внутри if, а не за пределами оного. Конкретно, печать у тебя происходит только в случае опции "random". 4. Судя по всему, навыки чтения кода у тебя не очень высокие. В этом случае, чтобы делать меньше ошибок, будет хорошей практикой использовать отступ для вложенных элементов. local number = 10 say_tbl_one_ru = { -- Таблица с русскими ответами. 'Угадай число'; "Не верно. Чуть больше.", "Не верно. Чуть меньше.", "Вы угадали! Число равно:" } local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000 function gl() if complexity == 'esay' then local cly = 25 elseif complexity == 'normal' then local cly = 100 elseif complexity == 'hard' then local cly = 1000 elseif complexity == 'random' then local ran_data = math.randomseed(os.time()) local ran_data = math.random(100, 10000) local cly = ran_data local num = math.random(1, cly) if number < num then print(say_tbl_one_ru[1]) elseif number > num then print(say_tbl_one_ru[2]) elseif number == num then print(say_tbl_one_ru[3]) end end end gl() local number = 10 say_tbl_one_ru = { -- Таблица с русскими ответами. 'Угадай число'; "Не верно. Чуть больше.", "Не верно. Чуть меньше.", "Вы угадали! Число равно:" } local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000 function gl() local cly if complexity == 'esay' then cly = 25 elseif complexity == 'normal' then cly = 100 elseif complexity == 'hard' then cly = 1000 elseif complexity == 'random' then math.randomseed(os.time()) cly = math.random(100, 10000) end local num = math.random(1, cly) if number < num then print(say_tbl_one_ru[1]) elseif number > num then print(say_tbl_one_ru[2]) else print(say_tbl_one_ru[3]) end end gl() Изменено 14 Июля 2016 пользователем Kirgudu 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 19 Июля 2016 @Winsor, а почему ты думаешь, что данные там битые? В зависимости от значения num_items наполнение нет-пакета может меняться. Подробнее, например, здесь. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 19 Июля 2016 @Winsor, трудно сказать, я с таким не сталкивался. Собственно, в netpk до сих пор могут быть баги. Artos до момента своего исчезновения сам периодически находил в своих модулях и правил ошибки, да и последняя версия модулей, что лежит в «Сборочном цехе», тоже подверглась небольшим исправлениям по сравнению с оригиналом автора. Не исключено, что ты столкнулся с ещё не обнаруженной до сих пор ошибкой. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 21 Июля 2016 Коллеги, вы все не обратили внимание на один момент. Оставив в стороне то, как написана сама функция, видим это: [error]Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:324: attempt to call field 'mil_sound_update' (a nil value) Перенес в другой скрипт, функцию не менял - НЕТ вылета... ИМХО, ошибка где-то в другом месте того модуля, где функция располагалась первоначально. И несмотря на то, что чекер ошибок не даёт, что-то мешает движку прочесть все элементы этого модуля.UPD: Если только функция сначала была не в bind_stalker.script. 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 27 Июля 2016 (изменено) @AndrewMor, например так: function GetMaxLevelVertexId(idLevel) local gg, idLvMax, levelChecked, i, idLv = game_graph(), 0, false, 0, nil while i < 65536 do if gg:valid_vertex_id(i) and gg:vertex(i):level_id() == idLevel then idLv = gg:vertex(i):level_vertex_id() if idLvMax < idLv then idLvMax = idLv end if not levelChecked then levelChecked = true end elseif levelChecked then break end i = i + 1 end return idLvMax end -- пример вызова для текущей локации: idLvMax = GetMaxLevelVertexId(alife():level_id()) Изменено 28 Июля 2016 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 27 Июля 2016 @Kober(BRUC), table.insert(t_tbl, dd) 2 2 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 2 Августа 2016 @KitkaT.Net, local toggle_time = 0 function test_pause() give_info("zamer_dozimetr") toggle_time = time_global() + 1000 level.add_call( function() return time_global() > toggle_time end, -- условие срабатывания function() disable_info("zamer_dozimetr") end -- выполняется, если условие равно true ) end 1 1 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 18 Августа 2016 (изменено) @CRAZY_STALKER666, глянь в оригинале функцию xr_effects.set_enemies() - там очень близко к твоему случаю. Ссорит одного НПС со списком других, сделать аналог под свои нужды не сложно. Изменено 18 Августа 2016 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 18 Августа 2016 (изменено) @CRAZY_STALKER666, тебе нужен клиентский. Для получения используй, например, функцию level.object_by_id(id). Ну или уже упомянутую level_object_by_sid(sid). Изменено 18 Августа 2016 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 18 Августа 2016 (изменено) увидел это void berserk(); -- вопреки некоторым предположениям - это не наследие "Oblivion Lost", поскольку функция новая, а в 1935 её не было. Однако её назначение не вполне понятно.В теме "Справочник...", кстати, можно найти много интересного. Изменено 18 Августа 2016 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение