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

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

На мой взгляд проще добавить функцию в движок, где можно установить и кастом дату (ее наверное лучше вообще отдельной функцией сделать, у меня, например, по всякому сделано), и топливо, и прочие специфичные параметры вроде стейтов дверей (тут могу ошибиться, в транспорте совершенно не разбираюсь). Самое банальное - сделать еще один create, где опционально можно указать story id и custom data. Далее, если нужно, древовидно раскрутить все функции и вписывать туда специфичные параметры, далее их ассоциативно экспортировать в скрипты, в принципе это один из немногих хороших вариантов.

 

Если говорить о пакетах, то, если верно помню, там можно через смещение чтения/записи сразу прочесть/записать нужный параметр и не писать все это полотно, по крайней мере я так когда-то давно визуал читал.

 

Ну а оперировать этим через [spawner] это, конечно, ужасно.

  • Нравится 1
Ссылка на комментарий

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

@Kober(BRUC),

ТЧ/ЧН:

self.txtt:SetText("Новый текст для static, который завется txtt.")
ЗП:

self.txtt:TextControl():SetText("Новый текст для static, который завется txtt.")
  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Вот меню:

 

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
Добавлено BFG,

Строгое Предупреждение !!!

Такие полотна прячем под спойлер !

Ссылка на комментарий

@Kober(BRUC), с тем, что функция, в которой ты обращаешься к self, не является методом никакого класса. Соответственно, и self в ней равен nil.

И, заодно, здесь:

if tonumber(_G.main_menu.get_main_menu():GetGSVer()) <= 1.0004 then
local ver_gm = "1.0004 или меньше"
И ниже - надо убрать local, т.к. с его помощью инициализируется новая переменная, которая действует только до elseif. Изменено пользователем naxac
  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

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

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

local ver_gm = ""?

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

Изменено пользователем Kober(BRUC)
Ссылка на комментарий

В начале - да, она будет действовать во всем коде ниже ее. Но далее - ты каждый раз делаешь новую переменную, которая будет удалена после завершения блока кода.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Выполнить ф-ию при подборе одного из нескольких предметов. Читал-читал про оператор or, но всё равно вылет((:

function find_item_i(actor, npc)
if db.actor ~= nil then
return db.actor:object("предмет1")~=nil or
return db.actor:object("предмет2")~=nil
end
end
return false
end
Изменено пользователем dPlayer
Ссылка на комментарий
return db.actor:object("предмет1")~=nil or return db.actor:object("предмет2")~=nil

Убери второй return.

И end'а должно быть два, а не три.

function find_item_i(actor, npc)
if db.actor then
return db.actor:object("предмет1")~=nil or db.actor:object("предмет2")~=nil
end
return false
end

И не надо проверять актора на nil, достаточно просто if db.actor then ... end

Да и не в операторе дело, а в синтаксических ошибках. Юзай script_syntax_checker или плагин от @Charsi для Notepad'а, если пользуешься им. Оч. удобная штука.

Изменено пользователем BoBaH_671
  • Спасибо 1
  • Согласен 1

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

@BoBaH_671, как визуально можно быстро определить количество end. Это мой метод (может неверный).

 

function  - одна последняя (закрывающая функцию) end
if - вторая внутренняя end

 

Сколько if, столько end плюсуем.

  • Нравится 1
  • Не нравится 1
  • Согласен 1

andreyholkin.gif

rod_cccp.gif

 

Ссылка на комментарий

А лучше писать скрипты хотя бы в "Notepad++"(там есть синтаксис луа, и видно где нужно закрыть функцию), а не в блокноте...

  • Согласен 3
  • Полезно 1
 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий

Такой вопрос.

Через скрипт отрисовываю по координатам ГГ партикл(снег), но рисуеться он как бы в стороне от ГГ, и иногда выглядит это совсем некрасиво, и нереалистично. Вот сама функция:

 

if not self.particles then
self.particles=particles_object("ghoul\\global_snow")
self.particles:play_at_pos( db.actor:position() )
end

if self.particles then
self.particles:move_to(db.actor:position(),vector():set(10,2,15))
end

 

 

На месте цифр 10,2,15 стояли нули в исходном варианте, я думал добавить значение для вектора ,тем самым сместить положение точки отрисовки, но ничего не изменилось. Подскажите, как возможно решить проблему. Может быть сначала поработать с координатами ГГ, попробовать поприбовлять к ним значения исходя из данного относительно времени? Тоесть как бы подменять их на новые в рамках функции.

Подскажите, у кого какие идеи...

Не соответствует правилам.

Ссылка на комментарий

@CRAZY_STALKER666, предположу, что партикл рисуется по позиции объекта, а ты негодуешь из-за того, что он "не там" от первого лица, то есть от позиции камеры. Попробуй рисовать партикл от позиции камеры.

Ссылка на комментарий

Карлан, а разве камера так далеко от позиции ГГ? Насколько я видел зимние партиклы там что то типа облака метров на 10-15 вокруг ГГ, вряд ли там такая уж разница.

    CRAZY_STALKER666, что мешает посмотреть любой зимний мод, в котором это работает?  :) 

Ссылка на комментарий

 

 

что мешает посмотреть любой зимний мод, в котором это работает?

 

Отвечу - материал взят именно из него.

Там это в таком кривом варианте и оставлено...

Не соответствует правилам.

Ссылка на комментарий

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

Ссылка на комментарий

@Kober(BRUC), в оригинале без костылей это невозможно. Для скриптов существует свой относительный путь, называется $game_scripts$ и явно прописан в fsgame.ltx. Чтобы скрипты можно было вызывать откуда угодно нужно переделывать функцию вызова скриптов в движке, файл script_engine.cpp. Я ее немного переделывал там чтобы хотя бы самых больших мух от котлет отделить, а вот alpet, насколько я знаю, переделывал ее примерно так как тебе и надо, у него, опять же насколько я знаю, скрипты можно вызывать из папки scripts и всех ее подпапок. Я в плюсах слабо рублю, но мне кажется это такая плюсовая плюшка (то есть не составляет большого труда, для тех кто в них шарит), сделать цикл не только по $game_scripts$, но и по всем вложенным папкам.

 

На луа, костылем, это, разумеется, можно сделать через dofile. Но поскольку это костыль, то и путь надо будет каждый раз писать для update_path для каждой новой подпапки, не совсем удобно, ну и разумеется уже pcall.

  • Спасибо 1
Ссылка на комментарий

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

Ссылка на комментарий

upd:

Взгляни на ResourceManager_Scripting.cpp, // load shaders и далее, там как раз вот идеология того, что тебе нужно, думаю можно разобраться, цикл то маленький, а я тут напугал, даже я примерно въехал что к чему :).


 

 

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

Ну нет конечно, если ты его заранее через луа явно не подключишь, и то скорее всего не взлетит, потому что модули с диалоговыми функциями это нечто большее, чем скрипты :)

  • Спасибо 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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