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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


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

function actor_binder:repair_outfit_start(obj, who)
if obj then
if obj:section() == "deshifrator" then --здесь указываем предмет, при использовании которого будет срабатывать функция ниже
--episode_system.def_func() --здесь указываем ссылку на функцию. Сначала скрипт, в котором она написана, потом название самой функции
self.Deshifrator:Hide()
end
end
end

CRAZY_STALKER666, я что-то не пойму, откуда вызывается эта функция? Судя по "actor_binder" этот кусок в bind_stalker.script, однако дальше идет вот это:

 self.Deshifrator:Hide()

Вряд ли Deshifrator есть в actor_binder, однако тут self. Это все в совокупности как-то странно, вы дешифратор хотите запускать когда у вас что-то в слоте активно? (тогда логичнее на апдейт и не парится) или при юзании предмета в инвентаре(что-то не припоминаю, чтобы там был аргумент who? Что он передает?) Может я чего-то не понял...

---

 

[error]Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:455: attempt to index field 'Deshifrator' (a nil value)

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

---

Как вариант запуска, проще не придумать) 

function gui_start() --куда нибудь в ваш скрипт GUI
 level.start_stop_menu(this.название_вашего_класса(),true)
end
if obj:section() == "ваш_девайс" then -- а такую проверочку в колбек на использование предмета.
 ваш_скрипт.gui_start()
end
Изменено пользователем Kondr48
Ссылка на комментарий
 Deshifrator.main()

Deshifrator судя по всему тут как класс. Вызывай функцию так: имя_твоего_скрипта.main()

Изменено пользователем Sla-Sla
Ссылка на комментарий

@Sla-Sla, так я так и делаю.

В скрипте дешифратора это:

 

function main()
local hud = Deshifrator(get_hud())
level.start_stop_menu(hud, true)
end

 

 

В bind_stalker так:

 

function actor_binder:repair_outfit_start(obj, who)
if obj then
if obj:section() == "deshifrator" then 
Deshifrator.main()
end
end
end

 

 

Всё равно вылетает с тем же логом - nil value


 

 

Вряд ли Deshifrator есть в actor_binder, однако тут self. Это все в совокупности как-то странно, вы дешифратор хотите запускать когда у вас что-то в слоте активно? (тогда логичнее на апдейт и не парится) или при юзании предмета в инвентаре(что-то не припоминаю, чтобы там был аргумент who? Что он передает?) Может я чего-то не понял...

 

Всё верно, при юзании предмета должно открываться GUI-окно.

Что передает who ? Без понятия, изначально я просто нашел функцию отслеживания использования предмета на wiki inside и не особо заморачивался с аргументами функции.

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

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

@Sla-Sla, ладно, проверяем еще раз

 

Deshifrator.script

 

class "Deshifrator" (CUIScriptWnd)

function Deshifrator:__init() super()
self:InitControls()
self:InitCallBacks()
end

function Deshifrator:__finalize()
end

function Deshifrator:InitControls()
local xml = CScriptXmlInit()
self:Init(0,0,1024,768)
xml:ParseFile("Deshifrator.xml")
self.frame1 = xml:InitFrame("frame1", self)
self.edit1 = xml:InitEditBox("frame1:edit1", self.frame1)
self:Register(xml:Init3tButton("frame1:button1", self.frame1), "button1")
self:Register(xml:Init3tButton("frame1:button2", self.frame1), "button2")
self.Static3 = xml:InitStatic("frame1:Static3", self.frame1)
self.Static4 = xml:InitStatic("frame1:Static4", self.frame1)
self.edit2 = xml:InitEditBox("frame1:edit2", self.frame1)
self.checkbox1 = xml:InitCheck("frame1:checkbox1", self.frame1)
self:Register(self.checkbox1, "checkbox1")
self.checkbox2 = xml:InitCheck("frame1:checkbox2", self.frame1)
self:Register(self.checkbox2, "checkbox2")

end

