naxac 2 445 Опубликовано 23 Августа 2015 (изменено) Внесу и свои три копейки)Небольшой GUI-класс для имитации поддержки вводв с русской раскладки клавиатуры в CUIEditBox: --[[----------------------------------------------------------------------------------------------------- File : rus_edit_box.script Description : Эмуляция русской раскладки клавиатуры в CUIEditBox (ТЧ) Created : 13.11.2014 Copyright : naxac --------------------------------------------------------------------------------------------------------- Обязательные передаваемые параметры: x, y - координаты верхнего левого угла относительно элемента окна, к которому приаттачивам бокс width - ширина окна (высота фиксированная, 25), рекомендуется хотя бы >=100 stat - элемент базового класса, к которому приаттачиваем бокс type - необязательный параметр: текстура бокса (см. таблицу box_textures). По умолчанию - ui_linetext_e Методы: GetText() - получить введённый текст, SetText(string) - поместить в поле текст SetTextColor(number,number,number,number) - задать цвет текста (A,R,G, Пример использования: self.edit_box = rus_edit_box.NewEditBox(self.form, 10, 45, 200, "pda") -- приаттачиваем бокс к базовому классу Обязательно добавляем в каллбэк на нажатие клавиш базового класса (OnKeyboard): self.edit_box:KeyboardCallback(dik) --]]----------------------------------------------------------------------------------------------------- local string_sub = string.sub local eng = [[qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?!@#$%^&*()-_+=\| 0123456789]] local rus = [[йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,!"№;%:?*()-_+=\/ 0123456789]] local translit_tbl = {} for pos = 1, #rus do translit_tbl[string_sub(eng, pos, pos)] = string_sub(rus, pos, pos) end function translit(s) return translit_tbl[s] or s end function string.split(str,k) local _f, _s = string.match(str, "([^"..k.."]*)"..k.."([^"..k.."]*)") return (_f or ""), (_s or "") end ---------------------------------------------------------------------------------------- class "NewEditBox" (CUIScriptWnd) local kr = "_" -- курсор local box_textures = { def = "ui_linetext_e", pda = "ui_icons_PDA_dialog_string" } function NewEditBox:__init(stat, x, y, width, type) super() self.text = kr self.lang = "RUS" local texture = box_textures["def"] if type and box_textures[type] then texture = box_textures[type] end self.st = CUIStatic() self.st:Init(x, y, width, 25) stat:AttachChild(self.st) self.edit_box = CUIEditBox() self.edit_box:SetAutoDelete(true) self.edit_box:Init(0,2,width-39,22) self.edit_box:InitTexture(texture) self.edit_box:SetTextColor(GetARGB(0,0,0,0)) self.edit_box:SetFont(GetFontLetterica18Russian()) self.st:AttachChild(self.edit_box) self.text_stat = CUIStatic() self.text_stat:SetAutoDelete(true) self.text_stat:Init(2,4,width-42,22) self.text_stat:SetText(self.text) self.text_stat:SetTextColor(255,180,255,140) self.text_stat:SetFont(GetFontLetterica18Russian()) self.st:AttachChild(self.text_stat) self.btn_lang = CUI3tButton() self.btn_lang:Init(width-37,0,37,25) self.btn_lang:SetAutoDelete(true) self.btn_lang:InitTexture("ui_hud_button_voting_01") self.btn_lang:SetText(self.lang) self.btn_lang:SetTextAlign(CGameFont.alCenter) self.btn_lang:SetTextY(1) self.btn_lang:SetTextColor(255,216,186,140) self.st:AttachChild(self.btn_lang) self:Register(self.btn_lang, "btn_lang") self:AddCallback("btn_lang", ui_events.BUTTON_CLICKED, self.on_ButtonChangeLang_clicked, self) end function NewEditBox:on_ButtonChangeLang_clicked() self.lang = (self.lang == "RUS" and "ENG") or "RUS" self.btn_lang:SetText(self.lang) end function NewEditBox:GetText() return string.gsub(self.text, kr, "") end function NewEditBox:SetText(text) self.text = text..kr self.text_stat:SetText(self.text) end function NewEditBox:SetTextColor(a,r,g, self.text_stat:SetTextColor(a,r,g, end function NewEditBox:ChangeText(letter) if letter == kr then return end local lett = letter and (self.lang=="RUS" and translit(letter) or letter) or "" local s1, s2 = string.split(self.text,kr) self.text = s1..lett..kr..s2 self.text_stat:SetText(self.text) end function NewEditBox:DeleteLetter(mode) local s1, s2 = string.split(self.text,kr) if mode then s1 = #s1>1 and string_sub(s1,1,-2) or "" else s2 = #s2>1 and string_sub(s2,2) or "" end self.text = s1..kr..s2 self.text_stat:SetText(self.text) end function NewEditBox:CursorMove(mode) local s1, s2 = string.split(self.text,kr) local str1, str2 = "", "" if mode then str1 = s1..(#s2>0 and string_sub(s2,1,1) or "") str2 = #s2>1 and string_sub(s2,2) or "" else str1 = #s1>1 and string_sub(s1,1,-2) or "" str2 = (#s1>0 and string_sub(s1,-1) or "")..s2 end self.text = str1..kr..str2 self.text_stat:SetText(self.text) end function NewEditBox:KeyboardCallback(dik) if dik == DIK_keys.DIK_BACK then self:DeleteLetter(true) elseif dik == DIK_keys.DIK_DELETE then self:DeleteLetter(false) elseif dik == DIK_keys.DIK_LEFT then self:CursorMove(false) elseif dik == DIK_keys.DIK_RIGHT then self:CursorMove(true) elseif dik == DIK_keys.DIK_LMENU or dik == DIK_keys.DIK_RMENU then self:on_ButtonChangeLang_clicked() else local letter = string_sub(self.edit_box:GetText(),-1) if letter and letter~="" then self:ChangeText(letter) self.edit_box:SetText("") end end end Функция string.lower с поддержкой кириллицы -- 'string.lower' с поддержкой кириллицы. local low = [[qwertyuiopasdfghjklzxcvbnmйцукенгшщзхъфывапролджэячсмитьбюё]] local high = [[QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ]] function string.lower1 (str) local ret = "" local f for s in string.gmatch(str, ".") do f = string.find(high, s, 1, true) ret = ret..(f and string.sub(low,f,f) or s) end return ret endend Добавить куда-нибудь в _g.script Изменено 23 Августа 2015 пользователем Murarius 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение
naxac 2 445 Опубликовано 21 Октября 2015 (изменено) Скрипт ищет в конфигах секции всех игровых объектов и возвращает таблицу секций, сортированных по классам (в скобках - название поля таблицы): - оружие (weapons), - аммуниция (ammo), - обвесы (addons), - костюмы/шлемы (outfits), - арефакты (artefacts), - квестовые предметы (quest_items), - остальные предметы (items), - монстры (mobs), - нпс (stalkers), - автомобили (cars), - аномалии (anomalies), - остальные, которым категории не нашлось (other) Если в Луа присутствует пространство имен io, то в папке конфигов будет создан файл 'all_sections.ltx' со списком всех секций по категориям. Взможное применение - создание 'спавнеров' к модам (чтобы в ручную не искать секции). Получаем таблицу: local t = collect_sections.main()!!! Для того, чтобы прочитались все конфиги, ресурсы игры должны быть распакованы !!! Платформа: ТЧ, ЧН, ЗП. Скачать: ссылка Изменено 21 Октября 2015 пользователем naxac 5 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение
naxac 2 445 Опубликовано 21 Августа 2016 (изменено) Пофиксенный m_netpk от Artos'a: ! исправлен разбор num_items и чтение некоторых параметров update-части пакета объектов, наследованных от cse_alife_inventory_item; ! исправлено чтение update-части в net_cse_alife_item_weapon_magazined_w_gl; + добавлены функции для работы с шейпами из OGSE (см.конец модуля); ~ в shape для кубических шейпов теперь размеры читаются не векторами, а одной матрицей; * чтобы подключить модуль, надо где-нибудь на загрузке вызвать m_netpk.init() (я это делаю в начале _g.script). Всё остальное - оставлено как было, разве что местами повырезаны дебаговые сообщения. Ссылка Изменено 21 Августа 2016 пользователем naxac 5 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение
naxac 2 445 Опубликовано 23 Августа 2016 (изменено) @Kirgudu, я даже не помню, что за версия.. В конфиге написано "last edit: 27.09.2013". Да, про table.size забыл совсем - у меня xrLua Extensions от RvP стоит, это оттуда. Если нужно, могу скинуть диф с изменениями. Изменено 23 Августа 2016 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение
naxac 2 445 Опубликовано 19 Октября 2016 (изменено) @Kirgudu, модуль m_netpk, который я выкладывал, с теми же правками чтения/записи (кроме матрицы вместо векторов) используется в моде ОП-2.1. Его как раз правили, основываясь на движке, для того, чтобы нетпакет правильно читался. Бетатест идет уже давно, до сих пор никаких глюков с этим модулем обнаружено не было. Кроме того, что уже написал dsh. Вот это исправлен разбор num_items и чтение некоторых параметров update-части пакета объектов, наследованных от cse_alife_inventory_item; исправлено чтение update-части в net_cse_alife_item_weapon_magazined_w_gl точно нужно добавить в подборку. Изменено 19 Октября 2016 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение
naxac 2 445 Опубликовано 19 Октября 2016 (изменено) Та ошибка, на которую наступил я, существовала очень давно и "никаких глюков" тоже не было. Эту ошибку исправили чуть ли не первым делом, когда начали использовать этот модуль. Просто я за основу брал старое, и этот момент пропустил. А про остальное - в новом движке сейчас стоит проверка, которая крашит игру при попытке чтения за границы нет-пакета. До указанных в предыдущем посте правок ошибки чтения были, после них - нет. Изменено 19 Октября 2016 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение
naxac 2 445 Опубликовано 12 Мая 2017 @Graff46, [logic]\nactive = remark\n[remark]\nanim = guard\nmeet = default_meet { ["logic"] = { ["active"] = "remark" }, ["remark"] = { ["anim"] = "guard", ["meet"] = "default_meet" } } Аддон для ОП-2.09.2: Яндекс/Google/GitHub Поделиться этим сообщением Ссылка на сообщение