Перейти к контенту

Сборочный цех


Zander_driver

Рекомендуемые сообщения

Расширение стандартных таблиц значениями, которые доложить почему-то забыли:

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

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

По теме... откопайте кто-нибудь мне инструкцию-описание к расширению Луа от RvP. А то пользуюсь сам по памяти, скинуть могу, а вот инструкцию к нему приложить, что там лежит - кхм, не смогу)

https://code.google.com/p/xrluafix/wiki/description
  • Спасибо 1

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

Там нету ни слова о восстановлении функции log, хотя она восстановлена а в чистом ТЧ не работает, если мне память не изменяет.

Функция вывода в лог там есть, называется log123. Я сам эту либу когда-то собирал, все описание точное, за исключением разве что

--xml
--Lua XML
--Тоже оригинальная Lua библиотека. Более подробно в шапке.

она не входит в комплект с этой библиотекой, её надо качать отдельно и подключать через require. Так например сделано в последнем OGSE.

 

----------------------------

А ведь, несколько лет назад уже была попытка создать такую тему: http://www.amk-team.ru/forum/index.php?showtopic=12753&p=794719

но кое-кто внизу темы полез в... эм... кхм... вы поняли куда и в конечном итоге тему закрыли :|

Изменено пользователем Shadows

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

 

 

Я запустил игру и посмотрел своими глазами. А своим глазам я пока ещё верю

Скомпилил то что на гуглокоде? Или запустил OGSE? Если второе, то ясное дело - в OGSE все это уже есть, LuaXML_lib.dll называется, лежит в bin\extensions.

 

http://viremo.eludi.net/LuaXML/

 

http://www.amk-team.ru/forum/index.php?showtopic=6185&p=832428

тем более ты сам когда-то тоже самое говорил :D

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

Вот кстати подправленная функция поиска тегов для LuaXML: http://www.amk-team.ru/forum/index.php?showtopic=6185&p=833939

 

Было бы неплохо, если кто-то собрал и выложил LuaXML библиотеку со всеми подобными правками готовую к употреблению. У меня к сожалению на руках нет.

 

З.Ы. посты 27-34, думаю можно удалить, разобрались.

Изменено пользователем Shadows

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

Вот еще нашел, потом оформлю в свой пост:

 

Функция форматирования текста от 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 символов
Изменено пользователем Shadows

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

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)
Изменено пользователем Shadows
  • Спасибо 1
  • Полезно 1

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

https://yadi.sk/d/4EUvTWhzdnAve

https://yadi.sk/d/wzSTaTNVh8Eeb

 

Документация Lua от Nazgool. Какая из версий актуальная - не знаю.

 

З.Ы. когда же люди научатся оформлять и правильно выкладывать свои работы, а не только писать их?..

Изменено пользователем RayTwitty
  • Полезно 1

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение

-- функция возвращает название части тела по номеру кости. Часто используется в хит-колбеках НПС.

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

На счет последнего не знаю, использовал давно, возможно есть стандартный аналог или можно лучше написать. Но по крайней мере, все работало. Изменено пользователем RayTwitty

Telegram-канал RayTwitty Space

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...