Nazgool 250 Опубликовано 13 Мая 2012 (изменено) однако не вызывается this.nano_speed_1() (если поставить ее вызов после сообщения, что все ок)Ну так я просто не поставил этот вызов. Забыл там... или ещё чего-то. Не стоит копировать всё что видишь. Иногда нужно и подумать, проверить, понять. Да и не мешало бы в подробностях объяснить что, когда и как должно работать. А то каждый додумывает по-своему. Изменено 13 Мая 2012 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 10 Июня 2012 (изменено) как запомнить какой текст выпал и больше его не выдаватьДля твоих целей как нельзя лучше подходит совершенно замечательный код, написанный Рики Лэйком (Rici Lake, rici@ricilake.net) Изменено 10 Июня 2012 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 7 Сентября 2012 Ну наблюдаем небольшую задержку при взятии бальшой-бальшой кучи предметов Есть же coroutine. Можно растянуть по времени взятие такого количества единиц предметов. Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 11 Октября 2012 (изменено) ColR_iT, можно ещё чуток "подкрутить" local cond_standard = { ["novice"] = 20, ["experienced"] = 30, ["veteran"] = 40, ["master"] = 50, } function repair_wpn_1() local item_in_slot = db.actor:item_in_slot(2) if item_in_slot:condition() < 0.9 and item_in_slot:condition() >= 0.2 then -- сначала правильнее будет проверить - подходит ли вообще ствол для ремонта for i = 0, db.actor:object_count() - 1 do local item = db.actor:object(i) if item:section() == item_in_slot:section() then -- тут лучше сначала проверить, совпадает ли итем по названию секции? Как правило мы имеем пару-тройку одинаковых стволов. Все остальные (сотня? больше?) итемов не пройдут эту проверку. Зачем же зря гонять систему на две проверки (через and)? if item:id() ~= item_in_slot:id() then -- а когда название секции совпадёт, то тогда и проверим - не в слоте ли он? local act_rank = ranks.get_obj_rank_name(db.actor) -- и только теперь вычисляем ранг, ведь раньше он совершенно не нужен. item_in_slot:set_condition(item_in_slot:condition() + (math.random(20) + cond_standard[act_rank])/100) this.repair_wpn_sound() alife():release(alife():object(item:id()), true) return end end end end end Изменено 11 Октября 2012 пользователем Gun12 1 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 3 Ноября 2012 (изменено) Я и не знал, что в lua появился новый оператор =~ (наверное "примерного присваивания" что ли?) Я бы мог понять это : if time_m =~ 59 then Так : Если переменной time_m присвоено значение примерно 59, то... :-) Изменено 3 Ноября 2012 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 14 Января 2013 (изменено) Очень интересная реализация Lua OOP представлена в комплекте Lua for Windows (для тех у кого есть) по адресу ...\5.1\lua\loop Там есть чему поучиться. Изменено 14 Января 2013 пользователем Gun12 1 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 21 Января 2013 (изменено) Artos Да ведь тут, без тебя, СП организуется. Неееет. На энто я пойтить не могу. Не предпринимай резких действий. Всё образуется. Изменено 21 Января 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 14 Апреля 2013 (изменено) OFF_ender Если очень нужно, то именно для твоих таблиц могу дать вариант "на скорую руку". Насколько я понял таблиц будет сохраняться две. Если в каждой будет по 50 полей, то размер сохраняемой строки составит около 1кб +-. Так что если ещё актуально - прошу. Хотя сорри. Что означает <1..65535>? кол-во символов или числа из этого диапазона? Изменено 14 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 14 Апреля 2013 (изменено) В твоём примере я стрингов не видел. В общем так. Я исхожу из следующих утверждений. 1. Таблицы две. 2. В каждой из этих таблиц находится массив из таблиц 3. Все таблицы из массива имеют одинаковые ключи (id_a, id_b и numb) 4. Каждое значение ключа - число из указанного диапазона. Если так, то, как я уже говорил, для 50-ти полей в каждой из таблиц и максимальных значений каждого поля размер будет 1074 байта function toString(...) local args = {...} local s = '' for i = 1, #args do local n = args[i] if next(n) then local keys = {} for k in pairs(n[1]) do keys[#keys+1] = k end s = s..'#@'..table.concat(keys,' ')..'@' local values = {} for j=1,#args[i] do for _,v in pairs(args[i][j]) do values[#values+1]=string.format('%x',v) end s = s..'~'..table.concat(values,' ') values = {} end else s=s..'#~' end end return sends=toString(table1,table2) -- сохранять строку 's'function toTable(s) local t = {} for w in s:gmatch('[^#]+') do local k = {} w = w:gsub('%@(.+)%@', function(v) for m in v:gmatch('%S+') do k[#k+1] = m end return '' end) local t1 = {} for v in w:gmatch('[^~]+') do local n = 1 local t2 = {} for m in v:gmatch('%S+') do t2[k[n]] = tonumber(m,16) n = n+1 end t1[#t1+1]=t2 end t[#t+1]=t1 end return tendt = toTable(s) -- загружать строку 's'table1 = t[1]table2 = t[2] Можно ещё пару сотен байт срезать Изменено 15 Апреля 2013 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 15 Апреля 2013 (изменено) В моём варианте ключи id_a, id_b, numb записываются только один раз. В сохраняемой строке они занимают всего 16 байт. Вот и весь выигрыш в пакете. Всё остальное это значения каждой из подтаблиц. После загрузки строки подтаблицы примут первоначальный вид, каждая с ключами и естественно со значениями. Так что решай что тебе нужнее - 16 байт или нормальный вид подтаблиц. Дальше. Если ты не обращался ко второй таблице, то и записывать её нет смысла. Передавай в вызове только одну s=toString(table1). ну или какую нужно. 8192 байта размер пакета Если тебе будет жалко 16-ти байт, давай подкину вариант, который экономит ещё порядка 200 (может и больше) байт (т.е. максимальный размер таблицы формата 2х50 не превысит 874 байта). А ещё другими словами - в тот же размер (1074) можно записать таблицы формата 2х62 Изменено 15 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 15 Апреля 2013 (изменено) Ну это смотря как кодировать.Если использовать HEX вариант то да, один байт экономиться. Т.е. число 1000 переводиться в 3-х значное hex-число, число 100 в 2-х значноеЭто значит что числа диапазона 256-4095 кодируются 3-мя символами(байтам), 4096-65535 4-мя байтами и т.д.Я использую кодирования с основанием 100Поэтому диапазоны такие : 99-9999 кодируются 2-мя байтами), 10000-999999 - 3-мя, 1000000-99999999 4-мя и т.д.Так что, как видишь, для этой системы кодирования всё-равно что 100, что 1000. Кодироваться всё равно будет 2-мя байтами в отличии от HEXНасчёт индексов 1,2,3 или ключей стрингов. Функциям по барабану. Количество строки байтов увеличится на длину строк всех ключей - 3Ну будет лишний десяток байт. Если не критично, то можешь писать стринги.Artos, мне хорошо известно в какую сторону иду я.Не знаю как для тебя, но для меня упражнения в lua дело очень даже полезное.Так что всем спасибо за предупреждения. Приняли. Подумаем на досуге... как-то... Ты же уже давно знаешь меня, и пора привыкнуть что для меня получить готовый результат не самоцель. Ну возьму я хранилища. Нет. Чего мелочиться. Качать готовые моды паком, удалить на фиг lua с компа и не парить себе мозги. Вот. Изменено 15 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 15 Апреля 2013 (изменено) Artos, тут понимаешь в чём загвоздка ? (не у меня ) Не в обиду игре, я шепотом, - мне глубоко плевать на Сталкера с его нет-пакетами и прочими прибамбасами, портящими lua. Я занялся этим вопросом потому, что он сейчас как раз пересекается с моими интересами в работе над одним .. в общем не важно И мне хотелось бы кое-чего попаковать. Вот на что я ориентирован. А лично мне переполнение не грозит. Есть lua. Есть io.write OFF_ender, пробуй : --=============================================== -- Составление таблицы соответсвий число -> символ local char = string.char local t10, t100 = {}, {} local t = {} for i = 65, 255 do t[#t+1] = string.char(i) end local s = table.concat(t) -- строка символов win1251 local n=10 for c in s:gmatch('[A-Za-zА-е]') do t100[tostring(n)] = c n=n+1 end for i = 0, 10 do t100['0'..i] = char(240+i) end -- Составление таблицы соответсвий символ -> число for k,v in pairs(t100) do t10[v]=k end --=============================================== -- функция конвертации числа в строку function to100(n) return tostring(n):gsub('%d%d', function(w) return t100[w] end) end -- функция конвертации строки в чмсло function to10(s) return s:gsub('%D', function (c) return t10[c] end) end --================================================ -- table to string function toString(...) local args = {...} local s = '' for i = 1, #args do local n = args[i] if next(n) then local keys = {} for k in pairs(n[1]) do keys[#keys+1] = k end s = s..'#@'..table.concat(keys,' ')..'@' local values = {} for j=1,#args[i] do for _,v in pairs(args[i][j]) do values[#values+1]=to100(v) end s = s..'~'..table.concat(values,' ') values = {} end else s=s..'#~' end end return s end -- string to table function toTable(s) local t = {} for w in s:gmatch('[^#]+') do local k = {} w = w:gsub('%@(.+)%@', function(v) for m in v:gmatch('%S+') do k[#k+1] = m end return '' end) local t1 = {} for v in w:gmatch('[^~]+') do local n = 1 local t2 = {} for m in v:gmatch('%S+') do t2[k[n]] = to10(m) n = n+1 end t1[#t1+1]=t2 end t[#t+1]=t1 end return t end local str = toString(table1, table2) -- строку 'str' сохраняешь local num = toTable(str) -- таблица с таблицами 'table1' и 'table2' --================================================ Изменено 15 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 15 Апреля 2013 fCloneTable и fCopyTable можно одной функцией сделать Себе так и сделал. Да и на вид по-проще. Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 15 Апреля 2013 (изменено) Нет. Просто вызывай : s = toString(table1) Таблица полностью запишется в строку. Вот эту строку и сохраняй Если будет несколько таблиц, то так и пиши : s = toString(table1,table2,table3,table4) -- и т.д. Все эти таблицы запишутся в одну строку. При загрузке получай из пакета строку и вызывай : tab = toTable(s) - s это полученная строка, tab - таблица с восстановленными таблицами table1, и т.д. Затем пишешь : table1 = tab[1] А если сохранял несколько, то : table1 = tab[1] table2 = tab[2] table3 = tab[3] и т.д. И будут тебе твои таблицы в прежнем виде Изменено 15 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 17 Апреля 2013 Да, действительно я забыл про tonumber. Найди в функции toTable : for m in v:gmatch('%S+') do t2[k[n]] = to10(m) n = n+1end и замени на : for m in v:gmatch('%S+') do local x = to10(m) t2[k[n]] = tonumber(x) n = n+1end Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 17 Апреля 2013 (изменено) Не нужен там никакой второй аргумент. У меня всё работает. Можешь показать свою таблицу? Или дай несколько чисел, которые не правильно переводятся. Да, ещё найди и замени вот ещё что (там лишнее поле создаётся) : for i = 0, 9 do t100['0'..i] = char(240+i)end Изменено 17 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 17 Апреля 2013 (изменено) Твоя таблица у меня работает нормально. Так что может ты не так что-то исправил, либо опять причуды lua а-ля сталкер. Отправил тебе ЛС. Смотри там. -------- Ага, таки ты всё-таки наисправлял... Пожалуйста. Изменено 17 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 25 Апреля 2013 (изменено) Callisto ,с io или без? Изменено 25 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 26 Апреля 2013 (изменено) Callisto, для Сталкера, насколько припоминаю, есть такой ход : getFS():exist(path) path - вроде как полный путь к файлу (папке?). Пусть более знающие сталкера подскажут точнее. Во всяком случае, пока не ответят, можешь попробовать. А если для "нормального" lua нужно будет, то милости прошу. Изменено 26 Апреля 2013 пользователем Gun12 Поделиться этим сообщением Ссылка на сообщение
Nazgool 250 Опубликовано 26 Апреля 2013 В общем, можно ли проверить существование файла и папки? Непонятно какой именно, точнее где это должно находиться? Если это скрипт из папки scripts, то можно и через _g. А если какой-то другой... Callisto, уточни - что именно ты хочешь сделать? Поделиться этим сообщением Ссылка на сообщение