Viнt@rь 50 Опубликовано 1 Января 2012 (изменено) Возможно не в тему пишу(не в тему обсуждения), но все же хотел узнать, xStream, согласен с тобой, возможно АМК 2.0, как ты выразилась, "говно", но все же скрипты там довольно интересные, вот собственно по этому и спрашиваю, если писать скрипты-схемы организовывая их классами(на подобии АМК 2.0) это влияет на производительность и тп, если влияет, то чем, и как именно? Заранее спасибо... Изменено 1 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 1 Января 2012 (изменено) Согласен с Gun12: Не знаю кому как, а мне лишняя тренировка в создании метатаблиц, методов и т.д. никогда не помешает.... К тому же, как только я покопался в скриптах написаных Refresh-ом, для АМК 2.0, мне сразу понравилось как выглядят скрипты, как-то меньше "хлама", и "приятней" на глаз, да и лишняя практика еще никому не мешала... Ведь рано или поздно, скорей всего, что именно такой вид написания скриптов/схем может пригодиться, пусть даже не в моддинге... И поддерживаю Artos, особенно с: Ну а кто-то и продолжая "изобретать велосипед" - все же и познает собственно что-же такое велосипед и глядишь ... мопед изобретет. ;-) З.Ы. Artos и xStream, спасибо вам больше за придуманные и написанные вами схемы/скрипты, ибо именно по ним начинал открывать для себя LUA. Особенно хочу отметить мое постоянное поражение, как Artos умудрился совместить столько модов и скриптовых фитч в одну модификацию... Причем, что багов почти нет, а если и случаются, то они не критичные, да и если надо посмотреть пример какой-то схемы, то лучше чем примеры модулей из SIMBION`a просто не найти... . Это единственная солянка(не в обиду сказано), которую я люблю(касается только мода))) и уважаю, вместе с ее автором... Изменено 1 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 2 Января 2012 Мой пост был адресован не только xStream... Что касается: ... Я ругаю то, как это используют. Вон, хвалят АМК 2.0 за "приятность для глаз". А по сути хлам как был, так и остался. Просто оно все аккуратнее смотрится из-за организации в виде классов. Но по сути это все то же процедурное программирование. Скажем так - забивание микроскопом гвоздей, использование не по назначению. Просто подобный подход я видела не в одном языке и руки бы поотрывала а такое. Не знаете ООП - не трогайте классы. 1. Вы ведь сами говорили что в LUA скриптах сталкера некогда небыло ООП 2. За что руки то отрывать? Если в данном случае, по вашим же словам, организовывание функций в классы, ни на что не влияет Лично мне нравится то, что организовывание функций в классы, делает код внутри скрипта "приятней и красивей"(ИМХО), собственно потому и спрашивал, влияет ли это на что-то... GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) xStream, огромное спасибо за нет пакеты)), вот только на врядли знающие найдут им применение))), а многие даже не разберутся как ними пользоваться) Меня заинтересовало: Так же на подходе универсальное хранилище данных (а-ля доисторический pstor) и (ахахахаха, барабанная дробь)... - моя реализация сохраняемых таймеров с использованием этого самого хранилища. а именно универсальное хранилище - жду)) Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) xStream, по поводу нового универсального хранилища, посмущался спросить да бы не "задеть" тебя, но раз уж спросили, хотел бы узнать, будет как у АМК ЗП?))) и вопрос: как тогда замена "стандартного" пстора повлияет на игру? Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) Ясно))) Использовать можно только после загрузки игры (присутствует актор) Вот хз помогу или нет, но когда актор еще не доступен, можно вызывать загрузку из bind_stalker.script коллбэк actor_binder:load(reader) при этом передавая вызываемой функции обьект биндера(что в принципе и есть актор) ЗЫ может не правильно тебя понял) как я понял: ты имеешь ввиду, что можно использовать после появления db.actor а это коллбэк actor_binder:net_spawn(data) Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) 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 ЗЫ по поводу актора) в принципе оно все "канает" за него, лично я использую это для загрузки сохраненных таймеров, просто это удобно в тех случаях, если нужно что-то загрузить, до появления актора(хотя это редкие случаи, просто при этом можно быть уверенным, что не будет вылета изза того, что отсутствует актор)) Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) и как разделять, какое хранилище для какого сейва простым способом (в амк)? не совсем понял вопроса))), отвечу как понял: по идее там одно хранилище - один файл, в него то и сохраняется все, лично не пробывал как оно работает... Сама схема походу была как заготовка, так как даже не используется нигде... Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) Если делается мод, то он затачивается под определенную версию или диапазон. Это можно говорить про глобальную модификацию, с сюжетом и тп, как я понял, у Artos`a SIMBION рассчитан на "стандартный" контент игры, именно потому он и делает кроссплатформную модификацию... Потому это нельзя осуждать, хотя с другой стороны, можно и запутаться в лишних строках и тп... Это уже как посмотреть и для чего использовать... Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) xStream, я с тобой полностью согласен, но раз уж пошла речь о коде Симбиона, то 1. каждый скрипт, примерно на половину от своего "веса" заполнен коментами 2. так как все распихано по модулям, то код вполне легко читаем, достаточно посидеть примерно часик, что бы ознакомится с содержимым всех скриптов и схемой их работы, и вуаля все понимается на ходу и с лету Ой ли, "стандартный" ли? Ты хочешь сказать, у него так, мелочевка всякая? я не хочу сказать этого, и даже не имел такого ввиду... Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 7 Января 2012 (изменено) Ладно, уважаемые, давайте не будем сориться, ведь сдесь собрались не по этому делу, а по "Язык Lua. Общие вопросы программирования." и если уж началась дискуссия вокруг методов/наработок авторов, то лучше не сориться, а с уважением друг к другу обсудить +/- одного и +/- другого методов... указать на недочеты и тп, при этом адекватно воспринимать критику в свою сторону... Изменено 7 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 *Shoker*, ...необходимость наличия актёра в онлайне... Поступи как я предлагал xStream и необходимость наличия ГГ отпадет :ny_thumbsup: GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 (изменено) xStream, в принципе - ты права, но ведь могут быть и исключения, в смысле мб понадобиться загрузить что-то, когда актора еще нет, чем вешать загрузку всего на спавн актора, почему-то нет-пакеты для актора грузятся раньше самого актора(в смысле коллбэк actor_binder:load(reader) вызывается раньше спавна актора), это уже как посмотреть, ты пишешь как тебе удобно... а если руки не кривые, то тот, кому надо грузить все, до того, как актор заспавнится, сможет сделать для себя загрузку через этот коллбэк... Изменено 8 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 (изменено) Artos, я и не говорю ничего по пстору, в этом я полностью согласен с xStream, я говорю о обязательности наличия актора... А по поводу пстора, конкретно: куда сохраняется все из него? в сейв? есть ли у него ограничения? и как замена стандартного ПЫС-овского пстора повлияет на игру Изменено 8 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 (изменено) Artos, смотри как получается, если вызывать загрузку все и вся из пстора актора одновременно с загрузкой нет-пакетов(а это актора еще нет), мы просто будем передавать обьект биндера, а именно bind_stalker.script(обьектом которого и есть тот самый актор) при спавне актора вызывается всеголишь другой коллбэк, а почти вся загрузка, происходит при загрузке нет-пакетов... P.S. как я понял, ты даже не берешь Ид актора функцией, а сам назначаешь ему Ид... Изменено 8 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 xStream, спасибо, сейчас покопаемся...) Artos, спасибо за разъяснение) GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 (изменено) 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 походу прав... ЗЫЫ а че все молчат? Изменено 8 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 xStream, по поводу классов - да ты права, в той схеме, что я выложил, он вообще не нужен, но! это ведь никак не влияет на игру или работу скрипта, да и к тому же лично мне, как-то приятней видеть все в под одним классом, нежели видеть "голые функции", пусть даже каждая схема - отдельный скрипт... Такие схемы бросаются в глаза как сборник функций..., а объединяя эти функции под одним классом, сразу становится видно какие функции связаны между собой, ну это мое ИМХО, это уже кому как... Я так привык, мне так удобней, потому и пользуюсь таким методом, но, еще раз повторюсь, я с тобой полностью согласен - класс здесь не нужен... Потому я и спрашивал влияет ли такой метод на что то или нет... GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 (изменено) Gun12, а что, если несколько таймеров запущено одновременно? Изменено 8 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение
Viнt@rь 50 Опубликовано 8 Января 2012 (изменено) а если запущено 2 таймера в одно и то же время и одинаковой частотой апдейта и с одинаковым временем срабатывания?(вообще конечно, такие случаи редкость или легче создать 1 функцию и запихнуть туда все, что надо, дабы не создавать кучу таймеров, но всетаки...) первый таймер, по идее, проиграется во время, а второй с опозданием... Изменено 8 Января 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Поделиться этим сообщением Ссылка на сообщение