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

Язык 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*

Можно просто 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ь
Ссылка на комментарий

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 пользователей

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