function Deshifrator:InitCallBacks()
self:AddCallback("edit1", ui_events.EDIT_TEXT_CHANGED, self.edit1_edit_text_changed, self)
self:AddCallback("button1", ui_events.BUTTON_CLICKED, self.button1_button_clicked, self)
self:AddCallback("button2", ui_events.BUTTON_CLICKED, self.button2_button_clicked, self)
self:AddCallback("checkbox1", ui_events.BUTTON_CLICKED, self.checkbox1_button_clicked, self)
self:AddCallback("checkbox2", ui_events.BUTTON_CLICKED, self.checkbox2_button_clicked, self)
end

function Deshifrator:edit1_GetText() --/получить введенный текст в edit1
return self.edit1:GetText()
end

function Deshifrator:edit1_edit_text_changed()

end

function Deshifrator:button1_button_clicked()

end

function Deshifrator:button2_button_clicked()

end

function Deshifrator:edit2_GetText() --/получить введенный текст в edit2
return self.edit2:GetText()
end

function Deshifrator:checkbox1_GetCheck() --/true/false - включен/отключен checkbox1
return self.checkbox1:GetCheck()
end

function Deshifrator:checkbox1_button_clicked()

end

function Deshifrator:checkbox2_GetCheck() --/true/false - включен/отключен checkbox2
return self.checkbox2:GetCheck()
end

function Deshifrator:checkbox2_button_clicked()

end

function Deshifrator:Hide()
self:GetHolder():start_stop_menu(self, true)
end

function main()
local hud = Deshifrator(get_hud())
level.start_stop_menu(hud, true)
end

 

 

И bind_stalker:

 

function actor_binder:repair_outfit_start(obj, who)
if obj then
if obj:section() == "deshifrator" then 
Deshifrator.main()
end
end
end

 

 

Всё вроде верно, но вылет тот же...

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

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

Все-таки попробуйте вот так:

function actor_binder:repair_outfit_start(obj, who)
 if obj:section() == "deshifrator" then 
  level.start_stop_menu(Deshifrator.Deshifrator(),true)
 end
end

P.S. а вообще проверьте на всякий случай правильность написания секции(возможно в конфиге и скрипте опечатка, из-за которой условие и не срабатывает. И в качестве совета, когда что-то работает не так, пихайте в каждое условие вывод сообщения на экран, и смотрите, что и как у вас срабатывает :)

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

Добрый вечер, Интересует тот же вопрос что у Kondr48, Как узнать ID предмета только что заспавненного в рюкзаке ГГ. То есть узнать и запомнить в локальной.


Чтобы потом можно было удалить по этому же ID.

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

@CRAZY_STALKER666, игра не может подгрузить файл Deshifrator.script, т.к. он сохранён в кодировке "UTF-8 BOM". Нужно использовать кодировки "ANSI" или "UTF-8 без BOM".

Изменено пользователем Charsi
  • Нравится 1
  • Полезно 2
Ссылка на комментарий

Проблема с GUI отпала вместе с удалением последнего) Новый вопрос - как заставить ГГ в какой-то момент перестать двигаться?

 

Такое было реализованно в моде Золотой Шар, но скачать и посмотреть как там все работает возможности нет.

Что приходит в голову - прочитать в конкретный момент времени координаты ГГ, записать их в буфер, и методично каждую секунду исать их заного в память. Но выглядеть будет убого. Еще вариант - в опр момент(допустим после пол. поршня) писать в переменную усталости актора 0. Но как реализовать - кхм, не знаю.

 

Есть у кого варианты, или мб готовые решения?

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

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

Просто отключи кнопки передвижения:

 

        get_console():execute("unbind forward")
        get_console():execute("unbind back")
        get_console():execute("unbind lstrafe")
        get_console():execute("unbind rstrafe")

 

А когда надо включи:

 

        get_console():execute("bind forward kW")
        get_console():execute("bind back kS")
        get_console():execute("bind lstrafe kA")
        get_console():execute("bind rstrafe kD")

 

  • Спасибо 1
Ссылка на комментарий
Как заставить ГГ в какой-то момент перестать двигаться?
level.disable_input() -- блокировка управления
level.enable_input() -- разблокировка управления

Блочится даже управление мышью.

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

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

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

@BoBaH_671, очень понравилась ваша реализация, но хотелось бы мышь отдельно разблочить. А для этого нужны исходные коды disable_input и enable соотв. У меня на компьютере нет level.script, может кто скинет?

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

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

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

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

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

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

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

Войти

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

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

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