Artos 99 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) *Shoker* Встроенная 'logf', как и аналогичные log1 (из x-Ray Extensions) и log123, которые также скриптом (lua_fix) могут быть задействованы, - чисто трансляторы полученной строки в штатный лог-файл и никак не расцвечивают строки. Цвет текста в консоли целиком зависит от первых символов самой строки (префикса), а движек по этому символу уже расцвечивает ее. Т.о. учитывая, что при использовании безконсольного вывода в лог (т.е. не консольными командами), можно вместо префикса 'load ~:'|'* Info' и т.п. формировать строки по своей потребности и начальными символами (*.!.~ ...) расцвечивать. Однако данная версия все же подразумевает и отсутвие расширяющих dll-ек и тогда без "безопасного" префикса ('load ~:') коды вывода в лог станут фатальными ... (в ЧН/ЗП). ИМХО, рюшечки все же менее важны, чем надежность и информативность. Под трассировкой подразумевается то, что выдает debug.traceback, т.е. именно трассировку вызовов той функции, которая вызвала функцию abort и можно не только прочесть про ошибку, но и узнать откуда "ноги растут". Вообще хотел добавить и вот это: --/ выводит в лог стэк вызова функций (если доступен debug). _G.callstack = function(fmt,is_abort) if is_abort == true then if type(error_log) == 'function' then --/ for CS|CoP log = error_log fmt = tostring(fmt) else fmt = "! [LUA][ERROR] "..tostring(fmt) end else fmt = "* DBG:"..tostring(fmt) end if debug then log(debug.traceback(fmt,2)) else log(fmt) end end - но ... передумал. В ЗП это есть и c включенным дебагом можно не только при abort'ах просматривать стеки вызовов, но ... бездумное злоупотребление по неопытности может принести больше вреда. Если тебе потребно - просто добавь 'это' или посмотри как в ЗП. Добавлено через 5 мин.: RvP, просто в доступе модмейкерам скомпилированной dll-ки для ЧН/ЗП не было. Так же, пока нет версий для ЧН/ЗП с дублированным выводом во второй (дебаг) лог-файл. Хотя в данной версии вывод в доп.лог не полный (вместо SetLogCB использован то же Log), но и это уже подспорье при "безлоговых" вылетах. Изменено 1 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
RvP 1 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) Artos, RvP, просто в доступе модмейкерам скомпилированной dll-ки для ЧН/ЗП не было. да ладно Изменено 11 Марта 2012 пользователем ColR_iT Vita sine libertate, nihil Vita sine litteris - mors est Ссылка на комментарий
Artos 99 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) RvP, предлагаю не пустословить, тем более собственно и ни о чем. Если кроме " Да ладно", смайликов и упоминаний о некоей мифической "универсальной/совместимой" DLL-ке для всех игр (ТЧ/ЧН/ЗП или хотя бы для последних) у тебя есть чем поделиться с комьюнити - что мешало или мешает это сделать? И давай не будем эту тему продолжать, т.к. тебе прекрасно известно, что ни до, ни сейчас ни в ближайшее время такой DLL-ки нет и не будет, т.к. как минимум функции вывода в лог (Log и SetLogCB) находятся в xrCore.dll, которая у каждой игры своя ... Т.о. требуется и корректно определять версию игры (или xrCore) на старте и портировать все три библиотеки, да еще и преодолеть различную подгрузку "универсальной" библиотеки для xrLua в ТЧ и lua.JIT.1.1.4 в ЧН/ЗП. Изменено 11 Марта 2012 пользователем ColR_iT "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Unnamed Black Wolf 4 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) Artos, Она не универсальна.. Просто, существуют версии для ЧН/ЗП, длл которые имеют log1, и не только. В действительности она не выкладывалась на публику и только... Хотя, вроде все-таки где-то проскальзывала, или упоминалась.... на счет цветов.. ## (две решётки) непонятно-синеватый (цвет здесь показан точный #0E8C82) ~~ (две тильды) чисто жёлтый (#FFFF00) ** (два умножения) серый (#808080) !! (два восклицательных знака) красный (#FF0000) -- (два минуса) зелёный (#00FF00) Изменено 1 Марта 2012 пользователем Unnamed Black Wolf Ссылка на комментарий
Artos 99 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) Unnamed Black Wolf Ну зачем оспаривать или подтверждать то, что и так почти всем известно(?) и адресовать пост мне, кто и говорит что НЕТ универсальной/совместимой/... Изначально разговор идет о расширителе Lua на базе проекта "xrLuaFix" (by RvP) - о чем читаем в кратком описании выложенного набора: #3936 При чем тут "она не универсальна" и начинать разговор о совершенно ином? Многим из нас известно о существовании параллельного проекта x-Ray Extensions (by Malandrinus), но это тем более совершенно иная тема. Существующие варианты для ЧН/ЗП сильно устарели. Для ЧН (что требуется тому же (*Shoker*'у) вообще мало что сделано. Пространства 'debag' также нет. И правится соверженно иная DLL-ка (xrGame.dll), которая довольно критична для разных модов (т.к. в модах вносятся локальные правки) и также в свободном для каждого моддмейкера (в том числе и новичкам) скомпиллированной DLL нет (требуются познания, навыки и инструменты для компиляции). Данный вариант комплекта дает практически каждому модмейкеру для любого мода готовый набор (DLL+script) чтобы получить и информативный лог, в том числе из любого разумного набора аргументов для строки лога и дебаговый лог-файл (что важно при "безлоговых" ошибках), и инструметарий 'debug'-пространства, что также для любого модмейкера большое подспорье. И все это достаточно компактно и бесконфликтно как с кодами игры, так и с публичным применением/распространением подобной правки/добавки. Цель комплекта в данном случае: дать любому модмейкеру для любой версии игры готовый к применению инструмент с минимальным необходимым для моддинга набором работы со скриптами/кодами, а не супернавороченый многофункциональный, но узко-заточенный, комбайн. Мы все же в "Школе", а не в "мастерских" ;-) А по цветам: движек имеет немало иных комбинаций для раскраски строк в консоле, поэтому не только перечисленные штатные комбинации могут встречаться. Изменено 1 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) Всё же "инструмент" стоит добавить хотя бы в шапку этой темы, иначе он точно потеряется здесь, т.к тема довольно активная. Создать раздел вроде "Полезные скрипты\расширения" с прямыми ссылками на посты. Unnamed Black Wolf Вот оно как... а казалось всё узнал. Пойду сделаю свою жизнь ярче Спс. за цитату. Они ведь могут в комбинации встречаться? Изменено 1 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 *Shoker*, это пока первая версия, можно считать 'beta'. Есть моменты которые еще нужно бы доработать (хотя бы по дублирующему выводу в лог для ЧН/ЗП). Вот тогда или в шапку или в тему инструментария ее можно будет положить (если будет востребована). О разделе по "полезным скриптам" - в процессе подготовки и обмозговывания :-). Вероятно (если движек форума позволит) второй в теме пост будет под эти цели. И совет, если решил расцвечивать: Учитывая, что делаешь мод на ЧН, которая (версия) критична к консольным командам, в функции _G.printf, которая в lua_fix.script, замени префиксы "* Info" и "* DBG" на пустышки (иль сотри их) и тогда в каждой строке, которую отправляешь в лог сможешь задавать префиксом расцветки. И ... к сожалению запамятовал, но в каком-то моде был сделан набор функций-заготовок для вывода в лог разными цветами, типа: log_warning, log_fail, log_info, ... "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) Вероятно (если движек форума позволит) второй в теме пост будет под эти цели. Насколько я знаю, тут ограничение на размер сообщения. Если там будет слишком много кода\описания, то придётся ещё один пост забирать. Гораздо компактнее давать ссылки на посты. Можно и скрипт скачать и его обсуждение глянуть. По поводу ЧН - всё вывожу через error_log(), тоесть без консоли. Пока не сбоило, а вот когда иногда вывожу через get_console() бывает виснет, особенно при частых вызовах. Кстати... а в error_log() та будет расцветка работать? Надо проверить... _____________________ Насчёт alife():remove_in_restriction(soNPC, idRestr) Вообщем похоже она вроде как и удаляет "ограничение" у НПС, но вылет по прежнему оставался. Удалил через нет-пакет и всё заработало пучком. Но всё же интересно почему удаление через alife() так работает странно. Изменено 1 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 1 Марта 2012 Поделиться Опубликовано 1 Марта 2012 (изменено) *Shoker*, с error_log() расцвечивать не получится, т.к. эта функция пристыковывает свой префикс в начало строки ( ! [LUA][ERROR] ) ... Да и небезопасно, привыкнешь ... а в ЗП подобный вывод в "лог" сродни abort'у. ;-) get_console() - с безопасным префиксом в ЧН/ЗП достаточно безопасны и давненько не встречался с их виною в провоцировании ошибок, но конечно же нагрузка на диск при каждом таком вызове немалая и если у тебя там "кучка" сэйвов, а среди них бывают и битые(!) ... Ну а по по рестрикторам: когда достсточно набьешь шишек - бум разговаривать на одном языке - "битых, но наученных практикой". ;-) Тем более пока не ясно, поменял ты алгоритм иль нет, т.е. чистишь "до" или "после". (но это мы опять за старое ...) Изменено 1 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 2 Марта 2012 Поделиться Опубликовано 2 Марта 2012 (изменено) Тем более пока не ясно, поменял ты алгоритм иль нет, т.е. чистишь "до" или "после" Чистка идёт одновременно с удалением. Тоесть для удаления у меня идёт перебор всех объектов в игре (не экономно конечно, но юзаю старый сторонний алгоритм и как то привык к нему, тока вчера заметил что лучше бы удалять по таблице) и во время этого перебора если найдена аномалия - она удаляется, если нпс = у него чистится "ограничение", тоесть у меня и так и так получается... _______ А вот заметил сообщения вида: ! cannot remove restriction with id 21963 to the entity with id 22264, because there is no space restrictor with the specified id Но при save\load вылетов нету. И "ограничения" вроде как удалены. Критично ли оставлять так как щас или может в дальнейшем аукнуться? Изменено 2 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 2 Марта 2012 Поделиться Опубликовано 2 Марта 2012 (изменено) *Shoker*, кротко можно ответить: "Не критично." Учитывая, что ты удаляешь и рестриктор и ограничения по нему для серверного объекта, то активная схема (если таковая есть) клиентского объекта вполне может успеть на своем ближайшем апдейте еще не знать, что и ограничения нет и/или рестриктор уже исчез из игры - вот и получаешь сообщение о такой коллизии. Критично это иль нет - однозначного ответа нет и не может быть, все зависит от дальнейших кодов/алгоритма и их реакции ... В оригинальных кодах вроде как не встречал коллизий по этому поводу. Примечание: Вот для того, чтобы и не гадать и не попадать в критические ситуации и использую в своих кодах (где возможно) алгоритм 'отложенного' удаления рестриктора/аномалии, т.е. вначале чистка ограничений (+ отключение аномалии), и только на следующем апдейте собственно удаление самого рестриктора. Хотя конечно же это может быть и избыточностью ... Изменено 2 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 3 Марта 2012 Поделиться Опубликовано 3 Марта 2012 (изменено) Стоит такая задача - нужно из файла (с расширением .xml) считать все. Собственно у Kirag'a был такой вариант в его парсере .xml файлов: local str = r:r_stringZ() if r:r_tell() > size then str = string.sub(str,1,size) end Все логично, но если файл упакован в архив, то я получаю вылет без лога, т.к. в архивах у файлов нет \0 символа, обозначающего конец файла. Тогда я попытался сделать так: local str = "" for i=1,size do str=str..string.char(r:r_u8()) end где size - размер файла в байтах Все работает, но работает невероятно медленно. Если раньше был небольшой лаг, то сейчас у меня игра зависает на пол минуты. Может у кого нибудь есть универсальное решение? Изменено 3 Марта 2012 пользователем _Призрак_ Freedom Ссылка на комментарий
Nazgool 250 Опубликовано 3 Марта 2012 Поделиться Опубликовано 3 Марта 2012 (изменено) _Призрак_ Подобная конкатенация в цикле - str=str..add - всегда была ужасно медленной штуковиной. Сделай через таблицу : local t = {} local char = string.char for i=1,size do t[#t+1] = char(r:r_u8()) end local str = table.concat(t) Изменено 3 Марта 2012 пользователем Gun12 Ссылка на комментарий
AndreySol 215 Опубликовано 3 Марта 2012 Поделиться Опубликовано 3 Марта 2012 (изменено) Пытаюсь сделать вывод на худ общего веса всего барахла, которое можно получить с помощью iterate_inventory. В апдейте актера вызываю ф-цию: local all_weight = 0 function show() GetInvWeight() -- здесь в переменную all_weight собираем общий вес local msg = nil local hud = get_hud() local cs = hud:GetCustomStatic("info_panel") if cs == nil then hud:AddCustomStatic("info_panel", true) cs = hud:GetCustomStatic("info_panel") end if cs ~= nil then msg = string.format("вес - %.2f кг", all_weight) cs:wnd():SetText(msg) end end эта ф-ция считает сам вес: local get_ini = system_ini() function GetInvWeight() all_weight = 0 local npc = db.actor if npc ~= nil then npc:iterate_inventory(check_all_actor_items, npc) end end function check_all_actor_items(actor, item) local add_weight = 0 local count = 0 local section = item:section() if section then if get_ini:section_exist(section) then if get_ini:line_exist(section, "inv_weight") then if get_ini:line_exist(section, "class") then local key_class = get_ini:r_string_wq(section, "class") if key_class == "AMMO" then local se_obj = alife():object(item:id()) local packet = net_packet() cse_alife_item_ammo.STATE_Write(se_obj, packet) packet:r_seek(packet:w_tell() - 2) count = packet:r_u16() -- кол-во боеприпаса в пачке -- add_weight = Get_ammo_weight(section, count) else add_weight = get_ini:r_float(section, "inv_weight") end end all_weight = all_weight + add_weight end end end end эта ф-ция считает вес реальной пачки патронов (не полной\полной) function Get_ammo_weight(section, count) local count_in_box = 0 -- кол-во патронов в полной пачке -- local box_weight = 0 -- вес полной пачки патронов -- if get_ini:section_exist(section) then if get_ini:line_exist(section, "inv_weight") then box_weight = get_ini:r_float(section, "inv_weight") end if get_ini:line_exist(section, "box_size") then count_in_box = get_ini:r_float(section, "box_size") end end if box_weight > 0 and count_in_box > 0 then return (box_weight/count_in_box)*count else return 0 end end В результате получается следующее: если закомментить участок кода, где из нет-пакета получаем кол-во патронов в пачке, то все работает, на худе выводится строка с весом, ну естественно за вычетом веса пачек с патронами. А если этот участок раскомментить - на худ ничего не выводится. При однократном вызов этого фрагмента кода все нормально, он возвращает кол-во патронов в пачке. Получается что этот фрагмент вызывает какой-то сбой именно при вызове в апдейте актера, т.е. при большой частоте вызовов. Подскажите в чем грабли ? Ну и как это можно поправить. Изменено 3 Марта 2012 пользователем AndreySol Ссылка на комментарий
Artos 99 Опубликовано 3 Марта 2012 Поделиться Опубликовано 3 Марта 2012 (изменено) AndreySol, вообще то советовать "как исправить" то, что заведомо ошибочно - неразумно. Можно долго гадать (тем более не указана версия игры), сколь часто и с каким результатом можно обращаться к нет-пакетам объекта, каждый раз вызывая локальные копии пакетов и справляется ли движек с подобным ... Но можно и просто указать на порочность данного алгоритма: 1. Ты считаешь, что обновлением ~50 раз в секунду в окне кастом-статика получаешь больше информации, чем, например, делая подобное 1 раз в секунду? 2. Ты считаешь, что те же самые секции объектов/предметов, следует перечитывать каждый раз заново из конфиг-файлов, т.к. один раз прочитанное может измениться? Попробуй переписать свои функции с учетом вышесказанного, и кешируя ту же local packet = net_packet() один раз, а не в каждом цикле апдейта да еще и для каждой пачки(!). Тогда есть смысл искать непонятки и решение для них, а не гадать над непригодным для игры кодом. :-) Не лишним, также, будет packet:w_begin(0) - т.е. установка в начало нет-пакета перед его чтением ... Изменено 3 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 3 Марта 2012 Поделиться Опубликовано 3 Марта 2012 Я уже забыл конечно (давно сталкером не занимался). Собственно - изменение в инвентаре это не дроп\тэйк? Если да, то ставить обновление на них вместо апдейта. Ссылка на комментарий
Artos 99 Опубликовано 3 Марта 2012 Поделиться Опубликовано 3 Марта 2012 (изменено) Gun12, ты прав, это более подходящий вариант для апдейта веса, но ... AndreySol не потрудился указать цели своих проверок. При (пере)проверках по дроп\тэйк останется погрешность при перезарядках/разрядках оружия, да и собственно у него не учитывается вес заряженых патронов во всем оружии ... Да и аддоны, опционально устанавливаемые на оружие - не учтены. А может это ему и не нать. ;-) Также минусом по дроп\тэйк является то, что при загрузке сэйва и/или выходе из игры происходит "лавинный" в(ы)брос предметов в/из рюкзак(а) ..., что порой приводит к нежелательным последствиям и требуется такие моменты отсекать. Изменено 3 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AndreySol 215 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 1. Ты считаешь, что обновлением ~50 раз в секунду в окне кастом-статика получаешь больше информации, чем, например, делая подобное 1 раз в секунду? Несколько мне известно, большая часть информации на худе обновляется\отображается по апдейтам актера, поэтому я и не думал, что в случае с отображением веса барахла надо смотреть в сторону таймеров. 2. Ты считаешь, что те же самые секции объектов/предметов, следует перечитывать каждый раз заново из конфиг-файлов, т.к. один раз прочитанное может измениться?но может изменится содержимое инвентаря. Да и проблема как я понял, все-же в чтении из нет-пакета. и кешируя ту же local packet = net_packet() один раз, а не в каждом цикле апдейта да еще и для каждой пачки(!)если имеется в виду вынести local packet = net_packet() из ф-ции GetInvWeight(), то я попробовал и с учетом добавления packet:w_begin(0) - результат тот-же. Ссылка на комментарий
Artos 99 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 AndreySol, хочется дать на твой пост ответ типа: "no comments" и предоставить возможность запиматься погадалками далее, но уж очень типичен подобный подход у многих модмейкеров, поэтому все же прокомментирую: 0. Неужели не ясно, что многое в подобных вопросах зависит от версии игры, тем более в ЧН и ЗП есть немаловажные особенности работы с нет-пакетами. Тобою же игнорируется напоминание про Неуказание версии ... Такой ответ тебя устраивает: "У меня на чистой SCoP v1.0006 твои коды работают без проблем и все отображается!" - ? Т.о. искать черную кошку в темной комнате, да еще когда ее там нет - потрудись сам. Также тебе дали рекомендации/советы по и оптимизации и собственно по возможным причинам твоей проблемы: 1. Хорошо, что тебе это известно, ну а думалка то на что? - большинство элементов включаются/отключаются, но НЕ обновляются ежеапдейтно! Т.е. один раз включив ту или иную иконку/текстуру - далее повторного обновления не происходит. Обновление практикуется только для шкал, и то и движек и скрипты делают это с той или иной дискретностью. - нужно все же различать: обновление одной и той же картинки/иконки или обновление текста/цифр. Неужели не в домек, что меняя цифирьки с частотой 50 раз в секунду и если цифирьки меняются - ты ничего не разберешь в выводимом сообщении?! - голова модмейкеру дана чтобы думать, а не тупо повторять то, что возможно кто-то когда-то сделал ... возможно не очень удачно и тем более совершенно для иного. 2. Препрочти мою строку еще раз пять и постарайся понять ее смысл! Пусть меняется содержимое инвентаря, но зачем же перечитывать те секции, которые уже были прочитаны? Если один раз прочитав, нужное запомнить - не придется этим заниматься при каждом апдейте и для каждого предмета! Ну и конечно же "проблема" в чтении из нет-пакета, раз закомментирование именно строк с ними убирает ошибку, а точнее - в подобном чтении, которое применяешь именно ты ... Не буду гадать далее, но если возникает ошибка нужно все же уделить внимание даже тем участкам кода, которые кажутся "правильными": - получая серверный объект пачки патронов, наверное стОит перепроверить "а существует ли se_obj в игре?", и только после этого пытаться читать его нет-пакеты. - стОит ли полагаться неким проверкам по строкам в конфиг-файлах о классе объекта, когда можно напрямую однозначно проверить класс объекта для тех же патронов: "if item:clsid() == clsid.wpn_ammo then ..."; ... ну и т.п. Операции с нет-пакетами не сложны и нет причин их чураться, но(!) они требу.т абсолютной однозначности и правильности применения к конкретному объекту. И повторю, если целью является отображение информации о весе - то глупо обновлять информацию для визуального восприятия на худе чаще 1-2 раз в секунду. Если же это требуется для работы скритов, то ... подобный перебор всего и вся в инвентаре актора на каждом апдейте - заранее обречен на неприменимость в моде/игру. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 Есть более элегантное решение. Установите себе X-Ray extensions, там есть метод (в каком то из последних ревизий добавили), который возвращает вес инвентаря Freedom Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти