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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
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)" Ссылка на комментарий
*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, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
sapsan 336 Опубликовано 14 Октября 2013 Поделиться Опубликовано 14 Октября 2013 По хит_калбеку - что на Солянке, что на чистой (4, 6 патчи) - результат как у @proper70. Тоесть при смерти от единичного выстрела в голову - информации нет, при стрельбе в тело без моментальной смерти - есть. @Artos, возможно, что твои чудо-добавки делают игру корректнее ? 2 Ссылка на комментарий
Карлан 1 049 Опубликовано 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 пользователем Карлан Ссылка на комментарий
sapsan 336 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @Карлан, сначала сохраняй размер таблицы, а уже потом - значения. Так же и читай - сначала читай сохраненный размер, а потом уже нужное количество раз читай значения. И тебе действительно нужна таблица с подтаблицами, а не просто таблица с парами ключ-значение ?Лучше опиши задачу вообще, а потом уже твои способы решения. 1 Ссылка на комментарий
Карлан 1 049 Опубликовано 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 пользователем Карлан Ссылка на комментарий
sapsan 336 Опубликовано 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 тогда они обработают хоть всю твою таблицу любой вложенности. Разве что в Солянке они сейчас не такие, как были в чистом АМК. Ну и до Солянки они некорректно работали с булевыми значениями. Если таблица не большая, тогда можешь взять эти функции и вызываемые ими "подфункции" из последней Солянки и паковать хоть всю таблицу разом. Ссылка на комментарий
Карлан 1 049 Опубликовано 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 Я только смысла в таком сохранении не вижу, у меня строка строится динамически, а таблица у меня - константа, поэтому оперировать тут с таблицой глупо и бессмысленно. Значения видно сбрасываются при загрузке строки. Что-то я сам запутался. Ссылка на комментарий
sapsan 336 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @Карлан, ну тогда формируй таблицу только с теми значениями, которые должны сохраниться, и сохраняй посредством save_table, а после чтения в обратном порядке вноси в основную таблицу. Ссылка на комментарий
*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, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Карлан 1 049 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 @*Shoker*, так я делал еще часа три назад, и результата нужного мне это не принесло К слову, это первое, что я пытался сделать. stringZ все хавал, сохранял и загружал. Пробовал сохранять и распарсенную таблицу, и ключи таблицы в цикле(как у тебя) и свою готовую строку...все эти потуги мне результата никакого не принесли. Короче я сейчас понял, что я ничего не понял Я не понимаю как формируется моя строка при загрузке, не получается отловить это, видать умений у меня мало, и из этого, как следствие, не те методы применяю к перезаписи, то ли не так перезаписываю, то ли не то перезаписываю... сложно как-то все, придется немного ампутировать свой код, иного варианта пока не вижу. 1 Ссылка на комментарий
*Shoker* 322 Опубликовано 18 Октября 2013 Поделиться Опубликовано 18 Октября 2013 (изменено) Понаставь в свой код вывод в лог\консоль через printf (или что там у тебя выводило в лог)И посмотри, тут два варианта как мне кажется:1) Либо функция сохранения\записи не работает так как ты от неё ожидаешь. 2) Либо она работает, но значения потом перезаписываются в связи с неправильной работой скрипта.Например после load() ты загрузил из сейва сохранённые значения, а потом прочёл их из конфига и перезатёр. По крайнем мере как и сохранение ключей так и сохранение строк должно работать правильно.Поставь дополнительные printf-ы в разных местах кода и проследи в правильном ли порядке они срабатывают. Ну или на худой конец выложи текущий вариант trade_manager в личку или лучше сюда, тогда мож увидим где косяк. Изменено 18 Октября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
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)" Ссылка на комментарий
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AndreySol 215 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 Подскажите, как можно сделать многострочный текст с прокруткой ? 1 Ссылка на комментарий
*Shoker* 322 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 (изменено) Давно с UI не работал, но если нет нормального способа через какой нибудь статик, то например в ОГСМе это делали через ListBox, то-есть просто разбивали текст на строки и построчно добавляли их в "список". Можешь глянуть в ОГСМ ЧН энциклопедию. Тока на ЗП код нужно будет переделывать. Изменено 19 Октября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Карлан 1 049 Опубликовано 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 Ссылка на комментарий
*Shoker* 322 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 Как по мне вопрос вполне ясный. Текст со скроллером. Режим complex_mode вроде как позволяет делать переносы строк и прочую "раскраску" но прокрутку не добавляет, хотя могу ошибаться. А так твой пример вполне подходящий, как раз то что нужно. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 19 Октября 2013 Поделиться Опубликовано 19 Октября 2013 [error]Description : Particle effect or group doesn't exist Вопрос: а наличие оного эффекта можно как-то проверить до вызова particles_object(), и, соответственно, повисания чего попало с такой вот ошибкой в логе ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти