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

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


Malandrinus

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

Возможно не в тему пишу(не в тему обсуждения), но все же хотел узнать, xStream, согласен с тобой, возможно АМК 2.0, как ты выразилась, "говно", но все же скрипты там довольно интересные, вот собственно по этому и спрашиваю, если писать скрипты-схемы организовывая их классами(на подобии АМК 2.0) это влияет на производительность и тп, если влияет, то чем, и как именно? Заранее спасибо...

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

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


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

Согласен с Gun12:

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

К тому же, как только я покопался в скриптах написаных Refresh-ом, для АМК 2.0, мне сразу понравилось как выглядят скрипты, как-то меньше "хлама", и "приятней" на глаз, да и лишняя практика еще никому не мешала... Ведь рано или поздно, скорей всего, что именно такой вид написания скриптов/схем может пригодиться, пусть даже не в моддинге...

 

И поддерживаю Artos, особенно с:

Ну а кто-то и продолжая "изобретать велосипед" - все же и познает собственно что-же такое велосипед и глядишь ... мопед изобретет. ;-)

 

:offtopic:

З.Ы. Artos и xStream, спасибо вам больше за придуманные и написанные вами схемы/скрипты, ибо именно по ним начинал открывать для себя LUA. Особенно хочу отметить мое постоянное поражение, как Artos умудрился совместить столько модов и скриптовых фитч в одну модификацию... Причем, что багов почти нет, а если и случаются, то они не критичные, да и если надо посмотреть пример какой-то схемы, то лучше чем примеры модулей из SIMBION`a просто не найти... ;). Это единственная солянка(не в обиду сказано), которую я люблю(касается только мода))) и уважаю, вместе с ее автором...

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

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


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

Мой пост был адресован не только xStream...

Что касается:

... Я ругаю то, как это используют. Вон, хвалят АМК 2.0 за "приятность для глаз". А по сути хлам как был, так и остался. Просто оно все аккуратнее смотрится из-за организации в виде классов. Но по сути это все то же процедурное программирование. Скажем так - забивание микроскопом гвоздей, использование не по назначению.

Просто подобный подход я видела не в одном языке и руки бы поотрывала а такое. Не знаете ООП - не трогайте классы.

1. Вы ведь сами говорили что в LUA скриптах сталкера некогда небыло ООП

2. За что руки то отрывать? Если в данном случае, по вашим же словам, организовывание функций в классы, ни на что не влияет ;)

Лично мне нравится то, что организовывание функций в классы, делает код внутри скрипта "приятней и красивей"(ИМХО), собственно потому и спрашивал, влияет ли это на что-то...

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


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

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

 

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

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

 

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

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

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


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

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

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

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

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


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

Ясно)))

 

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

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

 

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

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

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


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

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ь

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


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

 

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

 

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

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

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


Ссылка на сообщение
Если делается мод, то он затачивается под определенную версию или диапазон.

Это можно говорить про глобальную модификацию, с сюжетом и тп, как я понял, у Artos`a SIMBION рассчитан на "стандартный" контент игры, именно потому он и делает кроссплатформную модификацию... Потому это нельзя осуждать, хотя с другой стороны, можно и запутаться в лишних строках и тп... Это уже как посмотреть и для чего использовать...

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

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


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

xStream, я с тобой полностью согласен, но раз уж пошла речь о коде Симбиона, то

1. каждый скрипт, примерно на половину от своего "веса" заполнен коментами

2. так как все распихано по модулям, то код вполне легко читаем, достаточно посидеть примерно часик, что бы ознакомится с содержимым всех скриптов и схемой их работы, и вуаля все понимается на ходу и с лету

 

Ой ли, "стандартный" ли? Ты хочешь сказать, у него так, мелочевка всякая?
я не хочу сказать этого, и даже не имел такого ввиду... Изменено пользователем Viнt@rь

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


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

:offtopic:

Ладно, уважаемые, давайте не будем сориться, ведь сдесь собрались не по этому делу, а по "Язык Lua. Общие вопросы программирования."

 

и если уж началась дискуссия вокруг методов/наработок авторов, то лучше не сориться, а с уважением друг к другу обсудить +/- одного и +/- другого методов... указать на недочеты и тп, при этом адекватно воспринимать критику в свою сторону...

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

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


Ссылка на сообщение
*Shoker*,
...необходимость наличия актёра в онлайне...
Поступи как я предлагал xStream и необходимость наличия ГГ отпадет :ny_thumbsup:

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


Ссылка на сообщение
xStream, в принципе - ты права, но ведь могут быть и исключения, в смысле мб понадобиться загрузить что-то, когда актора еще нет, чем вешать загрузку всего на спавн актора, почему-то нет-пакеты для актора грузятся раньше самого актора(в смысле коллбэк actor_binder:load(reader) вызывается раньше спавна актора), это уже как посмотреть, ты пишешь как тебе удобно... а если руки не кривые, то тот, кому надо грузить все, до того, как актор заспавнится, сможет сделать для себя загрузку через этот коллбэк... Изменено пользователем Viнt@rь

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


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

Artos, я и не говорю ничего по пстору, в этом я полностью согласен с xStream, я говорю о обязательности наличия актора...

А по поводу пстора, конкретно: куда сохраняется все из него? в сейв? есть ли у него ограничения? и как замена стандартного ПЫС-овского пстора повлияет на игру

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

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


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

Artos, смотри как получается, если вызывать загрузку все и вся из пстора актора одновременно с загрузкой нет-пакетов(а это актора еще нет), мы просто будем передавать обьект биндера, а именно bind_stalker.script(обьектом которого и есть тот самый актор) при спавне актора вызывается всеголишь другой коллбэк, а почти вся загрузка, происходит при загрузке нет-пакетов...

 

P.S. как я понял, ты даже не берешь Ид актора функцией, а сам назначаешь ему Ид...

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

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


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

xStream, Итак, по поводу таймеров)) в принципе я похожими и пользуюсь взял из АМК 2.0 лаунчер(наверно я тебя достал этим АМК, ну извини если что))) я не специально) и немного его доработал(в плане сейва/загрузки функций, стандартное не работало...)

[spoiler=Вот код, если интересно:)]

--[[ ----------------------------------------------------------------------------------------------- 
File       : _s_launcher.script
Description: лаунчер функциий
Copyright  : 2011 © Spectrum project
Author     : © AMK Team 2.0(2009), Refresh
Last edit  : 23.12.2011 (Viнt@rь)
--]] -----------------------------------------------------------------------------------------------
--* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-- *                                CSpLauncher                                  *
--* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
class "CSpLauncher"
function CSpLauncher:__init()
    self.aLauncher = {}
    self.iTblSize  = 0
end

--[[
--    SaveData(oActor)
--    Сохранение игры. Сохранение переменных.
--    @param    object    oActor    Обьект актера.
--]]
function CSpLauncher:SaveData(oActor)
    local fId = 0
    for sName, aFunc in pairs(self.aLauncher) do
        local iVal = aFunc.oTime:diffSec(game.get_game_time())
        fId = fId + 1
        
        WriteVar("sName"..fId,sName)
        WriteVar("sValue"..fId,aFunc.sValue)
        WriteVar("iVal"..fId,iVal)
    end
    WriteVar("cFuncs",fId)
end

--[[
--    LoadData(oActor)
--    Загрузка игры. Загрузка сохраненных переменных.
--    @param    object    oActor    Обьект актера.
--]]    
function CSpLauncher:LoadData(oActor)
    local cFuncs = xr_logic.pstor_retrieve(oActor, "cFuncs", nil)
    if cFuncs then
        for i=1,cFuncs do
            local sName = ReadVar("sName"..i, nil, oActor)
            local sValue = ReadVar("sValue"..i, nil, oActor)
            local iVal = ReadVar("iVal"..i, nil, oActor)
        
            self:AddFunc(sName,sValue,iVal)
            
            DelVar("sName"..i,oActor)
            DelVar("sValue"..i,oActor)
            DelVar("iVal"..i,oActor)
        end
    end
end

--[[
--    UpdateFuncs()
--    Апдейт на вызов функций.
--]]    
function CSpLauncher:UpdateFuncs()
    if self.iTblSize < 1 then return end
    
    for sName, aFnc in pairs(self.aLauncher) do
        if aFnc.oTime:diffSec(game.get_game_time()) <= 0 then
            _log("CSpLauncher:UpdateFuncs:=Func:[%s] diffSec(%s):", sName, aFnc.oTime:diffSec(game.get_game_time()))
            local oFunction = loadstring(aFnc.sValue)
            self:DelFunc(sName)
            oFunction() --exemple    
        end
    end    
end

--[[
--    AddFunc(sName, sValue, iSeconds)
--    Добавление функции в лаунчер.
--    @param    string    sName    Метка функции, произвольное название.     
--    @param    string    sValue    Строка запуска функции.
--    @param    integer    iSeconds    Время для таймера, в игровых секундах.    
--]]    
function CSpLauncher:AddFunc(sName, sValue, iSeconds)
    if iSeconds == nil then
        iSeconds = 0
    end
    
    if not self.aLauncher[sName] then
        self.aLauncher[sName] = {}
        self.aLauncher[sName].sValue = sValue
    
        local oIdle = game.CTime()
        oIdle:setHMSms( 0, 0, iSeconds, 0)
        self.aLauncher[sName].oTime = game.get_game_time() + oIdle
    
        self.iTblSize = self.iTblSize + 1
    end
end

--[[
--    DelFunc(sName)
--    Удаление функции из лаунчера.
--    @param    string    sName    Метка функции, произвольное название.             
--]]    
function CSpLauncher:DelFunc(sName)
    if self.aLauncher[sName] then        
        self.aLauncher[sName] = nil
        self.iTblSize = self.iTblSize - 1
    end
end

пример использования:
_s.oSpLauncher:AddFunc("TimerSleep", "_s.oSpSleep:TimerNeedSleep()", 360)

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

и схема требует доработки:

1. в плане сейва/загрузки функций(не сейвить для данных функции(время название и тп) отдельную переменную), вот для этого я и буду использовать твой метод универсального хранилища данных

2. в плане апдейта, так как видно не вооруженным глазом, что цикл "голый", что грузит игру...

 

 

 

ЗЫ пока только покопал по теме таймеров, сейчас буду дальше разбираться :)

 

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

По поводу универсального хранилища, с одной стороны интересно, а с другой стороны, Artos походу прав...

 

ЗЫЫ а че все молчат?:)

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

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


Ссылка на сообщение
xStream, по поводу классов - да ты права, в той схеме, что я выложил, он вообще не нужен, но! это ведь никак не влияет на игру или работу скрипта, да и к тому же лично мне, как-то приятней видеть все в под одним классом, нежели видеть "голые функции", пусть даже каждая схема - отдельный скрипт... Такие схемы бросаются в глаза как сборник функций..., а объединяя эти функции под одним классом, сразу становится видно какие функции связаны между собой, ну это мое ИМХО, это уже кому как... Я так привык, мне так удобней, потому и пользуюсь таким методом, но, еще раз повторюсь, я с тобой полностью согласен - класс здесь не нужен... Потому я и спрашивал влияет ли такой метод на что то или нет...

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


Ссылка на сообщение
Gun12, а что, если несколько таймеров запущено одновременно? Изменено пользователем Viнt@rь

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


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

а если запущено 2 таймера в одно и то же время и одинаковой частотой апдейта и с одинаковым временем срабатывания?(вообще конечно, такие случаи редкость или легче создать 1 функцию и запихнуть туда все, что надо, дабы не создавать кучу таймеров, но всетаки...) первый таймер, по идее, проиграется во время, а второй с опозданием...

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

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


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

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