Artos 99 Опубликовано 16 Июня 2012 Поделиться Опубликовано 16 Июня 2012 (изменено) Капрал Хикс, ну наверное не о том как реализовать уже реализованное вопрос, может именно для особого костюма понадобился особый звук? А вот о том "что не так" - можно о-очень много сказать. Проверять в 12-ом слоте костюм - ну очень забавная идея ... Вначале выполнять операцию с db.actor:item_in_slot(12) , а потом проверять - а имеет ли она (db.actor) значение ... Функция возвратить (по идее) должна об'ект костюма - а его с числом сравнивают ... slot_twelve ~= 0 Ни так далее ... полная какофония с переменными и методами. SibireaStalker, у тебя в первую очередь "не так" - это полное непонимание чего же ты (иль камрад) пишешь и к скриптам полученное имеет отношение в том, что символы и слова такие же, но смысла никакого ... Тут только чтение и изучение хотя бы самых начальных азов по Lua и скриптам может тебе помочь. Изменено 16 Июня 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Shredder 49 Опубликовано 17 Июня 2012 Поделиться Опубликовано 17 Июня 2012 (изменено) SibireaStalker, я бы сделал как-то так local current_outfit = 0 function proverka_na_helmet() local actor = db.actor if not actor then return end local slot_twelve = actor:item_in_slot(12) if not slot_twelve then current_outfit = 0 return end if slot_twelve:id() ~= current_outfit then local snd = sound_object([[interface\mp_reward]]) -- Путь до звука snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) current_outfit = slot_twelve:id() end end Изменено 17 Июня 2012 пользователем ColR_iT Про тег code тоже не забываем. Ссылка на комментарий
Kirgudu 1 204 Опубликовано 19 Июня 2012 Поделиться Опубликовано 19 Июня 2012 Колебался между этой темой и "общими вопросами программирования", решил запостить вопрос сюда; если ошибся, прошу перенести. При работе над HARDWARMOD (CS) я столкнулся вот с какой штукой. Имеем таблицу вида local t = { Alpha = {a=3,b=13}, Bravo = {a=1,b=12}, Charlie = {a=5,b=11}, Delta = {a=9,b=17}, Echo = {a=7,b=16} } содержащую динамически генерируемые данные. В зависимости от некоторых условий мне нужно отсортировать эту таблицу по тому или иному полю таблиц, содержащихся в значениях. До поры до времени прекрасно работал стандартный для Lua метод: table.sort(t, function(v1,v2) return v1.b < v2.b end) но в какой-то момент перестал это делать. Проверял даже на самых несложных примерах, без вложенных таблиц - сортировка даже по простым значениям стала возвращать исходную таблицу (либо далее используемый pairs перебирал элементы таблицы раньше в правильном порядке, хоть это и не гарантируется, а теперь перестал это делать). Между двумя этими моментами, работы и не работы сортировки, я внедрил модуль универсального хранилища Artos-а и, пожалуй, всё, по крайней мере ничего особо значимого больше не делал. Из положения я вышел: написал собственную функцию для получения упорядоченной как мне надо таблицы: -- Выборка из таблицы с сортировкой по value (быстрая сортировка с разбивкой на две части). -- Работает также в случае если value - тоже таблица (простая). -- Выводимая таблица представляет собой простой массив, индекс исходной таблицы перемещается в поле "__key". -- t - исходная таблица -- s - значение, по которому должна произойти сортировка. Может принимать вид: -- "", nil или без параметра - для случаев, когда vаlue представляет собой простое значение. Пример: -- t = {3,7,1,9,4}; вызов сортировки: t2 = sort_table_by_value(t, "") -- "key" - для случаев, когда value представляет собой таблицу, указывается название поля этой таблицы для сортировки по нему. Пример: -- t = {{a=3,b=7,c=1},{a=8,b=2,c=5}}; вызов сортировки: t2 = sort_table_by_value(t, "b") function sort_table_by_value(t, s) local function quick_sort(t, s, low, high) local i, j, x = low, high, t[math.floor((low+high)/2)] while (i <= j) do if s == "" then while (t[i] < x) do i = i + 1 end while (t[j] > x) do j = j - 1 end else while (t[i][s] < x[s]) do i = i + 1 end while (t[j][s] > x[s]) do j = j - 1 end end if (i <= j) then local temp = t[i] t[i] = t[j] t[j] = temp i, j = i + 1, j - 1 end end if (low < j) then quick_sort(t, s, low, j) end if (i < high) then quick_sort(t, s, i, high) end end s = s or "" if not t or type(t) ~= "table" then return nil, "sort_table_by_value: wrong source" end if type(s) ~= "string" then return nil, "sort_table_by_value: wrong sort parameter" end if t.__key then return nil, "sort_table_by_value: source table already has '__key' field" end local t1, t2, low, high = deepcopy(t), {}, 1, 0 for k,v in pairs(t1) do high = high + 1 v.__key = k table.insert(t2, v) end if high <= 1 then return t2, nil end quick_sort(t2, s, low, high) return t2, nil end -- Полное копирование переменной любого типа, включая таблицу, по значению function deepcopy(object) local lookup_table = {} local function _copy(object) if type(object) ~= "table" then return object elseif lookup_table[object] then return lookup_table[object] end local new_table = {} lookup_table[object] = new_table for index, value in pairs(object) do new_table[_copy(index)] = _copy(value) end return setmetatable(new_table, _copy(getmetatable(object))) end return _copy(object) end однако вопрос остался открытым: что и каким образом могло так подействать, что перестал работать встроенный метод? Может быть, он изначально не должен был работать - но ведь работал же. И ещё, раз у меня зашла речь об универсальном хранилище, хочу уточнить один момент. Возможно, в неявном виде он обсуждался здесь раньше, однако я об этом не знал; может быть, кому-нибудь тоже эта информация пригодится. Из se_stor вызываются методы расширения для таблиц clone, serialize и другие, описанные в m_helpers.script. Но в момент регистрации se_stor файл m_helpers.script ещё не обработан движком, поэтому вызов тех методов приводит к вылету. Чтобы этого не происходило, я добавил в функцию se_custom_storage:on_register() проверку на то, что m_helpers.script существует, после чего вылеты прекратились. Вот модифицированная функция регистрации: function se_custom_storage:on_register() cse_alife_dynamic_object.on_register(self) --/#+# загрузка: чтение tail-пакета в хранилище (из объекта хранения загруженного из сэйва) -- printf("se_custom_storage:on_register:ID=[%s]:sid=[%s]%s", self.id, self.m_story_id, "") --/#~# if self.m_story_id ~= 4294967296 then --/ элемент ext-modules tStorPks[self.m_story_id] = self.tail_pk --/ запоминаем нет-пакет для 'отложенного прочтения' alife():release(self,true) --/ clear (удаляем объект 'загруженный из сэйва') else --/ элемент общего хранилища? if not m_helpers then return end -- <-- добавил тут local sini = self:spawn_ini() if sini:section_exist("metka") then --/ элемент загружен из сэйва local build = (sini:line_exist("metka","d") and sini:r_s32("metka","d")) or nil --/метка-дата local f_nocompress = sini:line_exist("metka","s") --/ флаг несжатия данных read_tail_packet( self.tail_pk, tonumber(build), f_nocompress ) --/ чтение в общую таблицу db.storehouse alife():release(self,true) --/ clear (удаляем 'прочитанный' объект) else --/ создан новый элемент table.insert(tStorIDs,self.id) --/ запоминаем в списке IDs end end end Возможно, это решение не идеально, но какое есть. Инструмент Ссылка на комментарий
Tris 9 Опубликовано 20 Июня 2012 Поделиться Опубликовано 20 Июня 2012 Здравствуйте! Хотел узнать по какой причине, если в игре Зов Припяти на патче 1.6.00 в скрипте написать такую строку: db.actor.radiation = db.actor.radiation + 00000.1 то радиация добавляется не постепенно, а сразу по максимуму? Пробовал делать намного больше нулей, результат тот же. P.S вызывал через апдейт актора, раз в 1 секунду. • Dead Forgetting Zone • Мои работы. Обновление: 24.08.2012 Ссылка на комментарий
ColR_iT 171 Опубликовано 20 Июня 2012 Поделиться Опубликовано 20 Июня 2012 (изменено) Tris, свойства для объектов класса game_object работают несколько иначе. Вот такой код: local actor_radiation = db.actor.radiation присвоит переменной actor_radiation текущее значение радиации. А вот такой: db.actor.radiation = 0.1 увеличит текущее значение на 0.1 (отрицательное значение уменьшает текущие значение). Поэтому ты в своём коде к текущему значению радиации прибавляешь ещё столько же плюс 0.00001 (ты вероятно точку не там поставил). Всё это справедливо для всех свойств: health (здоровье), morale (мораль), power (выносливость), psy_health (пси-звдоровье), radiation (радиация), bleeding (кровотечение, только в ЗП). Изменено 20 Июня 2012 пользователем ColR_iT Ссылка на комментарий
Kondr48 314 Опубликовано 22 Июня 2012 Поделиться Опубликовано 22 Июня 2012 (изменено) У меня такой вопрос, ведь при использовании такой строки(не знаю, как правильно назвать) db.actor:activate_slot(0) Должен активироваться слот ножа, так?Но этого не происходит почему-то, вот вся функция: function gaz_fake(obj) if obj:section() == 'fake_hud_item_gaz' then if db.actor:item_in_slot(0) == "wpn_knife" then alife():release(alife():object(slot1:id())) end alife():create("hud_item_gaz", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) db.actor:activate_slot(0) inv_close() hud:GetCustomStatic("gaz_widescrean") end end Все остальное работает нормально, подскажите, в чем я ошибся? Да, и еще вопрос, возможно запустить таймер на 4 секунды, по истечении которых выполнится функция, но без прописывания его в апдейт? Потому как таких таймеров будет много. Как в hint сделать переход текста с одной строки в другую? П.С. \n почему-то не работает. Изменено 26 Июня 2012 пользователем ColR_iT Ссылка на комментарий
Charsi 440 Опубликовано 24 Июня 2012 Поделиться Опубликовано 24 Июня 2012 Вампир35, чтобы заработало, напиши \\n Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Kondr48 314 Опубликовано 26 Июня 2012 Поделиться Опубликовано 26 Июня 2012 Charsi, так тоже не работает Смена стандартного магазина на более ёмкий. \\n На 10 паронов больше в магазине. Ссылка на комментарий
Kirgudu 1 204 Опубликовано 26 Июня 2012 Поделиться Опубликовано 26 Июня 2012 (изменено) Вампир35, можно попробовать в xml-конфиг окна с этими подсказками добавить элемент hint_wnd с атрибутом complex_mode="1". Примерно так: <w> <!-- остальное содержимое --> <hint_wnd x="0" y="0" width="210" height="100"> <background x="0" y="0" width="210" height="100" border="10"> <texture a="100">ui_temp_frame</texture> </background> <text x="20" y="20" width="190" height="100"> <text font="letterica16" color="ui_6" complex_mode="1" align="l" vert_align="t"/> </text> </hint_wnd> </w> А дальше пробовать "\n" и "\\n". Изменено 26 Июня 2012 пользователем Kirgudu Инструмент Ссылка на комментарий
kratos888 0 Опубликовано 26 Июня 2012 Поделиться Опубликовано 26 Июня 2012 Всем доброго времени суток. По ходу разработки своего модика назрело ещё два вопроса: 1) Пробую заспавнить НПС через скрипт, используя функцию из скрипта amk: function spawn_npc() local npc = alife():create("npc", vector():set(мои_координаты), левел_вертекс_айди, гейм_вертекс_айди) local tbl = amk.read_stalker_params(npc) if npc then tbl.sid = 8000 amk.write_stalker_params(tbl, obj) end end Непись спавнится, но никакого story_id игра у непися не находит (нужно поставить метку на непися во время квеста). Ставил метку в описание задания через game_story_ids.ltx. 2) Возможно ли в Сталкере отменить какое-нибудь текущее задание, или строго выполнить\провалить? Если можно отменить, то как? Ссылка на комментарий
ColR_iT 171 Опубликовано 26 Июня 2012 Поделиться Опубликовано 26 Июня 2012 kratos888. 1. Функцию то ты используешь, но по всей видимости не до конца понимаешь как она работает. Чтобы story_id читался, нужно перевести НПС оффлайн и обратно, либо сейв-лоад. Ссылка на комментарий
Kirgudu 1 204 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 (изменено) Возник очередной вопрос по универсальному хранилищу, в этот раз весьма насущный. Дело в том, что я столкнулся с пропаданием одного из custom_storage объектов при загрузке, соответственно, не загружается и его нет-пакет, что приводит к пропаже части сохраняемых данных. Причём до поры до времени всё в порядке, сохраняются и загружаются все данные, никаких ошибок нет. Я могу даже ничего не делать, просто стоять на одном месте и жать F5-F9 в цикле. Но в какой-то момент... Вот небольшая иллюстрация из лога сбойного цикла записи-загрузки. Тут записывается 7 custom_storage объектов, по которым оказались распределены данные из хранилища: ! Cannot find saved game ~:create_storage_element:id=[25778],sid=[9901]:cnt=[1]+ ! Cannot find saved game ~:create_storage_element:id=[25779],sid=[nil]:cnt=[2]+ ! Cannot find saved game ~:create_storage_element:id=[25780],sid=[nil]:cnt=[3]+ ! Cannot find saved game ~:create_storage_element:id=[25781],sid=[nil]:cnt=[4]+ ! Cannot find saved game ~:create_storage_element:id=[25782],sid=[nil]:cnt=[5]+ ! Cannot find saved game ~:create_storage_element:id=[25783],sid=[nil]:cnt=[6]+ ! Cannot find saved game ~:create_storage_element:id=[25784],sid=[nil]:cnt=[7]+ А тут читается только 6 таких объектов, седьмой (второй по id) пропущен. ! Cannot find saved game ~:se_custom_storage:on_register:id=[25778]:sid=[9901] ! Cannot find saved game ~:se_custom_storage:on_register:id=[25780]:sid=[4294967296] ! Cannot find saved game ~:se_custom_storage:on_register:id=[25781]:sid=[4294967296] ! Cannot find saved game ~:se_custom_storage:on_register:id=[25782]:sid=[4294967296] ! Cannot find saved game ~:se_custom_storage:on_register:id=[25783]:sid=[4294967296] ! Cannot find saved game ~:se_custom_storage:on_register:id=[25784]:sid=[4294967296] В чём может быть причина? Очень надеюсь, что кто-нибудь, кто "в теме", сможет мне помочь. К сожалению, автор используемого мной универсального хранилища, Artos, уже 2 недели не появляется на форуме. Изменено 29 Июня 2012 пользователем Kirgudu Инструмент Ссылка на комментарий
AndreySol 215 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 (изменено) ColR_iT function spawn_npc() local npc = alife():create("npc", vector():set(мои_координаты), левел_вертекс_айди, гейм_вертекс_айди) local tbl = amk.read_stalker_params(npc) if npc then tbl.sid = 8000 amk.write_stalker_params(tbl, obj) end end Чтобы story_id читался, нужно перевести НПС оффлайн и обратно, либо сейв-лоад У меня такой вопрос по этой теме - после вызова create у нас создается сразу-же серверая часть объекта. Создается она сразу, потому как проверка "if npc then" возвращает истину. Или нет ? И здесь же, мы присваиваем нужный story_id используя нет-пакет. Далее, по выходу из ф-ции "spawn_npc", движек (будем рассматривать случай немедленного выхода НПС в он-лайн) создает клиентскую часть объекта. И клиентская часть не будет иметь нужный story_id. Теперь собственно вопрос - получается движек при создании клиентской части объекта не использует данные из серверной части ? Или использует, но не все ? Я думал, что серверная часть в момент спауна объекта, является "ведущей", т.е. создание клиентской части есть процесс копирования в нее параметров серверной. А уже затем клиентская часть, в процессе он-лайн жизни и в зависимости от получаемых извне изменений своих параметров, синхронизирует их на серверную строну ? Изменено 29 Июня 2012 пользователем AndreySol Ссылка на комментарий
panzyuza 41 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 kratos888, story_id сработает только в момент net_spawn(). Что мешает поставить метку теми жи функциями из АМК? function add_spot_on_map(obj_id,type,text) --возможные типы type смотри в ui\map_spots.xml if obj_id then if text==nil then text=" " end -- Ставим метку на серверный объект чтобы её не пришлось обновлять level.map_add_object_spot_ser(obj_id, type, text) end end В данном случае используем ид обьекта. И после диалога, к примеру, так же удаляем метку с него function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type)~= 0 then level.map_remove_object_spot(obj_id, type) end end AVS_LOCATION_MOD Ссылка на комментарий
abramcumner 1 145 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 AndreySol, Потому что проблема с сидом совершенно в другом: сид не находится в реестре сидов. А не находится, потому что задаешь его после регистрации Перехвати событие on_before_register и установи сид там. Если используешь последние наработки с событиями, то сделать это просто. Ну или переключить онлайн/оффлайн. Ссылка на комментарий
AndreySol 215 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 Потому что проблема с сидом совершенно в другом: сид не находится в реестре сидов. А не находится, потому что задаешь его после регистрации. Перехвати событие on_before_register и установи сид там. Что есть "реестре сидов" ? Имеется в виду game_story_ids.ltx ? Ссылка на комментарий
Malandrinus 615 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 (изменено) abramcumner, Потому что проблема с сидом совершенно в другом: сид не находится в реестре сидов. А не находится, потому что задаешь его после регистрации Перехвати событие on_before_register и установи сид там. Если используешь последние наработки с событиями, то сделать это просто. Ну или переключить онлайн/оффлайн. К сожалению, ничего из указанного не поможет. SID не пропишется в глобальный список до следующей загрузки игры или перехода на другой уровень. Эту проблему можно решить только правками движка. Функцию для ТЧ, которая прописывает объекту SID с регистрацией, я уже сделал, при ближайшем апдейте она будет доступна. Изменено 29 Июня 2012 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
abramcumner 1 145 Опубликовано 29 Июня 2012 Поделиться Опубликовано 29 Июня 2012 К сожалению, ничего из указанного не поможет. SID не пропишется в глобальный список до следующей загрузки игры или перехода на другой уровень. Вообще-то способ с прописыванием сида в on_before_register давно и успешно у меня работает. Попробуй на досуге. Собственно on_before_register не зря так назван. Метод вызывается, как раз до прописывания в глобальный список Добавлено через 3 мин.: Что есть "реестре сидов" ? Имеется в виду game_story_ids.ltx ? Реестр сидов (malandrinus его назвал глобальный список) - список всех зарегистрированых сидов в игре. Хранится в движке. Если в понятиях луа, то таблица, ключ которой сид, значение серверный объект. Ссылка на комментарий
7.9 174 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 Табличка СИД-ов однозначно нужна, но существующая табличка сид-ов... - неформат. Почему? Одна сторилайн... Формат минимум: не одна сторилайн и (соответственно) не один СИД на объект... А может я существующую систему сид-ов не допонял... тогда она, конечно, формат всё легко Ссылка на комментарий
Malandrinus 615 Опубликовано 30 Июня 2012 Поделиться Опубликовано 30 Июня 2012 abramcumner, Попробуй на досуге. Зачем, я тебе верю. Я в своё время искал событие, предшествующее регистрации в реестре сидов, но выходит недостаточно внимательно. Впрочем, использовать функцию думается всё равно удобнее. Собственно on_before_register не зря так назван. Если поглядеть это место в коде, то там много чего регистрируется, не только sid-ы. Смарты регистрируются, родительские объекты, присоединёные инвентарные, объект прописывается на апдейты и в алайфе и ещё что-то непонятное. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти