RayTwitty 587 Опубликовано 22 Августа 2015 Расширение стандартных таблиц значениями, которые доложить почему-то забыли: DIK_keys["MOUSE_4"] = 340 DIK_keys["MOUSE_5"] = 341 DIK_keys["MOUSE_6"] = 342 DIK_keys["MOUSE_7"] = 343 DIK_keys["MOUSE_8"] = 344 key_bindings["kSPRINT_TOGGLE"] = 8 key_bindings["kENGINE"] = 15 key_bindings["kARTEFACT"] = 30 key_bindings["kWPN_FIREMODE_PREV"] = 38 key_bindings["kWPN_FIREMODE_NEXT"] = 39 key_bindings["kPAUSE"] = 40 key_bindings["kCHAT_TEAM"] = 45 key_bindings["kACTIVE_JOBS"] = 53 key_bindings["kMAP"] = 54 key_bindings["kCONTACTS"] = 55 key_bindings["kVOTE_BEGIN"] = 57 key_bindings["kVOTE"] = 58 key_bindings["kVOTEYES"] = 59 key_bindings["kVOTENO"] = 60 key_bindings["kSPEECH_MENU_0"] = 63 key_bindings["kSPEECH_MENU_1"] = 64 key_bindings["kUSE_BANDAGE"] = 73 key_bindings["kUSE_MEDKIT"] = 74 key_bindings["kQUICK_SAVE"] = 75 key_bindings["kQUICK_LOAD"] = 76 Несколько функций в стандартные пространства имен: -- возвращает реальный размер таблицы -- пример: table.size({"first", "two"}) => 2 function table.size(t) if t then local c = 0 for k, v in pairs(t) do c = c + 1 end return c end end -- округляет число до заданной точности после запятой -- пример: math.round(0.56765895, 2) => 0.57 function math.round(v, exp) if v then if not exp then exp = 0 end return tonumber(string.format("%."..exp.."f", v)) end end -- выравнивает значение числа, если оно находится за диапазоном -- пример: math.clamp(12, 1, 10) => 10 function math.clamp(v, min, max) if v then if v < min then return min elseif v > max then return max end return v end end -- возвращает количество вхождений шаблона -- можно посчитать, сколько определенных символов есть в строке -- пример: string.count("молоко", "о") => 3 function string.count(s, pattern) local res, c = string.gsub(s, pattern, "_") return c end -- переводит значение в булевое -- пример: toboolean("0") => false function toboolean(e) return e ~= nil and e ~= 0 and e ~= "0" and e ~= "false" and e ~= false end Добавить в _G. 2 1 Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 22 Августа 2015 По теме... откопайте кто-нибудь мне инструкцию-описание к расширению Луа от RvP. А то пользуюсь сам по памяти, скинуть могу, а вот инструкцию к нему приложить, что там лежит - кхм, не смогу) https://code.google.com/p/xrluafix/wiki/description 1 Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 22 Августа 2015 (изменено) Там нету ни слова о восстановлении функции log, хотя она восстановлена а в чистом ТЧ не работает, если мне память не изменяет. Функция вывода в лог там есть, называется log123. Я сам эту либу когда-то собирал, все описание точное, за исключением разве что --xml --Lua XML --Тоже оригинальная Lua библиотека. Более подробно в шапке. она не входит в комплект с этой библиотекой, её надо качать отдельно и подключать через require. Так например сделано в последнем OGSE. ---------------------------- А ведь, несколько лет назад уже была попытка создать такую тему: http://www.amk-team.ru/forum/index.php?showtopic=12753&p=794719 но кое-кто внизу темы полез в... эм... кхм... вы поняли куда и в конечном итоге тему закрыли :| Изменено 22 Августа 2015 пользователем Shadows Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 22 Августа 2015 Я запустил игру и посмотрел своими глазами. А своим глазам я пока ещё верю Скомпилил то что на гуглокоде? Или запустил OGSE? Если второе, то ясное дело - в OGSE все это уже есть, LuaXML_lib.dll называется, лежит в bin\extensions. http://viremo.eludi.net/LuaXML/ http://www.amk-team.ru/forum/index.php?showtopic=6185&p=832428 тем более ты сам когда-то тоже самое говорил Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 22 Августа 2015 (изменено) Вот кстати подправленная функция поиска тегов для LuaXML: http://www.amk-team.ru/forum/index.php?showtopic=6185&p=833939 Было бы неплохо, если кто-то собрал и выложил LuaXML библиотеку со всеми подобными правками готовую к употреблению. У меня к сожалению на руках нет. З.Ы. посты 27-34, думаю можно удалить, разобрались. Изменено 22 Августа 2015 пользователем Shadows Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 22 Августа 2015 (изменено) Вот еще нашел, потом оформлю в свой пост: Функция форматирования текста от Nazgool, которую он по просьбе написал мне пару лет назад. Требовалось для расстановки символов переноса строк в GUI-окнах сталкера. -- Форматирование текста для вставки в окно определенного размера -- Модификатор 'f' - full (или 'ns') - убираются переводы строк и лишние пробелы -- Модификатор 'n' - перевод строки - убираются переводы строк -- Модификатор 's' - space - убираются лишние пробелы (несколько пробелов подряд сбиваются в один, убираются пробелы в начале и конце строки) -- По умолчанию текст оставляется как есть function FormatText(text, width, mod) local new_line_symbol = '\\n' -- '\n' local mod_f, mod_n, mod_s if type(mod) == 'string' then mod_f = mod:match('f') mod_n = mod:match('n') mod_s = mod:match('s') end local function TextMod(txt) if mod_f or mod_n and mod_s then txt = txt:gsub('%s%s+', ' '):gsub('^%s*(.*)%s*$', '%1') elseif mod_n then txt = txt:gsub(new_line_symbol,'') elseif mod_s then txt = txt:gsub('[^%S'..new_line_symbol..']+', ' '):gsub('^%s*(.*)%s*$', '%1') end return txt end local function SearchEndLine(l, str) while str:sub(l, l) ~= ' ' do if l == 0 then l = width break end l = l - 1 end return l end text = type(text) == 'string' and TextMod(text) or '' width = tonumber(width) or 0 local NewTab = {} local LineTab = {} for w in text:gmatch('[^'..new_line_symbol..']+') do LineTab[#LineTab + 1] = w end for i = 1, #LineTab do local str = LineTab[i] while #str > width do local line_len = width local s_last = str:sub(line_len, line_len) local s_next = str:sub(line_len + 1, line_len + 1) if s_last == ' ' or s_next == ' ' then NewTab[#NewTab + 1] = TextMod(str:sub(1, line_len)) else local w_line = SearchEndLine(line_len, str) NewTab[#NewTab + 1] = TextMod(str:sub(1, w_line)) line_len = w_line end str = str:sub(line_len + 1) end NewTab[#NewTab + 1] = TextMod(str) end return table.concat(NewTab, new_line_symbol) end -- Вызов local new_text = FormatText(s, 50,'f') -- аргументы 1-й форматируемая строка, 2-й ширина строки(кол-во символов), 3-й модификатор Должна разбивать строку на подстроки расставляя переносы, длина строки задается во втором аргументе FormatText("тестовый текст тестовый текст тестовый текст тестовый текст тестовый текст тестовый текст", 20) => должно разбить на подстроки по 20 символов Изменено 22 Августа 2015 пользователем Shadows Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 29 Августа 2015 (изменено) FormatTextПроверил работу функции - все работает, разбивает текст как и задумывалось. st = CUIStatic() st:Init("ui\\ui_asus_intro", 0, 0, 295, 140) st:SetStretchTexture(true) st:SetText(FormatText(game.translate_string("enc_weapons1_wpn-ak74u"), 40)) st:SetTextComplexMode(true) get_hud():AddDialogToRender(st) Изменено 29 Августа 2015 пользователем Shadows 1 1 Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 23 Сентября 2015 (изменено) https://yadi.sk/d/4EUvTWhzdnAve https://yadi.sk/d/wzSTaTNVh8Eeb Документация Lua от Nazgool. Какая из версий актуальная - не знаю. З.Ы. когда же люди научатся оформлять и правильно выкладывать свои работы, а не только писать их?.. Изменено 23 Сентября 2015 пользователем RayTwitty 1 Поделиться этим сообщением Ссылка на сообщение
RayTwitty 587 Опубликовано 29 Ноября 2015 (изменено) -- функция возвращает название части тела по номеру кости. Часто используется в хит-колбеках НПС. function get_body_part_by_bone_index(bone_index) if bone_index then if bone_index < 5 then return "left_foot" elseif bone_index < 9 then return "right_foot" elseif bone_index < 11 then return "torso" elseif bone_index < 18 then return "head" elseif bone_index < 31 then return "left_hand" elseif bone_index < 40 then return "right_hand" end end end -- сравнивает два угла в радианах с погрешностью второго угла function radians_cmp(angle1, angle2, range_min, range_max) range_min = angle2 - range_min range_max = angle2 + range_max if range_max > 1.57 then range_max = -4.71 + (range_max - 1.57) end if range_min < -4.71 then range_min = 1.57 - (range_min - 4.71) end return angle1 > range_min and angle1 < range_max endНа счет последнего не знаю, использовал давно, возможно есть стандартный аналог или можно лучше написать. Но по крайней мере, все работало. Изменено 29 Ноября 2015 пользователем RayTwitty Поделиться этим сообщением Ссылка на сообщение