Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском по разделу, ответ на него, вероятно, уже есть.
Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода.
Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа).
Благодарность выражаем в личке или же ставим плюсик в историю репутации. Подобные посты будут удаляться.
Забудьте все мои прошлые вопросы, я поковырялся и ели как-то их решил.
У меня только один остался: как через скрипт запретить игроку открывать рюкзак и запретить игроку использовать ячейки быстрого доступа, а потом опять разрешить ему это делать. Нигде не могу найти такие функции. Пробовал уже с disable_ui, но там забирают управление у игрока, а мне нужно чтобы он мог спокойно ходить.
Выручайте!
Сообщение отредактировал VOVASIKVAIS - Воскресенье, 05.01.2020, 19:28
molodoy_chelovek, Это не работает. Так получается, что не забирается управление у игрока и он спокойно может открывать рюкзак и использовать ячейки. Уже пробовал так
Сообщение отредактировал VOVASIKVAIS - Воскресенье, 05.01.2020, 19:58
VOVASIKVAIS, не знаю есть ли еще какие-то варианты, но можно на время отвязать кнопку которая отвечает за вызов инвентаря
Цитата
get_console():execute("unbind inventory")
Но потом кнопку нужно вернуть... Hozar_2002 недавно делился функцией которая определяет кнопку к которой привязано действие (подробнее тут , ниже найдите его сообщение)
Добавлено (05.01.2020, 20:21) --------------------------------------------- Joni_009, вернуть где? в SDK или в Blender?
VOVASIKVAIS, Давай по порядку. Для начала понадобится функция получения текущего биндера кнопки инвентаря (Думаю полезно для тех кто переделывает под себя управление)
-- Получить биндер кнопки function GetBind(key)--(keys) get_console():execute("cfg_save") local file_path = getFS():update_path("$app_data_root$", "user.ltx") local file = io.open( file_path, "r" ) local bind = "" if file ~= nil then for line in file:lines() do if string.find(key,line) or string.find(line,key) then local tbind = string_expl(line, " ") bind = tostring(tbind[#tbind]) end end file:close() end return bind end
--! Внимание: стандартный шаблон плохо работает с "особыми" символами (например #) и разбивает строку криво function string_expl(sStr, sDiv, Mode, bNoClear) sStr = tostring(sStr) if not (sStr ~= "nil" and sStr ~= '') then return {} end --> нечего разделять local tRet = {} local sPattern = '[%w%_]+' --> дефолтный патерн (разделение по 'словам') if type(sDiv) == "string" then --> если задан сепаратор: разделяем по нему if bNoClear then --> если НЕ указано 'чистить пробелы' sPattern = '([^'..sDiv..']+)' else --> иначе с чисткой пробелов sPattern = '%s*([^'..sDiv..']+)%s*' end end --* разделяем строку по патерну if Mode == nil then --> обычный массив for sValue in sStr:gmatch(sPattern) do table.insert(tRet, sValue) end else local sTypeMode = type(Mode) if sTypeMode == "boolean" then --> таблица '[значение] = true или false' for sValue in sStr:gmatch(sPattern) do tRet[sValue] = Mode end elseif sTypeMode == "number" then --> таблица '[idx] = число или стринг' for sValue in sStr:gmatch(sPattern) do tRet[#tRet+1] = tonumber(sValue) or sValue end end end return tRet --> возвращаем таблицу end
Далее понадабятся функции сохранения \ загрузки данных
--Функции для работы с пстором (грубо говоря память игры) function memory_save (variable_name, value) xr_logic.pstor_store(db.actor, variable_name, value) end
function memory_load (variable_name, value_if_not_found) return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found) end
function memory_delite (variable_name) if db.storage[db.actor:id()].pstor[variable_name] then db.storage[db.actor:id()].pstor[variable_name] = nil end end
Ну и пишем примитивные функции блокировки разблокировки инвентаря
function block_inventory() local key = GetBind("bind inventory") -- основная кнопка инвентаря local key_sec = GetBind("bind_sec inventory") -- запасная кнопка инвентаря if key then memory_save("bind_inventory", key) -- сохроняем кнопки end if key_sec then memory_save("bind_inventory_sec", key_sec) -- сохроняем кнопки end get_console():execute("unbind inventory") get_console():execute("unbind_sec inventory") end
function unblock_inventory() local key = memory_load("bind_inventory", "kI") -- основная кнопка инвентаря local key_sec = memory_load("bind_inventory_sec", "kI")-- запасная кнопка инвентаря get_console():execute(string.format("bind_sec inventory %s", key_sec)) get_console():execute(string.format("bind inventory %s", key)) memory_delite("bind_inventory") -- чистим память memory_delite("bind_inventory_sec") -- чистим память end
Сообщение отредактировал Hozar_2002 - Воскресенье, 05.01.2020, 20:54
Так как ответа в вопроснице ЧН не последовало, продублирую проблему сюда, может, кто знает.
При компиляции спавна дефолтных ЧН-овских болот вылетает ошибка со следующим логом:
Expression : m_level_changers.empty() Function : CGameSpawnConstructor::verify_level_changers File : .\game_spawn_constructor.cpp Line : 166 Description : Some of the level changers setup incorrectly
При этом переходы на локации не трогал совсем, добавил 1 смарт_кавер на болота ЧН.
Может, в компиляторе прописал что-то не то? В нем прописываю это:
Hozar_2002, Да, это заработало. Спасибо! Я так понял, что подобное можно сделать и с кнопками быстрого доступа, ну F1, F2, F3 и F4.
Это получается что для каждой отдельной кнопки мне столько всего писать? Или можно как-то проще?
В последних двух функциях я соорудил что-то подобное, но кнопки не биндятся, а только стираются.
function block_inventory() local key = GetBind("bind inventory") -- основная кнопка инвентаря local key_sec = GetBind("bind_sec inventory") -- запасная кнопка инвентаря local key_one = GetBind("bind quick_use_1") -- основная кнопка инвентаря local key_two = GetBind("bind quick_use_2") -- основная кнопка инвентаря local key_three = GetBind("bind quick_use_3") -- основная кнопка инвентаря local key_four = GetBind("bind quick_use_4") -- основная кнопка инвентаря if key then memory_save("bind_inventory", key) -- сохроняем кнопки end if key_sec then memory_save("bind_inventory_sec", key_sec) -- сохроняем кнопки end if key_one then memory_save("bind_quick_use_1", key_one) -- сохроняем кнопки end if key_two then memory_save("bind_quick_use_2", key_two) -- сохроняем кнопки end if key_three then memory_save("bind_quick_use_3", key_three) -- сохроняем кнопки end if key_four then memory_save("bind_quick_use_4", key_four) -- сохроняем кнопки end get_console():execute("unbind inventory") get_console():execute("unbind_sec inventory") get_console():execute("unbind quick_use_1") get_console():execute("unbind quick_use_2") get_console():execute("unbind quick_use_3") get_console():execute("unbind quick_use_4") end
function unblock_inventory() local key = memory_load("bind_inventory", "kI") -- основная кнопка инвентаря local key_sec = memory_load("bind_inventory_sec", "kI")-- запасная кнопка инвентаря local key_one = memory_load("bind_quick_use_1", "kF1") -- основная кнопка инвентаря local key_two = memory_load("bind_quick_use_1", "kF2") -- основная кнопка инвентаря local key_three = memory_load("bind_quick_use_1", "kF3") -- основная кнопка инвентаря local key_four = memory_load("bind_quick_use_1", "kF4") -- основная кнопка инвентаря get_console():execute(string.format("bind_sec inventory %s", key_sec)) get_console():execute(string.format("bind inventory %s", key)) get_console():execute(string.format("bind quick_use_1 %s", key_one)) get_console():execute(string.format("bind quick_use_2 %s", key_two)) get_console():execute(string.format("bind quick_use_3 %s", key_three)) get_console():execute(string.format("bind quick_use_4 %s", key_four)) memory_delite("bind_inventory") -- чистим память memory_delite("bind_inventory_sec") -- чистим память memory_delite("bind_quick_use_1") -- чистим память memory_delite("bind_quick_use_2") -- чистим память memory_delite("bind_quick_use_3") -- чистим память memory_delite("bind_quick_use_4") -- чистим память end
Сообщение отредактировал VOVASIKVAIS - Воскресенье, 05.01.2020, 21:35
function block_quick_uses() for i=1, 4 do local key = GetBind (string.format("bind quick_use_%s", i)) memory_save(string.format("bind_quick_use_%s", i), key) -- сохроняем кнопки get_console():execute(string.format("unbind quick_use_%s", i)) end end
function unblock_quick_uses() for i=1, 4 do local key = memory_load(string.format("bind_quick_use_%s", i), string.format("kF%s",i)) -- загружаем get_console():execute(string.format("bind quick_use_%s %s", i, key)) memory_delite(string.format("bind_quick_use_%s", i)) -- чистим память end end
local key_two = memory_load("bind_quick_use_1", "kF2") -- основная кнопка инвентаря local key_three = memory_load("bind_quick_use_1", "kF3") -- основная кнопка инвентаря local key_four = memory_load("bind_quick_use_1", "kF4") -- основная кнопка инвентаря
очепятка у вас
Сообщение отредактировал Hozar_2002 - Воскресенье, 05.01.2020, 21:40
Hozar_2002, Да, ваш вариант проще. Но появился баг! В моём варианте тоже этот баг есть. После того как стираются кнопки, почему то у F4 становится F1 а все предыдущие стираются, а потом когда они все восстанавливаются, то при нажатии F1 активируется F4. Что-то странно!
ОЙ извините, это мои кривые руки. Всё работает нормально!
А как тогда быть с дополнительными кнопками быстрого использования?
Сообщение отредактировал VOVASIKVAIS - Воскресенье, 05.01.2020, 21:50