Kober(BRUC) 99 Опубликовано 27 Июля 2016 Добрый день. Как заполнять таблицу функцией. Например есть пустая таблица: t_tbl = {} Которую мне нужно заполнять определенными значениями. А эти значения будут появляться в переменной(например): local dd = любое_значение Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 5 Августа 2016 (изменено) Добрый день. Сделал меню: class "gui_ryukzak" (CUIScriptWnd) function gui_ryukzak:__init() super() self:InitControls() self:InitCallBacks() end function gui_ryukzak:__finalize() end function gui_ryukzak:InitControls() local xml = CScriptXmlInit() self:Init(0,0,1024,768) xml:ParseFile("ui_gui_ryukzak.xml") self.fon = xml:InitStatic("fon", self) self:Register(xml:Init3tButton("fon:button_add", self.fon), "button_add") self:Register(xml:Init3tButton("fon:button_exit", self.fon), "button_exit") self:Register(xml:Init3tButton("fon:button_open", self.fon), "button_open") self.Text_1 = xml:InitStatic("fon:Text_1", self.fon) self.Text_2 = xml:InitStatic("fon:Text_2", self.fon) self.Text_3 = xml:InitStatic("fon:Text_3", self.fon) self.global_text = xml:InitStatic("fon:global_text", self.fon) end function gui_ryukzak:InitCallBacks() self:AddCallback("button_add", ui_events.BUTTON_CLICKED, self.button_add_button_clicked, self) self:AddCallback("button_exit", ui_events.BUTTON_CLICKED, self.button_exit_button_clicked, self) self:AddCallback("button_open", ui_events.BUTTON_CLICKED, self.button_open_button_clicked, self) end Как мне открыть это меню? Знаю что как-то так: if dik == DIK_keys.DIK_Q then self:...() Так же, как мне его закрыть? Изменено 5 Августа 2016 пользователем Kober(BRUC) Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 7 Августа 2016 Есть поле в которое можно ввести текст: function start_game:name_GetText() return self.name:GetText() end Как это работает? Как мне вывести эту информацию(которая была вписана в это текстовое поле игроком) в, например, локальную переменную txt_set: local txt_set = "" Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 8 Августа 2016 Здравствуйте. Есть кнопка в меню. Точнее несколько кнопок. Как сделать что бы при нажатии одной, другие переставали работать? Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 8 Августа 2016 @naxac, спасибо. Но появилась еще проблема. Как выключить определенную кнопку? Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 10 Августа 2016 (изменено) Добрый день. Есть у меня меню. В нем есть кнопка и "static". В "static'е" есть текст который записан в .xml файле. Как мне изменить этот текст при нажатии на кнопку. Вот меню: class "test" (CUIScriptWnd) function test:__init() super() self:InitControls() self:InitCallBacks() end function test:__finalize() end function test:InitControls() local xml = CScriptXmlInit() self:Init(0,0,1024,768) xml:ParseFile("ui_test.xml") self.glb_fon = xml:InitStatic("glb_fon", self) -- Фон всего меню self:Register(xml:Init3tButton("glb_fon:button", self.glb_fon), "button") -- Кнопка self.txtt = xml:InitStatic("glb_fon:txtt", self.glb_fon) -- Текст который мне нужно изменить скриптом end function test:InitCallBacks() self:AddCallback("button", ui_events.BUTTON_CLICKED, self.button_button_clicked, self) end function test:button_button_clicked() ...("Новый текст для static, который завется txtt.") end function test:Hide() self:GetHolder():start_stop_menu(self, true) end Изменено 10 Августа 2016 пользователем HellRatz Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 10 Августа 2016 (изменено) Вот меню: local ver_gm = "" -- Не удалять! class "ver_game" (CUIScriptWnd) function ver_game:__init() super() self:InitControls() self:InitCallBacks() end function ver_game:__finalize() end function ver_game:InitControls() local xml = CScriptXmlInit() self:Init(0,0,1024,768) xml:ParseFile("ui_ver_game.xml") self.glb_fon = xml:InitStatic("glb_fon", self) -- Фон всего меню self:Register(xml:Init3tButton("glb_fon:chek", self.glb_fon), "chek") -- Проверка версии игры self:Register(xml:Init3tButton("glb_fon:exit", self.glb_fon), "exit") -- Выход self.txtt = xml:InitStatic("glb_fon:txtt", self.glb_fon) -- Текст end function ver_game:InitCallBacks() self:AddCallback("chek", ui_events.BUTTON_CLICKED, self.chek_button_clicked, self) -- каллбэк на нажатие кнопку chek self:AddCallback("exit", ui_events.BUTTON_CLICKED, self.exit_button_clicked, self) -- каллбэк на нажатие кнопку exit end function ver_game:chek_button_clicked() -- Что происходит если нажать на кнопку chek if tonumber(_G.main_menu.get_main_menu():GetGSVer()) <= 1.0004 then local ver_gm = "1.0004 или меньше" noo() elseif tonumber(_G.main_menu.get_main_menu():GetGSVer()) == 1.0005 then local ver_gm = "1.0005" noo_two() elseif tonumber(_G.main_menu.get_main_menu():GetGSVer()) == 1.0006 then local ver_gm = "1.0006" yess() end end function ver_game:exit_button_clicked() -- Что происходит если нажать на кнопку exit self:GetHolder():start_stop_menu (self.owner, true) self:GetHolder():start_stop_menu (self,true) end function ver_game:Hide() -- Выход self:GetHolder():start_stop_menu(self, true) end function noo() self.txtt:SetText("Плохо! Ваша версия игры: "..ver_gm.." Установите патч 1.0006.") end function noo_two() self.txtt:SetText("Ужасно! Ваша версия игры: "..ver_gm.." Установите патч 1.0006") end function yess() self.txtt:SetText("Отлично! Ваша версия игры: "..ver_gm) end При нажатии кнопки chek(chek_button_clicked) ловлю вылет: Expression : fatal error Function : CScriptEngine::lua_errorFile : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cppLine : 73Description :Arguments : LUA error: d:\game\soc\gamedata\scripts\ver_game.script:60: attempt to index global 'self' (a nil value) С чем это связано? Изменено 10 Августа 2016 пользователем BFG Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 10 Августа 2016 (изменено) надо убрать local, т.к. с его помощью инициализируется новая переменная, которая действует только до elseif.Даже если в начале скрипта есть:local ver_gm = ""? Я считал что если есть, то будет работать на весь код. Изменено 10 Августа 2016 пользователем Kober(BRUC) Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 18 Августа 2016 Доброе утро. Хотел узнать. Есть папка scripts в которой находятся все скрипты. И допустим мы взяли оттуда скрипт. Любой. И в любой функции вызываем другую функцию. Но только не из этого файла. А из другого. А теперь сам вопрос. Можно ли вызывать эту функцию из другого файла, который лежит не в папке scripts, а например в scripts/add? И как это делать? Или так и вызывать? Название_файла.Название_функции()? А в какой папке лежит - не важно? Главное что бы в директории scripts/... Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 18 Августа 2016 @Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет? Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 22 Октября 2016 (изменено) Добрый день. При использовании предмета в переменную сохраняется определённое значение. Но вовремя загрузки сохранения, переменная опять становится равной нулю. Как этого избежать? Сохранять значение переменной в определенный файл? Но это не иррационально. Да и негде я такого не видел. Изменено 22 Октября 2016 пользователем Kober(BRUC) 1 Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 22 Октября 2016 @AndrewMor, можно, пожалуйста, поподробнее? Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 23 Октября 2016 Как считывать параметр из секции? Пытаюсь вот так: system_ini():r_string(object:section(), "sections_name") Но что брать за object? Мне нужно открыть конкретный файл. Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 2 Ноября 2016 @AndrewMor,я не скриптер, но: Получаем размер хранилища. Выводим его в консоль. Если оно привышает определенный размер, то очищаем его. З.ы. Не пинайте если не так. 1 Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 13 Ноября 2016 Добрый день. Есть фон(background) и на нём статик(icon): xml:InitStatic("background:icon", self.background) Как мне этому статику поменять текстуру по условию при открытии этого окна? С помощью конструктора(ООП)? Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 15 Ноября 2016 @CRAZY_STALKER666, дополню пост naxac'а. А точнее содержание файла: need_update = true local belt = {} local belt_id = {} local belt_status = false local inventory_open = false local separator_spawned = false local separator = "separator" local af_idol_monolita_on_belt = false local debug = false local flag function update() if (need_update == false) or has_alife_info("paused_on_load") then return end if debug == true and belt_status == true then get_console():execute("belt_status=false") end belt_status = false -- Спавним разделяющий елемент if (separator_spawned == false) then alife():create(separator, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) separator_spawned = true if debug == true then get_console():execute("separator_spawned") end return end belt = {} belt_id = {} flag = 0 -- Сканируем инвентарь db.actor:inventory_for_each(scan_inv) -- вместо количества теперь идет проверка по иммунитетам -- remove_duplicate() check_immunities() check_idol_monolita() need_update = false -- Удаляем разделяющий елемент db.actor:inventory_for_each(del_separator) separator_spawned = false if debug == true and belt_status == false then get_console():execute("belt_status=true") end belt_status = true if debug == true then for i,k in pairs(belt) do get_console():execute(i.."="..k) end end end -- Перебор предметов инвентаря function scan_inv(item) local section = item:section() if section == separator then flag = 1 return end if flag == 1 then if slot_item(item) ~= nil then flag = 2 else insert_to_table(belt, section) belt_id[item:id()] = true end end end -- Добавление в таблицу function insert_to_table(tbl, section) if tbl[section] == nil then tbl[section] = 1 else tbl[section] = tbl[section] + 1 end end -- Удаление из таблицы function remove_from_table(tbl, section) if tbl[section] == 1 then tbl[section] = nil else tbl[section] = tbl[section] - 1 end end -- Удаление разделяющего предмета function del_separator(item) if item:section() == separator then alife():release(alife():object(item:id()), true) if debug == true then get_console():execute("separator_removed") end end end -- Определение налечия предмета в одном из слотов function slot_item(item) for i=0,12 do local obj = db.actor:item_in_slot(i) if obj and item:id() == obj:id() then return i end end return nil end -- Поднятие предмета function on_item_take(item) if item:section() == separator then return end if (inventory_open == false) then if (separator_spawned == true) then db.actor:inventory_for_each(del_separator) separator_spawned = false end need_update = true if debug == true then get_console():execute("item_take") end end end -- Выброс предмета function on_item_drop(item) if item:section() == separator then return end if (inventory_open == false) then if (separator_spawned == true) then db.actor:inventory_for_each(del_separator) separator_spawned = false end need_update = true if debug == true then get_console():execute("item_drop") end end end -- Открытие/закрытие инвентаря function on_inventory_info(info_id) if info_id == "ui_inventory" then inventory_open = true if debug == true then get_console():execute("inventory_open") end elseif info_id == "ui_inventory_hide" then inventory_open = false need_update = true if debug == true then get_console():execute("inventory_close") end end end --[[ function check_blood() -- if belt_status == true then if belt["af_blood"]~=nil and belt["af_blood"]>0 then -- то есть когда параметр пояса[af_blood] равен 1, 2, 3.. Сколько навесишь Камней. amk.send_tip("Кровь Камня на поясе") end -- end end ]] --[[ local unique_sect = { ["af_caterpillar"] = true, ["af_arhara_globus"] = true, ["af_vyvert_green"] = true, ["af_blood_green"] = true, ["af_dummy_spring_red"] = true, ["af_dummy_battery_red"] = true, ["af_dummy_pellicle_red"] = true, ["af_babka_3"] = true, ["af_babka_4"] = true, ["af_armor_4"] = true, ["af_cry_3"] = true, ["af_dik_4"] = true, ["af_kol_3"] = true, ["af_kol_4"] = true, ["af_pudd_4"] = true, ["af_spirit_3"] = true, ["af_spirit_4"] = true, ["af_gold_fish"] = true, ["af_eye_voron"] = true } --оставляет на поясе по одному(фиг,теперь двум) артефакту каждого вида function remove_duplicate() local t = check_duplicate() for k, v in pairs(belt_id) do local sobj = alife():object(k) if sobj then local sect = sobj:section_name() --if is_unique(sobj:clsid()) and t[sect] ~= nil and t[sect] > 0 then --if is_unique(sect) and t[sect] ~= nil and t[sect] > 0 then if unique_sect[sect] and t[sect] ~= nil and t[sect] > 0 then alife():release(sobj, true) local text="Убраны лишние артефакты "..game.translate_string(amk.get_inv_name(sect)).." с пояса" news_manager.send_tip(db.actor, text, nil, nil, nil) amk.spawn_item_in_inv(sect, db.actor) t[sect] = t[sect] - 1 end end end end --собирает инфу о дупликатах на поясе --возвращает таблицу вида [секция арта] = <количество лишних артов> function check_duplicate() local result = {} for k, v in pairs(belt) do if v > 2 then result[k] = v - 2 end end return result end ]] --возвращает true, если предмет должен быть на поясе в единственном числе --function is_unique(section) --[[local result = false for i=1,table.getn(unique_sect) do if section == unique_sect[i] then result = true break end end]] --return (section ~= nil and unique_sect[section] == true) --return result --end -- Проверка на иммунитеты и удаление с пояса лишних артов local imm_limits = {100, 86, 73, 60} local imm_limit, sobj, sect, imm_sect, bad_imm local immunities = { {sect="burn_immunity",name="Ожог",total=0}, {sect="strike_immunity",name="Удар",total=0}, {sect="shock_immunity",name="Электрошок",total=0}, {sect="wound_immunity",name="Разрыв",total=0}, {sect="radiation_immunity",name="Радиация",total=0}, {sect="telepatic_immunity",name="Телепатия",total=0}, {sect="chemical_burn_immunity",name="Химический ожог",total=0}, {sect="explosion_immunity",name="Взрыв",total=0}, {sect="fire_wound_immunity",name="Пулестойкость",total=0} } function check_immunities() if db.actor:object("af_invul") then return end imm_limit = imm_limits[level.get_game_difficulty()+1] repeat -- считаем иммунитеты total_immunities() -- проверяем иммунитеты bad_imm = bad_immunity() if bad_imm then -- есть перебор в иммунитете - удаляем лишний арт и вновь считаем иммунитеты imm_remove_art(bad_imm) else -- все ок break end until false end function imm_remove_art(imm) for k, v in pairs(belt_id) do sobj = alife():object(k) if sobj then sect = sobj:section_name() imm_sect = rx_utils.read_from_ini(nil, sect, "hit_absorbation_sect", nil, 1) if imm_sect and rx_utils.read_from_ini(nil, imm_sect, immunities[imm].sect, 1, 3) < 1 then -- арт увеличивает иммунитет alife():release(sobj, true) amk.spawn_item_in_inv(sect, db.actor) remove_from_table(belt, sect) belt_id[k] = nil news_manager.send_tip(db.actor, "Для текущего уровня сложности создаваемый артефактами имммунитет "..immunities[imm].name.." не должен превышать "..tostring(imm_limit).."%. Артефакт "..game.translate_string(amk.get_inv_name(sect)).." убран с пояса.", nil, "nano", 20000) return end end end end function bad_immunity() for i=1,#immunities do if immunities[i].total > imm_limit then return i end end return nil end function total_immunities() for i=1,#immunities do immunities[i].total = 0 end for k, v in pairs(belt_id) do sobj = alife():object(k) if sobj then sect = sobj:section_name() imm_sect = rx_utils.read_from_ini(nil, sect, "hit_absorbation_sect", nil, 1) if imm_sect then -- считаем иммунитеты for i=1,#immunities do immunities[i].total = immunities[i].total+100-math.floor(rx_utils.read_from_ini(nil, imm_sect, immunities[i].sect, 1, 3)*100+0.1) end end end end end -- предмет на поясе function on_belt(sect) return belt[sect] end function items_on_belt() local count = 0 for k,v in pairs(belt) do count = count+v end return count end function is_free_belt_slot() return items_on_belt() < rx_utils.read_from_ini(nil, "inventory", "max_belt", 1, 3) end function get_free_belt_slot() if is_free_belt_slot() then return end local sect for k,v in pairs(belt_id) do sect = level.object_by_id(k):section() if not string.find(sect, "bioradar") and sect ~= "af_invul" and rx_utils.read_from_ini(nil, sect, "class", "", 1) ~= "D_SIMDET" then alife():release(alife():object(k), true) amk.spawn_item_in_inv(sect, db.actor) remove_from_table(belt, sect) belt_id[k] = nil return end end end -- Идол Монолита на поясе function check_idol_monolita() if not has_alife_info("snp_shadows_start") or has_alife_info("snp_shadows_done") then return end if belt["af_idol_monolita"] then if not af_idol_monolita_on_belt then -- одели арт af_idol_monolita_on_belt = true level.set_weather("grey") end else af_idol_monolita_on_belt = false end end Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 19 Ноября 2016 (изменено) Добрый день. Получаю из файла значение: local ini = system_ini("gamedata//config//settings.ltx") local names = ini:r_string(all,valid_key) Где all - это секция, а valid_key - ключ в этой секции. Что будет, если прописать в ключ несколько значений? Например: [all] valid_key = "One", "Two", "Three" Что в итоге будет содержать локальная переменная names? Одну строку со значением: "OneTwoThree"? Моя цель, создать массив с значениями из ключа. Изменено 19 Ноября 2016 пользователем Kober(BRUC) Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 19 Ноября 2016 наверно, ты хотел написать ini_file Да, именно так и хотел. Возвратит как одно значение То есть переменная будет равна этому?: local names = "\"One\", \"Two\",\"Three\"" Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 24 Ноября 2016 Добрый день. Информация была взята из этого поста. В save(bind_monster) сохраняю значение переменной: packet:i_bool(self.inventory) И соответственно в load получаю: self.inventory = reader:i_bool() Правильно ли я всё понял? Поделиться этим сообщением Ссылка на сообщение
Kober(BRUC) 99 Опубликовано 24 Ноября 2016 @Kirgudu, nil - считается значением? Про порядок. Допустим я сохранил первую переменную, а затем вторую. У нас появилась своеобразная очередь. Но нам доступен только конец очереди. То есть вторая переменная.? Поделиться этим сообщением Ссылка на сообщение