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

Скриптование


Svoboда

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

однако не вызывается this.nano_speed_1() (если поставить ее вызов после сообщения, что все ок)
Ну так я просто не поставил этот вызов. Забыл там... или ещё чего-то. Не стоит копировать всё что видишь. Иногда нужно и подумать, проверить, понять.

Да и не мешало бы в подробностях объяснить что, когда и как должно работать.

А то каждый додумывает по-своему.

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

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


Ссылка на сообщение
как запомнить какой текст выпал и больше его не выдавать
Для твоих целей как нельзя лучше подходит совершенно замечательный код, написанный Рики Лэйком (Rici Lake, rici@ricilake.net) Изменено пользователем Gun12

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


Ссылка на сообщение
Ну наблюдаем небольшую задержку при взятии бальшой-бальшой кучи предметов

Есть же coroutine.

Можно растянуть по времени взятие такого количества единиц предметов.

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


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

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

 

Изменено пользователем Gun12
  • Нравится 1

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


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

Я и не знал, что в lua появился новый оператор =~ (наверное "примерного присваивания" что ли?)

Я бы мог понять это :

if time_m =~ 59 then

Так :

Если переменной time_m присвоено значение примерно 59, то... :-)

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

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


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

Очень интересная реализация Lua OOP представлена в комплекте Lua for Windows (для тех у кого есть) по адресу ...\5.1\lua\loop

Там есть чему поучиться.

Изменено пользователем Gun12
  • Нравится 1

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


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

Artos

 

Да ведь тут, без тебя, СП организуется.

Неееет. На энто я пойтить не могу.

Не предпринимай резких действий. Всё образуется.

 

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

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


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

OFF_ender

Если очень нужно, то именно для твоих таблиц могу дать вариант "на скорую руку". Насколько я понял таблиц будет сохраняться две. Если в каждой будет по 50 полей, то размер сохраняемой строки составит около 1кб +-. Так что если ещё актуально - прошу.

Хотя сорри. Что означает <1..65535>? кол-во символов или числа из этого диапазона?

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

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


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

В твоём примере я стрингов не видел.

В общем так. Я исхожу из следующих утверждений.

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]

 

 

 

 

 

Можно ещё пару сотен байт срезать

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

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


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

В моём варианте ключи id_a, id_b, numb записываются только один раз. В сохраняемой строке они занимают всего 16 байт. Вот и весь выигрыш в пакете. Всё остальное это значения каждой из подтаблиц. После загрузки строки подтаблицы примут первоначальный вид, каждая с ключами и естественно со значениями. Так что решай что тебе нужнее - 16 байт или нормальный вид подтаблиц.

 

Дальше. Если ты не обращался ко второй таблице, то и записывать её нет смысла. Передавай в вызове только одну s=toString(table1). ну или какую нужно.

8192 байта размер пакета



Если тебе будет жалко 16-ти байт, давай подкину вариант, который экономит ещё порядка 200 (может и больше) байт (т.е. максимальный размер таблицы формата 2х50 не превысит 874 байта). А ещё другими словами - в тот же размер (1074) можно записать таблицы формата 2х62

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

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


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

Ну это смотря как кодировать.
Если использовать 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 с компа и не парить себе мозги. Вот.

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

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


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

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'
--================================================

 

 

 

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

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


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

fCloneTable и fCopyTable можно одной функцией сделать

Себе так и сделал. Да и на вид по-проще.

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


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

Нет. Просто вызывай :

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]

и т.д.

 

И будут тебе твои таблицы в прежнем виде

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

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


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

Да, действительно я забыл про tonumber.

Найди в функции toTable :

 

for m in v:gmatch('%S+') do
    t2[k[n]] = to10(m)
    n = n+1
end

 

и замени на :

 

for m in v:gmatch('%S+') do
    local x = to10(m)
    t2[k[n]] = tonumber(x)
    n = n+1
end

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


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

Не нужен там никакой второй аргумент. У меня всё работает.

Можешь показать свою таблицу? Или дай несколько чисел, которые не правильно переводятся.

 

Да, ещё найди и замени вот ещё что (там лишнее поле создаётся) :

 

for i = 0, 9 do
    t100['0'..i] = char(240+i)
end

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

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


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

Твоя таблица у меня работает нормально.

Так что может ты не так что-то исправил, либо опять причуды lua а-ля сталкер.

Отправил тебе ЛС. Смотри там.

--------

Ага, таки ты всё-таки наисправлял... Пожалуйста.

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

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


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

Callisto io или без?

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

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


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

Callisto, для Сталкера, насколько припоминаю, есть такой ход : getFS():exist(path)

path - вроде как полный путь к файлу (папке?).

Пусть более знающие сталкера подскажут точнее.

Во всяком случае, пока не ответят, можешь попробовать.

 

А если для "нормального" lua нужно будет, то милости прошу.

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

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


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

В общем, можно ли проверить существование файла и папки?

Непонятно какой именно, точнее где это должно находиться?

Если это скрипт из папки scripts, то можно и через _g.

А если какой-то другой... Callisto, уточни - что именно ты хочешь сделать?

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


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

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