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

Скриптование


Svoboда

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

Добрый день. Как заполнять таблицу функцией. Например есть пустая таблица:

t_tbl = {}

Которую мне нужно заполнять определенными значениями. А эти значения будут появляться в переменной(например):

local dd = любое_значение

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


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

Добрый день. Сделал меню:

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:...()

Так же, как мне его закрыть?

Изменено пользователем Kober(BRUC)

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


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

Есть поле в которое можно ввести текст:

function start_game:name_GetText()
	return self.name:GetText()
end

Как это работает? Как мне вывести эту информацию(которая была вписана в это текстовое поле игроком) в, например, локальную переменную txt_set:

local txt_set = ""

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


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

Здравствуйте. Есть кнопка в меню. Точнее несколько кнопок. Как сделать что бы при нажатии одной, другие переставали работать? 

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


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

Добрый день. Есть у меня меню. В нем есть кнопка и "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

 

 

Изменено пользователем HellRatz

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


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

Вот меню:

 

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_error
File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: d:\game\soc\gamedata\scripts\ver_game.script:60: attempt to index global 'self' (a nil value)

 

 

С чем это связано? 

Изменено пользователем BFG

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


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

надо убрать local, т.к. с его помощью инициализируется новая переменная, которая действует только до elseif.

Даже если в начале скрипта есть:

local ver_gm = ""?

Я считал что если есть, то будет работать на весь код.

Изменено пользователем Kober(BRUC)

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


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

Доброе утро. Хотел узнать. Есть папка scripts в которой находятся все скрипты. И допустим мы взяли оттуда скрипт. Любой. И в любой функции вызываем другую функцию. Но только не из этого файла. А из другого. А теперь сам вопрос. Можно ли вызывать эту функцию из другого файла, который лежит не в папке scripts, а например в scripts/add? И как это делать? Или так и вызывать? Название_файла.Название_функции()? А в какой папке лежит - не важно? Главное что бы в директории scripts/...

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


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

@Карлан, а если файл не используется другими скриптами. Просто лежит файл по директории scripts/add. И из этого файла вызывается функция, из диалога например, то все равно работать не будет?  

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


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

Добрый день. При использовании предмета в переменную сохраняется определённое значение. Но вовремя загрузки сохранения, переменная опять становится равной нулю. Как этого избежать? Сохранять значение переменной в определенный файл? Но это не иррационально. Да и негде я такого не видел. 

Изменено пользователем Kober(BRUC)
  • Нравится 1

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


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

Как считывать параметр из секции? Пытаюсь вот так:

system_ini():r_string(object:section(), "sections_name")

Но что брать за object? Мне нужно открыть конкретный файл.

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


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

@AndrewMor,я не скриптер, но:

Получаем размер хранилища. Выводим его в консоль. Если оно привышает определенный размер, то очищаем его.

З.ы. Не пинайте если не так.

  • Спасибо 1

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


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

Добрый день. Есть фон(background) и на нём статик(icon):

xml:InitStatic("background:icon", self.background)

Как мне этому статику поменять текстуру по условию при открытии этого окна? С помощью конструктора(ООП)?

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


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

@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 

 

 

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


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

Добрый день. Получаю из файла значение:

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"?

Моя цель, создать массив с значениями из ключа.

Изменено пользователем Kober(BRUC)

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


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

 

 

наверно, ты хотел написать ini_file

Да, именно так и хотел.

 

 

 

Возвратит как одно значение

То есть переменная будет равна этому?:

local names = "\"One\", \"Two\",\"Three\""

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


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

Добрый день. 

Информация была взята из этого поста.

В save(bind_monster) сохраняю значение переменной:

packet:i_bool(self.inventory)

И соответственно в load получаю:

self.inventory = reader:i_bool()

Правильно ли я всё понял? 

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


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

@Kirgudu, nil - считается значением?

Про порядок. Допустим я сохранил первую переменную, а затем вторую. У нас появилась своеобразная очередь. Но нам доступен только конец очереди. То есть вторая переменная.?

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


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

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