UnLoaded 313 Опубликовано 11 Июля 2015 Поделиться Опубликовано 11 Июля 2015 @dsh В модулях для работы с нет-пакетом(от Artos и АМКшный) есть ф-ции "передергивания" объекта он\офф\он-лайн энное кол-во раз, для того чтоб применились правки в нет-пакете. Но этот вариант сработает только для объектов, которые можно "передернуть" он\офф\он-лайн. К примеру для оружия в руках(и соответственно в инвентаре) актера такое не прокатит, т.к. актера в офф-лайн не увести. Тут можно пробовать трансфер от актера куда-то, там манипуляции с объектом и его нет-пакетом, трансфер обратно актеру - ничем не красивее того, что Вы уже проделываете... P.S. Хотя, может уже есть более адекватные решения, сам бы не прочь узнать. Ссылка на комментарий
dsh 3 824 Опубликовано 11 Июля 2015 Поделиться Опубликовано 11 Июля 2015 @UnLoaded, эксперименты показывают, что с x-ray extensions прицел можно нацепить визуально: wpn:set_wpn_int( 936, 1 ) Прицел на оружии появляется моментально. Вот только прицеливание осталось через мушку. В том смысле, что весь экран заполняет приближенная модель оптического прицела, вместо того, что бы смотреть через нее. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
RayTwitty 492 Опубликовано 11 Июля 2015 Поделиться Опубликовано 11 Июля 2015 Прицел на оружии появляется моментально. Вот только прицеливание осталось через мушку. В том смысле, что весь экран заполняет приближенная модель оптического прицела, вместо того, что бы смотреть через нее. Потому что вся инфа о параметрах прицела хранится в серверной части - меняя флаг прицела, меняется лишь видимость костей. Ссылка на комментарий
Nazgool 250 Опубликовано 12 Июля 2015 Поделиться Опубликовано 12 Июля 2015 (изменено) Только обратил внимание. У всех такая дикая функция в treasure_manager.script ? function parse_spawns(line) if line == nil then return {} end --' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini local t = se_respawn.parse_names(line) local n = table.getn(t) local ret_table = {} local k = 1 while k <= n do local spawn = {} spawn.section = t[k] -- Проверяем что это не последняя запись if t[k+1] ~= nil then local p = tonumber(t[k+1]) -- проверяем что вторым числом задана вероятность, а не другая секция спавну if p then -- забиваем число spawn.prob = p k = k + 2 else -- забиваем дефолт 1 spawn.prob = 1 k = k + 1 end else spawn.prob = 1 k = k + 1 end table.insert(ret_table, spawn) end return ret_table end Я её изменил, если кому нужно. Изменено 12 Июля 2015 пользователем Nazgool Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 12 Июля 2015 Поделиться Опубликовано 12 Июля 2015 (изменено) Не у всех. У меня ее вообще нет. Ни в treasure_manager, ни в se_respawn, ни в xr_box, ни даже в smart_terrain. В прошлом году, кстати, ссылку выкладывал. http://www.amk-team.ru/forum/index.php?showtopic=13078&p=902039 И ты же сам там вроде опечатку в древней нафиг ни кому не нужной ветке ветке указывал. Изменено 12 Июля 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 12 Июля 2015 Поделиться Опубликовано 12 Июля 2015 (изменено) @Dennis_Chikin, t, n = {}, 0 for d in string_gfind( s, "([%w_%-.\\]+)[%p%s]*" ) do -- выделяем то, что между запятыми/пробелами --log( "info", "spawn_items, d: %s", d ) if k then -- если уже прочитан ключ, возможно, сейчас считали число --log( "info", "spawn_items, exist k: %s", k ) n = n + 1 -- но в таблицу что-то добавим по-любому v = tonumber( d ) if v then -- таки число t[n] = { k, v } -- кладем в таблицу k = false -- следующее, что получим - точно key else -- если это не число, значит - key t[n] = { k, 1 } -- а key уже есть, берем дефолт k = d -- полученное сохраняем как новый key end else k = d -- ключа нет, значит именно его сейчас и получили --log( "info", "spawn_items, new k: %s", k ) end end if k then n = n + 1; t[n] = { k, 1 } end Всё это сложно выглядит.Я похожее сделал как-то так local t = {} for w in line:gmatch('[^%,%s]+') do local x = tonumber(w) if x then t[#t].prob = x else t[#t+1] = {section = w, prob = 1} end end И ты же сам там вроде... Если бы я всё помнил, то уже с ума сошел наверное от забитой оперативы Изменено 12 Июля 2015 пользователем Nazgool 1 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 12 Июля 2015 Поделиться Опубликовано 12 Июля 2015 (изменено) По-моему, у тебя здесь получается что-то сильно не то... Во-первых, зачем-то опять к старому тормозному формату таблицы тащишь, во-вторых - двойная перезапись с взятиями размера. Задумчиво будет... Изменено 12 Июля 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 12 Июля 2015 Поделиться Опубликовано 12 Июля 2015 (изменено) Не медленнее чем у тебя. Даже быстрее. Т.е. для движка разницы нет. А теперь спроси у людей. Для них есть разница? зачем-то опять к старому тормозному формату таблицы Таблицы это основа языка. Скорость работы с ними - первый из плюсов lua. Не заслуженное обвинение. Изменено 12 Июля 2015 пользователем Nazgool Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 12 Июля 2015 Поделиться Опубликовано 12 Июля 2015 Охохо... Опять мерить надо. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
vampirnik77 121 Опубликовано 15 Июля 2015 Поделиться Опубликовано 15 Июля 2015 (изменено) Насколько я знаю таблицу pstor'ом не записать, как тогда возможно записать ее в сохранение? Заранее спасибо. http://www.amk-team.ru/forum/index.php?showtopic=13078&p=897169 dc Изменено 15 Июля 2015 пользователем Dennis_Chikin Официальная страница проекта Neof-One Crew Ссылка на комментарий
Nazgool 250 Опубликовано 15 Июля 2015 Поделиться Опубликовано 15 Июля 2015 @vampirnik77, Вот из OGSE -- serialize table to string reprezentation -- in: table|nil|string|number|boolean, nil -- out: string|nil, boolean(error) function table.serialize(x, recur) local t = type(x) recur = recur or {} if t == "nil" then return "nil" elseif t == "string" then return string.format("%q", x) elseif t == "number" then return tostring(x), false elseif t == "boolean" then return x and "true" or "false" elseif getmetatable(x) then -- Can not serialize a table that has a metatable associated with it. return nil, true elseif t == "table" then if recur[x] then -- Can not serialize recursive tables. return nil, true end recur[x] = true if not next(x) then return "{}" end -- need to check if table is empty local s, key, val = "{" for k, v in pairs(x) do key, err = table.serialize(k, recur) if err then --if something srong with table's keys return nil, true end val, err = table.serialize(v, recur) if err then --if something srong with table's values return nil, true end s = s .. "[" .. key .. "]" .. "=" .. val .. "," end return s:sub(0, s:len() - 1) .. "}" end -- Can not serialize value of passed type return nil, true end --unserialize table from string function table.unserialize(str) if type(str)~='string' or str=='' then return {} end return loadstring("return " .. str)() or {} end Как работать local str = table.serialize(твоя_таблица) -- Сохраняешь строку 'str' в pstor. ... local t = table.unserialize(тут_строка_из_pstor-а) 2 Ссылка на комментарий
AlexLuzifer 0 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 Вопрос легенький для ЗП: Есть два файла пусть будут им названия: 1 - show_time.script, 2 - capture_keys.script. В первом написан скрипт для показа времени при нажатии на кнопку, а во-втором отлов клавиш. Где и как указать какой файл что бы скрипт работал. Например что бы работал второй скрипт его надо добавить в bind_stalker.script. actor_binder:update(delta). Первый скрипт не может работать без второго, а второй без первого может. P.S. Если не понятно, то попробую еще раз объяснить, но более ясней! Ссылка на комментарий
UnLoaded 313 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 Где и как указать какой файл что бы скрипт работал Если второй файл отлавливает нажатие клавиш, то в той самой ф-ции, которая эти нажатия ловит, надо вызывать ф-цию из первого файла, которая будет выводить что-то на худ. Ссылка на комментарий
Viнt@rь 50 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 (изменено) Например что бы работал второй скрипт его надо добавить в bind_stalker.script. actor_binder:update(delta). Для начала посоветую воспользоваться хотя бы X-Ray extentions, там есть правка, которая добавляет новый метод для биндера актора, в который передается текущая нажатая на клавиатуре клавиша. А как это сделать? ну например вот так: if key == DIK_keys.DIK_NUMPAD1 then _s_options.CSpOptions():ShowDialog(true) end @vampirnik77, Можно еще так: Код сохраняет все, что ему дашь, кроме метатаблиц... А так, строки, числа, булева значения, таблицы с под таблицами... все сохраняет. storage = {} local type2marker = { ['boolean'] = 1, ['number'] = 2, ['string'] = 3, ['table'] = 4 } function se_custom_storage:STATE_Write(packet) cse_alife_dynamic_object.STATE_Write(self, packet) event("StorageSave"):trigger({packet = packet}) _log_db("-Save:") if next(storage) then for k, v in pairs(storage) do if v ~= nil then packet:w_stringZ(k) _log_db("Key:[%s]",tostring(k)) SaveValue = function(Value) _log_db("Value:[%s]",tostring(Value)) local tv = type(Value) if type2marker[tv] then packet:w_u8(type2marker[tv]) if tv == 'string' then packet:w_stringZ(Value) elseif tv == 'boolean' then packet:w_bool(Value) elseif tv == 'number' then packet:w_float(Value) elseif tv == 'table' then local iTblSize = table.size(Value) _log_db("size = [%s]",iTblSize) packet:w_u8(iTblSize) if iTblSize > 0 then packet:w_bool(table.islist(Value)) if table.islist(Value) then for i = 1, iTblSize do SaveValue(Value[i]) end else for kk, vv in pairs(Value) do _log_db("Key:[%s]",kk) packet:w_stringZ(kk) SaveValue(vv) end end end end else _log_db("~Not savable type:=[%s]",tv) end end SaveValue(v) end end end _log_db("-Saved") end function GetTblSize(tTbl) if IsTblList(tTbl) then return #tTbl end local iSize = 0 for k, v in pairs(tTbl) do iSize = iSize + 1 end return iSize end function IsTblList(tTbl) local bList = false local iCntIdx = #tTbl if iCntIdx > 0 then if next(tTbl) == 1 and not next(tTbl,iCntIdx) then for i=2,iCntIdx-1 do if tTbl[i] == nil then return false end end bList = true end end return bList end if not table.size then table.size = this.GetTblSize end if not table.islist then table.islist = this.IsTblList end Выше - это вырезанные куски из моих наработок... _log_db - мои функции отладки, можно удалить event("StorageSave"):trigger({packet = packet}) - тоже можно удалить, это создание события... влом кароче объяснять что это) Или можно выполнить сериализацию, как это сделали огсе, правда в пстор тогда будет сохраняться больше(большая длина байт), так как в их случае, это сплошная строка, где даже bool представлено в виде строки(примерно 5 байт для true), а не одного байта(ну двух байт, так как еще идет запоминание маркера сохраняемого типа), как в случае с моим кодом. Изменено 22 Июля 2015 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
AlexLuzifer 0 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 @Viнt@rь, Спасибо, но проблему уже решил, а можно поподробней что за X-Ray extentions? И еще вопрос можно замутить с кнопкой (любой, не забинденой) как с фонарем, т.е. нажал на L - фонарь горит, еще раз нажал - фонарь не горит! И еще вот есть функция: if key == DIK_keys.DIK_NUMPAD1 then _s_options.CSpOptions():ShowDialog(true) end Я ее уже видел в файле ui_main_menu.script, ее можно использовать в самой игре как с тем же самым фонарем? или нужен скрипт отлов клавиш? @UnLoaded, Спасибо так и сделал) А я голову ломал как делать, на самом деле все просто) Ссылка на комментарий
Viнt@rь 50 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 (изменено) И еще вот есть функция: ну, для начала, это не функция, а конструкция... Я ее уже видел в файле ui_main_menu.script, ее можно использовать в самой игре как с тем же самым фонарем? или нужен скрипт отлов клавиш? Вот только не путай, ui_main_menu.script - здесь класс окна, и в класс окна передается нажатая клавиша всегда... В отличии времени, когда ты в игре управляешь актором. X-Ray extensions как раз таки реализует отлов клавиш(никакой скрипт отлова не нужен), во время управления актором... Вот еще чего, через скрипты нормально кнопку на команду(действие) ты не забиндишь(как в опциях), то есть, какую в скриптах написал, на такую и нужно будет тыцать... http://www.amk-team.ru/forum/index.php?showtopic=10538 - тема совсем по соседству с этой... Изменено 22 Июля 2015 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
AlexLuzifer 0 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 @Viнt@rь, А с фонарем как быть? Например: function dik_k() if dik_k ~= nil then get_hud():AddCustomStatic("test", true) get_hud():GetCustomStatic("test"):wnd():TextControl():SetTextST(text) elseif dik_k ~= nil and get_hud():AddCustomStatic("test", true) then get_hud():RemoveCustomStatic("test") end end Типа при нажатии первый раз кнопки идет добавление статика и выводит его на экран, при втором нажатии проверяется если есть статик то удаляется статис. Блин запутано все получилось. Я уже который день пытаюсь сделать все как надо не получается! И вообще dik_k ~= nil Я не понимаю что это, но так он работает! P.S. Функцию надо учитывать со скриптом отловлей клавиш от Charsi(по крайней мере это имя было написано на сталкерине). Потом поставлю этот экстеншенс. Ссылка на комментарий
RayTwitty 492 Опубликовано 22 Июля 2015 Поделиться Опубликовано 22 Июля 2015 (изменено) Функцию надо учитывать со скриптом отловлей клавиш от Charsi(по крайней мере это имя было написано на сталкерине). Выкинь этот костыль и поставь xray-ex, как советовали. После чего, тебе остается: 1) добавить колбек на нажатие клавиши в bind_stalker 2) вызвать из этого колбека свою функцию 3) ??? 4) PROFIT! З.Ы. http://www.amk-team.ru/forum/index.php?showtopic=10538&p=832354 внизу - как добавить колбек в ЗП. Изменено 22 Июля 2015 пользователем Shadows Ссылка на комментарий
AlexLuzifer 0 Опубликовано 23 Июля 2015 Поделиться Опубликовано 23 Июля 2015 (изменено) , Ну все поставил экстеншенс)) Вообщем вопрос у меня такой: Допустим есть скрипт со временем, при нажатии на кнопку (английскую К) время появляется на худе как статик. Но как сделать так что бы при нажатии на эту же кнопку время убиралось?? Это как с фонариком, нажал на L, фонарь включился, нажал еще раз он выключился! Вот что меня интересует.Я не пойму, а в ЗП нету отловли отпускания и удержания?? Изменено 23 Июля 2015 пользователем AlexLuzifer Ссылка на комментарий
UnLoaded 313 Опубликовано 23 Июля 2015 Поделиться Опубликовано 23 Июля 2015 Я не пойму, а в ЗП нету отловли отпускания и удержания?? Ни в одном из оригинальных движков(ТЧ\ЧН\ЗП) нет коллбэка на действия с клавиатурой. Но как сделать так что бы при нажатии на эту же кнопку время убиралось? Ну так в ф-ции, которая вызывается у тебя по нажатию клавиши, сделать проверку состояния отображения времени: if not get_hud():GetCustomStatic("твой_статик_отображения_времени") then --- если на худе нет статика, то создаем его -- get_hud():AddCustomStatic("твой_статик_отображения_времени", true) else --- иначе - удаляем get_hud():RemoveCustomStatic("твой_статик_отображения_времени") end это общая конструкция, которую тебе надо дополнить необходимым содержанием. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти