Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Artos 99 Опубликовано 8 Октября 2013 Поделиться Опубликовано 8 Октября 2013 (изменено) @proper70, чудной ты, право... (для чистого ТЧ с добавками по выводу в лог) 1. Берем обрез и подходим к новичку сидящему у костра в деревеньке на Кордоне. 2. Стреляем ему в голову. Имеем в логе: * DBG: _my:OnHit_NPC:=[esc_lager2],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager3],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_wolf],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager7],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager5],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager4],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager6],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager1],who=[single_player],amount=[0.000]=>hp=[1.000]:bone=[0] * DBG: _my:OnHit_NPC:=[esc_lager5],who=[single_player],amount=[0.620]=>hp=[0.380]:bone=[13] sv destroy object [138][device_pda:device_pda0138] [41885] sv reject. id_parent [137][stalker:esc_lager5] id_entity [138][device_pda:device_pda0138] [41885] sv destroy object [139][ammo_12x70_buck:ammo_12x70_buck0139] [41885] sv reject. id_parent [137][stalker:esc_lager5] id_entity [139][ammo_12x70_buck:ammo_12x70_buck0139] [41885] sv destroy object [140][device_torch:device_torch0140] [41885] sv reject. id_parent [137][stalker:esc_lager5] id_entity [140][device_torch:device_torch0140] [41885] sv destroy object [141][energy_drink:energy_drink0141] [41885] sv reject. id_parent [137][stalker:esc_lager5] id_entity [141][energy_drink:energy_drink0141] [41885] sv destroy object [142][harmonica_a:harmonica_a0142] [41885] sv reject. id_parent [137][stalker:esc_lager5] id_entity [142][harmonica_a:harmonica_a0142] [41885] sv destroy object [144][kolbasa:kolbasa0144] [41885] sv reject. id_parent [137][stalker:esc_lager5] id_entity [144][kolbasa:kolbasa0144] [41885] * DBG: _my:OnDeath_NPC:=[esc_lager5],who=[single_player] sv destroy object [139][NOTFOUND] [41885] Что тебе еще нужно?! Новичок получил заряд дроби в голову (bone=[13] и умер. То, что в логе отображается amount=[0.620]=>hp=[0.380] - говорит о том, что полученное значение повреждения вроде как менее имеющегося у непися здоровья и вроде как остаток жизни (hp) должен остаться, но тут нужно учитывать табличку повреждений по костям, где для головы коэффициент (hit_scale) более 1. [stalker_damage] bip01_head = 2.0, 0, 1.0, 5.0 т.е. в данном случае величина полученного повреждения = 0.620х2.0 > 1.0 => Death Ну а то, что в логе куча "пустых" хитов по всем неписям - ну так и не обращай на это внимание, считай чтобы неписи не дремали под логикой - их постоянно "встряхивает" движок иль схемы логики... Если у тебя не отображаются смертельные хиты, когда кость не нулевая, ну так и разбирайся с этим у себя в кодах... Примечание: Попадание "в голову" может затрагивать не только bip01_head, а и eyelid_1, eye_left, eye_right (глаза), jaw_1 (подбородок). (отступление) вопрос: как может быть хит "пустой" (amount=0), если непись погиб от одного-единственного выстрела в голову? О том, что не может погибнуть от пустого хита - вроде как очевидно, хотя... ... не сложно перехватить хит (иль без него) и убавить неписю здоровья, чтобы аля "погиб"... или наоборот добавить. Изменено 8 Октября 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-798805
Viнt@rь 50 Опубликовано 8 Октября 2013 Поделиться Опубликовано 8 Октября 2013 (изменено) proper70, я дал тебе наводку где искать и пример функции, которая правильно определяет куда попали по нпс, тебе сложно амк 2.0 глянуть, как у них(у рефреша) там все это сделано? Ты же пошел по пути изобретения велосипеда... У амк скрипты xr_motivator amkII_dynnews amkII... Изменено 8 Октября 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-798840
*Shoker* 322 Опубликовано 11 Октября 2013 Поделиться Опубликовано 11 Октября 2013 Например некоторые (в том числе и я) сталкивались с таким странным вылетом, когда в биндере объекта (чаще всего motivator_binder - биндер сталкеров в xr_motivator.script), который должен работать только когда существует объект, к которому биндер присвоен, вдруг возвращает внутри одного из своих методов что этот самый object вдруг не существует. Вообщем если вдруг кому интересно, то конкретно в моём случае проблема была в том, что в апдейте НПС я не сделал проверку на то, что он живой\мёртвый, и поэтому когда для мёртвого НПС вызывал его движковый метод: if best_enemy ~= nil then npc:enable_memory_object(best_enemy, false) end Биндер объекта на этом месте ломался, и следовательно при срабатывании какого нибудь колбека на этом НПС (например колбек на осмотр трупа) игра вылетала с руганью что self.object = nil. Как вариант, отловить "зависшего" НПС можно тем, что у него в биндере перестаёт вызываться метод :update() соответственно если НПС долго не обновлялся, можно считать что он скорее всего завис, а это может привести как к простому сбою при обыске, так и к порче сохранений, если очень повезёт. 1 1 Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-799323
sapsan 337 Опубликовано 14 Октября 2013 Поделиться Опубликовано 14 Октября 2013 По хит_калбеку - что на Солянке, что на чистой (4, 6 патчи) - результат как у @proper70. Тоесть при смерти от единичного выстрела в голову - информации нет, при стрельбе в тело без моментальной смерти - есть. @Artos, возможно, что твои чудо-добавки делают игру корректнее ? 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-799748
Карлан 1 050 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) Есть таблица вида: local t = {{key = value}} --/ где value - boolean Далее идет формирование строки if t[i].key then string = "1" --/ true else string = "2" --/ false end Так вот, при загрузке игры у меня происходит сброс этих value, и у меня все строки становятся равными "2". Вопрос: как правильно сохранить/прочесть мое значение и подставить загруженное значение в мое условие при загрузке игры? Разумеется всячески мусолил w_bool/r_bool, но за неимением навыков у меня что-то не получилось подставить значения в условия(но они сохранялись/загружались). Изменено 18 Октября 2013 пользователем Карлан Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800108
sapsan 337 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @Карлан, сначала сохраняй размер таблицы, а уже потом - значения. Так же и читай - сначала читай сохраненный размер, а потом уже нужное количество раз читай значения. И тебе действительно нужна таблица с подтаблицами, а не просто таблица с парами ключ-значение ?Лучше опиши задачу вообще, а потом уже твои способы решения. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800121
Карлан 1 050 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) @sapsan, у меня таблица с подтаблицами, вроде: local t = { {key1=string, key2=number, key3=boolean, key4=boolean}, {key1=string, key2=number, key3=boolean, key4=boolean} ... } И вот из этой таблицы мне и надо сохранить ключи с булевыми значениями. Простая, как видишь, не подойдет. Что-то не понял я твоего объяснения, можешь наглядно? Допустим функции сохранения/загрузки таблицы возьмем готовые из амк. (load_table/save_table)(только они вложенные массивы вроде не сохраняют, так что я совсем в ступоре ). Мне бы только примерный алгоритм дальше сам допилю, я не понял по какому принципу должно идти сохранение. Как вариант в цикле брать ключи string и number каждой строки, в зависимости от этого формировать новый одномерный(!) массив из булевых значений, и с ним уже делать вышеописанные операции. Хреновый ход, может что попроще кто предложит. Изменено 18 Октября 2013 пользователем Карлан Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800124
sapsan 337 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @Карлан, если функции вида function load_table(name) local var = load_variable(name) if var then return unpack_array_from_string(var) end return {} end function save_table(name,tbl) save_variable(name, pack_array_to_string(tbl)) end тогда они обработают хоть всю твою таблицу любой вложенности. Разве что в Солянке они сейчас не такие, как были в чистом АМК. Ну и до Солянки они некорректно работали с булевыми значениями. Если таблица не большая, тогда можешь взять эти функции и вызываемые ими "подфункции" из последней Солянки и паковать хоть всю таблицу разом. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800130
Карлан 1 050 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @sapsan, извиняй, тупанул я, я же на модулях от Artos'а сижу. Если их видел, то вот мои функции: function load_table(name) local var = GetVar(name) return table.decompress(var) end function save_table(name, tbl) SetVar(name, table.compress(tbl)) end Я только смысла в таком сохранении не вижу, у меня строка строится динамически, а таблица у меня - константа, поэтому оперировать тут с таблицой глупо и бессмысленно. Значения видно сбрасываются при загрузке строки. Что-то я сам запутался. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800134
sapsan 337 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @Карлан, ну тогда формируй таблицу только с теми значениями, которые должны сохраниться, и сохраняй посредством save_table, а после чтения в обратном порядке вноси в основную таблицу. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800138
*Shoker* 322 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) @Карлан, в функции save() получай размер всей твоей таблицы (либо table.size\table.count (забыл что именно) - это если на модулях Artos-а сидишь, либо вручную считай его через перебор всех элементов - pairs(). Сохраняй этот размер в пакет. Дальше через тот же pairs() перебирай всю твою таблицу и сохраняй каждый из её четырёх элементов. Примерно будет так: local t = { {key1=string, key2=number, key3=boolean, key4=boolean}, {key1=string, key2=number, key3=boolean, key4=boolean} ... } save() local size = table.size(t) packet:w_u16(size) for _,v in pairs(t) do packet:w_stringZ(v.key1) packet:w_s32(v.key2) packet:w_bool(v.key3) packet:w_bool(v.key4) end Соответственно в: load() local size = packet:r_u16() for i=1, size do local temp_tbl = {} temp_tbl.key1 = packet:r_stringZ() temp_tbl.key2 = packet:r_s32() temp_tbl.key3 = packet:r_bool() temp_tbl.key4 = packet:r_bool() table.insert(t, temp_tbl) end Где t это твоя таблица, которую тебе нужно было сохранить.Вариант для гурманов - запаковать всю таблицу в одну огромную строку (в тех скриптах от Artos-а кажется table.compres) и попытаться впихнуть её в stringZ, но скорее всего игра подавится при большой таблице. Изменено 18 Октября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800142
Карлан 1 050 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @*Shoker*, так я делал еще часа три назад, и результата нужного мне это не принесло К слову, это первое, что я пытался сделать. stringZ все хавал, сохранял и загружал. Пробовал сохранять и распарсенную таблицу, и ключи таблицы в цикле(как у тебя) и свою готовую строку...все эти потуги мне результата никакого не принесли. Короче я сейчас понял, что я ничего не понял Я не понимаю как формируется моя строка при загрузке, не получается отловить это, видать умений у меня мало, и из этого, как следствие, не те методы применяю к перезаписи, то ли не так перезаписываю, то ли не то перезаписываю... сложно как-то все, придется немного ампутировать свой код, иного варианта пока не вижу. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800145
*Shoker* 322 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) Понаставь в свой код вывод в лог\консоль через printf (или что там у тебя выводило в лог)И посмотри, тут два варианта как мне кажется:1) Либо функция сохранения\записи не работает так как ты от неё ожидаешь. 2) Либо она работает, но значения потом перезаписываются в связи с неправильной работой скрипта.Например после load() ты загрузил из сейва сохранённые значения, а потом прочёл их из конфига и перезатёр. По крайнем мере как и сохранение ключей так и сохранение строк должно работать правильно.Поставь дополнительные printf-ы в разных местах кода и проследи в правильном ли порядке они срабатывают. Ну или на худой конец выложи текущий вариант trade_manager в личку или лучше сюда, тогда мож увидим где косяк. Изменено 18 Октября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800147
Viнt@rь 50 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) @Карлан, было бы не плохо с твоей стороны показать "живой" пример таблицы и где происходят с ней все операции, пока могу предложить свои алгоритмы для сохранения любых переменных/таблиц/значений с под таблицами и без них --[[--------------------------------------------------------------- --// Функции обработки перменных --]]--------------------------------------------------------------- --[[ -- Сохраняем переменную -- @param string sVarName имя переменной -- @param all types Value значение переменной --]] function WriteVariable(sVarName, Value) if Value ~= nil then storage[sVarName] = Value end end --[[ -- Загружаем переменную -- @param string sVarName имя переменной -- @param all types DefVal дефолтовое значение -- @return --]] function ReadVariable(sVarName, DefVal) if storage[sVarName] ~= nil then return storage[sVarName] end return DefVal end --[[ -- Удаляем переменную -- @param string sVarName имя переменной --]] function DeleteVariable(sVarName) if storage[sVarName] ~= nil then storage[sVarName] = nil end end storage = {} local type2marker = { ['boolean'] = 1, ['number'] = 2, ['string'] = 3, ['table'] = 4 } local marker2type = { [1] = 'boolean', [2] = 'number', [3] = 'string', [4] = 'table' } function Load(packet) while not packet:r_eof() do local k = packet:r_stringZ() --_log_db("Key:[%s]",tostring(k)) LoadValue = function() local value local tv = marker2type[packet:r_u8()] if tv == 'string' then value = packet:r_stringZ() elseif tv == 'boolean' then value = packet:r_bool() elseif tv == 'number' then value = packet:r_float() elseif tv == 'table' then local v = {} local n = packet:r_u8() if n > 0 then local b = packet:r_bool() if b then for i = 1, n do v[i] = LoadValue() end else for i = 1, n do local kk = packet:r_stringZ() --_log_db("Key:[%s]",kk) v[kk] = LoadValue() end end end value = v end --_log_db("Value:[%s]", tostring(value)) return value end storage[k] = LoadValue() end end function Save(packet) if next(storage) then for k, v in pairs(storage) do if v ~= nil then packet:w_stringZ(k) --_log_db("Key:[%s]",tostring(k)) SaveValue = function(Value) --_log_db("Value:[%s]",tostring(Value)) local tv = type(Value) if type2marker[tv] then packet:w_u8(type2marker[tv]) if tv == 'string' then packet:w_stringZ(Value) elseif tv == 'boolean' then packet:w_bool(Value) elseif tv == 'number' then packet:w_float(Value) elseif tv == 'table' then local iTblSize = GetTblSize(Value) --_log_db("size = [%s]",iTblSize) packet:w_u8(iTblSize) if iTblSize > 0 then packet:w_bool(IsTblList(Value)) if IsTblList(Value) then for i = 1, iTblSize do SaveValue(Value[i]) end else for kk, vv in pairs(Value) do --_log_db("Key:[%s]",kk) packet:w_stringZ(kk) SaveValue(vv) end end end end else --_log_db("~Not savable type:=[%s]",tv) end end SaveValue(v) end end end end --[[ -- Получает реальный размер таблицы -- @param table tTbl таблица -- @return integer --]] function GetTblSize(tTbl) if IsTblList(tTbl) then return #tTbl end local iSize = 0 for k, v in pairs(tTbl) do iSize = iSize + 1 end return iSize end --[[ -- Проверка типа таблицы:'список' или нет? -- @param table tTbl таблица -- @return boolean --]] function IsTblList(tTbl) local bList = false local iCntIdx = #tTbl if iCntIdx > 0 then if next(tTbl) == 1 and not next(tTbl,iCntIdx) then for i=2,iCntIdx-1 do if tTbl[i] == nil then return false end end bList = true end end return bList end ЗЫ надеюсь объяснять откуда вызывать функции Save и Load, и что в них передавать - не надо... ЗЫЫ функции написаны для кастомного хранилища и под ЗП, так что, если где-то в их коде будет вылет, отпиши, поправим. Совет по таблицам, если key1=string статичен, тогда лучше немного по другому описывать табличку local tbl = { [key1] = {key2=number, key3=boolean, key4=boolean}, ... }где key1 - это строка, которая присваивалась ему ранее(в смысле key2=string)еще интересно бы узнать о key2=number, по порядку ли идут присвоенные ему значения в под таблицах(в смысле 1,2,3,...,100) и зачем он вообще? нужен? ЗЫЫЫ можно написать кастомный сейвер/лоадер значений, под более конкретные нужды/задачи, при этом, обычно, можно сэкономить немного, не мало, байт в сохраняемом пакете, но, ИМХО, в данном случае, это не нужно, так как у тебя сохраняются булева значения, а это 1 байт, ну и может быть надо сохранять key2, а это float - 4 байта...(кастомный сэкономил бы почему, потому что ты знаешь структуру таблицы, и не надо сохранять ключи в ней, а только их значения, как видно по алгоритму, ключи сохраняются в виде строки, а занимаемый ею размер - длина строки + 1) Изменено 18 Октября 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800154
Artos 99 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) Вопрос: как правильно сохранить/прочесть мое значение и подставить загруженное значение в мое условие при загрузке игры? К сожалению, автор вопроса задал шараду без необходимых пояснений/данных... Предполагаю, что все это относится к менеджеру торговли и автор вопроса задался целью сохранять в сэйвы и считывать из них свои параметры. Однако, позабыл (или не знает), что скрипт, отвечающий за это (trade_manager.script) и алгоритм работы с ним подразумевает периодическое(!) обновление при каждой(!) смене секции логики. Штатные параметры этого модуля запоминаются движком и меняются по заложенному алгоритму. А вот "пользовательские" данные, даже будучи запомненными и восстановленными, при первой же смене/переинициализации логики непися будут заменены на дефолтные (см. вызов: trade_manager.trade_init(npc, trade_ini) из xr_logic.configure_schemes). Т.о., в первую очередь нужно менять алгоритм самого менеджера, а уж как и где хранить/восстанавливать доп.данные - дело вторичное и имеет немало готовых вариантов. @Viнt@rь, если мое предположение о менеджере торговли верно, то нет особого смысла в кастомном хранилище и в экономиях байтов... У неписей почти ничего не запоминается в pstor и его (не менее 7-ми кило) вполне достаточно даже для очень богатого и разветвленного ассортимента. ;-) P.S. я же на модулях от Artos'а сижу. И модулях Artos'а (конкретно в lua_helper.script) имеются функции работы с pstor'ом объектов/неписей (SetVarObj/GetVarObj_Table/...), аналогичные всем что тут упоминались...(+ с компрессией) и хранить/считывать таблицы совсем не сложно и нет смысла ломать голову над ними, если данные в таблицах строки/числа/булевы... Тебе нужно над другим поломать голову ;-) Изменено 18 Октября 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800156
AndreySol 215 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 Подскажите, как можно сделать многострочный текст с прокруткой ? 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800246
*Shoker* 322 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 (изменено) Давно с UI не работал, но если нет нормального способа через какой нибудь статик, то например в ОГСМе это делали через ListBox, то-есть просто разбивали текст на строки и построчно добавляли их в "список". Можешь глянуть в ОГСМ ЧН энциклопедию. Тока на ЗП код нужно будет переделывать. Изменено 19 Октября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800291
Карлан 1 050 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 @*Shoker*, вопрос задан некорректно и совершенно не ясно что нужно автору вопроса. То-ли он не управится с аргументом complex_mode, то-ли ему надо составить листинг/текст скриптом со скроллом, лично я вопроса не понял. Приведу свой пример для листинга составляемого скриптом(здесь у меня именно список, а не абзационный текст): --/ расположение листинга local list_wnd = CUIListWnd() list_wnd:SetAutoDelete(true) list_wnd:SetWindowName("list_window") list_wnd:SetItemHeight(20) list_wnd:Init(130, 230, 430, 400) list_wnd:EnableScrollBar(true) --// показывать скролл-бар или нет list_wnd:ShowSelectedItem(true) self:Register(list_wnd) self:AttachChild(list_wnd) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800295
*Shoker* 322 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 Как по мне вопрос вполне ясный. Текст со скроллером. Режим complex_mode вроде как позволяет делать переносы строк и прочую "раскраску" но прокрутку не добавляет, хотя могу ошибаться. А так твой пример вполне подходящий, как раз то что нужно. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800301
Dennis_Chikin 3 665 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 [error]Description : Particle effect or group doesn't exist Вопрос: а наличие оного эффекта можно как-то проверить до вызова particles_object(), и, соответственно, повисания чего попало с такой вот ошибкой в логе ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/267/#findComment-800311
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти