Язык Lua. Общие вопросы программирования - Страница 16 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

Язык Lua. Общие вопросы программирования


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

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

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

Йайа :D Вот за это и не люблю копипастить - легко что-то недосмотреть. Сенькаю, обновлено и залито.

 

ЗЫ Хочется фидбека по использованию, если кто решит попользовать. И всем спокойной ночи, кто в московском поясе ;)

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

xStream, огромное спасибо за нет пакеты)), вот только на врядли знающие найдут им применение))), а многие даже не разберутся как ними пользоваться)

 

Меня заинтересовало:

Так же на подходе универсальное хранилище данных (а-ля доисторический pstor) и (ахахахаха, барабанная дробь)... - моя реализация сохраняемых таймеров с использованием этого самого хранилища.

 

а именно универсальное хранилище - жду))

Изменено пользователем Viнt@rь

Для пользования ими есть специальные функции хелперы ОЧЕНЬ сильно упрощающие жизнь. Когда будет дошлифовано содержимое, то будет и мануал (а пока можно поглядеть readme.txt, там вполне реальные примеры приведены).

Как минимум в одном моде уже используется (там люди знающие, поверь) и то радует - мои эксперименты не пропадут даром.

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

Ну то что не пропадут даром - не сомневайся ^_^. Лично для себя вижу много чего интестного, как и для мода, так и просто поучиться. Поэксперементирую, напишу фидбэк подробней.

 

xStream, возможно, я не совсем понял код, но вроде как в методе read класса "net_alife_item" нет чтения updposition и updquaternion. Они должны читаться в случае, если num_items ~= 0. Если равно нулю, ни updposition, ни updquaternion нет.

Что касается skeleton_flags, abramcumner прав, в acdc упрощено, сейчас приведу логику чтения.

Вот на pstor очень интересно посмотреть, особенно на запись таблиц. Сам давно уже пишу всё в текстовый файл но это накладывает определенённые ограничения (плюс я не знаю всех тонкостей функций чтения\записи что вывелось в не очень аккуратный код)

Интересно будет глянуть на твою реализацию, там тоже будет перевод таблицы в строку как в АМК?

Изменено пользователем *Shoker*
xStream, возможно, я не совсем понял код, но вроде как в методе read класса "net_alife_item" нет чтения updposition и updquaternion. Они должны читаться в случае, если num_items ~= 0. Если равно нулю, ни updposition, ни updquaternion нет.

Что касается skeleton_flags, abramcumner прав, в acdc упрощено, сейчас приведу логику чтения.

Блин, я так спать не уйду :)

А это разве не оно?

        { name = 'ph_position',        type = 'f32v3', default = vector():set(0,0,0) },    
        { name = 'ph_rotation',        type = 'q8v',     default = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},     len = 4*4 },    --quaterinon

И

        if prop.name == "num_items" then
            updnum_items = ret["upd"..prop.name]
            if updnum_items==0 then
                return
            end
            info_mask = math.ceil(updnum_items/16)
            if not (bit_and(info_mask, 2)==0) then
                skip_props.ph_angular_vel = true
            end
            if not (bit_and(info_mask, 4)==0) then
                skip_props.ph_linear_vel = true
            end
        end

Вот условное чтение, в зависимости от updnum_items

xStream

Вчера наконец нашел время пограть с sandbox/timers, вот небольшой фидбэк:

 

1. В таймерах строка

local self.trigger_time = time_global() + time_seconds * 1000

 

изменил на (убрал local)

self.trigger_time = time_global() + time_seconds * 1000

 

2. Можно-ли регистрировать функцию калбэка находящююся в классе? Хотел инкапсулировать определенный функционал в классе, но не срабатывает регистрация типа:

event("actor_hit"):register(sample_class:on_actor_hit)

 

3. Заметил интерсную особенность - если вызывать мою песочницу из твоих калбэков, то файл перезагрузит сам себя на лету. Т.О. можно делать изменения не выходя из игры и в protected environment

Изменено пользователем Andrey07071977
Вот на pstor очень интересно посмотреть, особенно на запись таблиц. Сам давно уже пишу всё в текстовый файл но это накладывает определенённые ограничения (плюс я не знаю всех тонкостей функций чтения\записи что вывелось в не очень аккуратный код)

Интересно будет глянуть на твою реализацию, там тоже будет перевод таблицы в строку как в АМК?

А понять, как пишется очень просто :) Загляни в xs_helpers, там расширения для table есть: serialize и unserialize

 

Добавлено через 1 мин.:

Andrey07071977, таймеры, которые тут выкладывались - фигня, по ним не надо фидбека :)

xStream, по поводу нового универсального хранилища, посмущался спросить да бы не "задеть" тебя, но раз уж спросили, хотел бы узнать, будет как у АМК ЗП?)))

и вопрос: как тогда замена "стандартного" пстора повлияет на игру?

Изменено пользователем Viнt@rь

Из шапки, дабы немного удовлетворить любопытство:

--[[---------------------------------------------------------------------
Библиотека универсального хранилища данных произвольного размера
Основана на использовани нетпакетов объектов (используется новый тип 
объектов, описанный в конфигах, имеющие произвольную длину пакета).
Хранилище подстраивается под размер хранимых данных.

Использовать можно только после загрузки игры (присутствует актор)
Удаление переменной производится так же, как и установка переменной - 
функцией set, как значение надо передать nil
Получение переменной производится функцией get, второй параметр - 
значение по-умолчанию (опциональный параметр). Если переменной не 
существует и не указано значение по-умолчанию, будет возвращен nil

Сразу после загрузки хранилища "кидается" событие storage_load
Непосредственно перед сохранением - storage_save

Разрешено хранить переменные следующих типов:
    булевое (хранится как байт)
    
    число (хранится всегда как float, если требуется хранение очень 
        больших чисел, то рекомендуется использовать хук приведения
        к строке: ""..1234567890 - передавать на вход set)
        
    строка (хранится как последовательность байт + нулевой символ, 
        конец строки; ограничение на длину строки - 8000 байт)
        
    таблицы (ПРОСТЫЕ! То есть: без метатаблиц, без нулевых символов и 
        прочих бинарных данных, без рекурсий и только с простыми типами 
        в ключах и значениях. Кроме того, объем таблицы очень сильно
        ограничен - при сериализации строка должна влазить в пакет, а 
        значит ограничение примерно в 8000 байт текста.)
    
Depends on:
    xs_sandbox
    xs_helpers (as sandbox's module)
--]]---------------------------------------------------------------------

 

 

Viнt@rь, я не имею ни малейшего понятия, что там в АМК ЗП :) Я его в глаза не видела.

То, что я сделала - не является замещением pstor. Это просто отдельное хранилище, которое можно использовать под различные нужды

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

Ясно)))

 

Использовать можно только после загрузки игры (присутствует актор)

Вот хз помогу или нет, но когда актор еще не доступен, можно вызывать загрузку из bind_stalker.script коллбэк actor_binder:load(reader) при этом передавая вызываемой функции обьект биндера(что в принципе и есть актор)

 

ЗЫ может не правильно тебя понял) как я понял: ты имеешь ввиду, что можно использовать после появления db.actor а это коллбэк actor_binder:net_spawn(data)

Изменено пользователем Viнt@rь

xStream,

я так понимаю там будет не новый тип объектов, а несколько обычных? :)

Viнt@rь, нет, не помог :)

Это условие не совсем корректное, но меня устраивает. Дело в том, что мне нужна гарантия, что все серверные объекты уже зарегистрированы. Учитывая, что в онлайн первым переходит актор, то делает это он сразу как раз после этой самой регистрации, что мне и требуется.

 

ЗЫ А что там в АМК ЗП?

 

Добавлено через 1 мин.:

abramcumner, не поняла вопроса.

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

xStream

 --[[
Script:            amk_pstor.script
Create:            09.10.09 23:04 
Copyright:        AMK TEAM ©
Author:             Меченый(Стрелок)
Description:        Замена сталкеровскому пстору
    ]]
    
local amk_pstor ={["amk_files"]={}}

function Save(file,Val,value,vtype)
local save =true
if not amk_pstor[file] then
    amk_pstor[file]={}
end
if amk_pstor and amk_pstor[file] and amk_pstor[file][Val] then
    amk_pstor[file][Val]=nil
end
    amk_pstor[file][Val]={sName=utils.to_str(Val),sVal=utils.to_str(value),sType=utils.to_str(vtype)}
    for k,v in pairs(amk_pstor["amk_files"]) do
     if v and v==file then
      save=false
     end
    end
    if save==true then
        amk_pstor["amk_files"][#amk_pstor]=file
    end
end

function Load(file,name,val_if_not_exists)
local result 
if amk_pstor and amk_pstor[file] and amk_pstor[file][name] then
    result= convert(amk_pstor[file][name].sVal,amk_pstor[file][name].sType)
else
    result =val_if_not_exists
end
return result
end

function convert(str,typ)
local result=nil
if typ=="string" then
result =utils.to_str(str)
elseif typ=="number" then
result =tonumber(str)
elseif typ=="boolean" then
result=loadstring(str)
if type(result)=="boolean" then
  result=result
else
  if str=="true" then
   result=true
  elseif str=="false" then
   result=false
  else 
   result=nil
  end
end
end
return result
end

class "CAmkPstor"
function CAmkPstor:__init() end

function CAmkPstor:Save()
local name,val,file="","",nil
for k,v in pairs(amk_pstor["amk_files"]) do
  if v then
  name=v
   for k,v in pairs(amk_pstor[v]) do
   val =v
    file =io.open("gamedata\\amk\\"..name..".amk", "w")
     if file~=nil then
      local data=utils.to_str(val.sName).."*"..utils.to_str(val.sVal).."@"..utils.to_str(val.sType)
        file:write(data, "\n")
        file:close()
     end
     file=nil
   end
  end
end
file =io.open("gamedata\\amk\\amk_files.amk", "w")
for k,v in pairs(amk_pstor["amk_files"]) do
  if v then
   file:write(utils.to_str(v),"\n")
  end
end
file:close()
end

function CAmkPstor:Load()
    local file,bb=nil,""
    file =io.open("gamedata\\amk\\amk_files.amk", "r")
    if file ~= nil then
           for line in file:lines() do 
            if line~=nil then
            table.insert(amk_pstor["amk_files"],line)
            end
           end
           file:close()
        file=nil
    end
    for k,v in pairs(amk_pstor["amk_files"]) do
     if v then
     bb=v
      file=io.open("gamedata\\amk\\"..utils.to_str(v)..".amk", "r")
        for line in file:lines() do 
            if line~=nil then
             local tbl={}
             tbl=self:Dumper(line)
             Save(bb,tbl.val,tbl.value,tbl.type)
            end
        end
      file:close()
     end
    end
end

function CAmkPstor:Dumper(line)
local tbl={}
    local valu_pos =string.find(line,"*",1,true)
    local type_pos=string.find(line,"@",1,true)
    tbl.value =string.sub(line,valu_pos+1,type_pos-1)
    tbl.type=string.sub(line,type_pos+1)
    tbl.val=string.sub(line,1,valu_pos-1)
return tbl
end

 

 

 

ЗЫ по поводу актора) в принципе оно все "канает" за него, лично я использую это для загрузки сохраненных таймеров, просто это удобно в тех случаях, если нужно что-то загрузить, до появления актора(хотя это редкие случаи, просто при этом можно быть уверенным, что не будет вылета изза того, что отсутствует актор))

Изменено пользователем Viнt@rь

xStream,

(используется новый тип

объектов, описанный в конфигах, имеющие произвольную длину пакета)

Все-таки именно один объект? Или несколько, добавляемых по необходимости?

Viнt@rь, ага, поняла. Нет, у меня нет никаких файлов. Механизм попроще, и как разделять, какое хранилище для какого сейва простым способом (в амк)?

Что касается колбека, то именно на появление актора производится инициализация хранилища, раньше - нет, так как я не могу гарантировать его полную загрузку.

xStream: У Artos'a они далеко неактуальные.
Можно попросить привести аргументы/примеры неактуальности модуля нет-пакетов (m_net_utils.script).

Для справки:

1. Последняя доступная версия модуля нет-пакетов (m_net_utils.script) датирована 17.12.2011.

2. Последняя (актуальная) версия модуля всегда доступна в текущей на 'сегодня' версии SIMBION:SHOC, которую можно взять на сайте мода.

3. На этом форуме был выложен линк на версию от 27.10.20011 (см. #3067), которая и не сильно "устарела" и до сих пор доступна.

4. Модуль нет пакетов (m_net_utils.script) совместим со всеми версиями игры/патчей (ТЧ/ЧН/ЗП), начиная с 1.0006 и далее.

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

abramcumner, увидишь, все просто, но достаточно эффективно. ;)

 

 

Добавлено через 2 мин.:

Artos, не злись! :-P Оказалось, что актуальные, ага. Только толку ноль.

Что касается совместимости: ты опять делаешь убер-пупер-мега-скрипт :) Я не поддержу дискуссию.

ЗЫ Чтобы посмотреть библиотеку пакетов, качать почти 200 метров...

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

 

и как разделять, какое хранилище для какого сейва простым способом (в амк)?

 

не совсем понял вопроса))), отвечу как понял: по идее там одно хранилище - один файл, в него то и сохраняется все, лично не пробывал как оно работает... Сама схема походу была как заготовка, так как даже не используется нигде...

Изменено пользователем Viнt@rь

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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