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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

Здравствуйте, можно ли как-то установить в нужный момент нужное время? 

К примеру, если мне нужно, чтобы при выдаче поршня info_time_0, устанавливалось время 00:00 (не перемотка до этого времени через увеличение тайм фактора, а именно установить это время). Спасибо

God save Hatsune Miku!

@RayTwitty  файл абсолютно родной из Солянки, ничего не менялось, вот он на гитхабе:

https://github.com/Gipnostalker/gipnostalker.github.io/blob/master/stalker/bind_physic_object.script

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Всё. Вопрос таки решил. Месяц бился... Надо было менять в init, в update и в use_callback. В init добавил условие которое предложил @RayTwitty а именно:

... or item:clsid() == clsid.inventory_box then ...
--' кстати, работает также и :
.. or item:section() == "inventory_box" then ...
--' вопрос только в том, что быстрее отрабатывает?...

дальше, путём метода народного втыка и постоянного вывода в лог чтобы понять что и куда и когда, выяснил, что в update надо добавить условие для ящиков без логики и в этом условии ещё раз вызывать use_callback, а именно добавил:

--' для всех inventory_box у которых нет логики вызываем callback отдельно
...  

else
    if item:clsid() == clsid.inventory_box then
      item:set_callback( callback.use_object, generic_physics_binder.use_callback, self )
    end

...

и, наконец, в use_callback заработало то, что мне было надо, а именно, если ГГ открыл ящик, то получаем object ящика:

--' проверка нужна, т.к. use_callback возвращает и двери...
if item:clsid() == clsid.inventory_box then
  my_global_var.GVObj(item)
  log("* [bind_physic_object](use_callback) obj: "..item:id()..", "..item:section()..", "..item:name() )
else
  log("! (1)[bind_physic_object](use_callback) obj: "..item:id()..", "..item:section()..", "..item:name() )
  log("! (2)[bind_physic_object](use_callback) obj: " .. item:id() .. " - это не ящик")
end

Для чего было надо? Сделал кнопки при открытии ящика: Выложить еду, арты, части мутантов, патроны. Для меня очень удобно, вместо того чтобы клацать мышкой 50 раз, просто один раз на кнопочке - выложить в ящик, и все патроны, например, перекладываются. Также сделал кнопку в инвентаре, сбросить всё в рюкзак, если есть рюкзак, кроме того что в слотах.
Всех кто участвовал - благодарю.

  • Нравится 3
  • Полезно 1

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

03.03.2025 в 01:37, Баба ЯГА сказал:
вопрос только в том, что быстрее отрабатывает?...

Вопрос не в скорости (сравнение строк всегда медленнее, чем сравнение чисел), а в логике. Если когда-либо добавится новый ящик с другой секцией (vasya_box например), то тебе придется править все скрипты, логика которых завязана на имя секции. Проверка класса этот вопрос закрывает.

Впрочем, если и добавляют какие-то спец-ящики, то для технических целей - их нельзя заюзать, соответственно обрабатывать событие нет нужды. Короче говоря, если логика работы позволяет проверить класс объекта, а не секцию, то надо проверять класс.

  • Нравится 2

Telegram-канал RayTwitty Space

Пытаюсь после спавна костюма в рюкзак ГГ переместить его в слот. ОГСР движок. Получаю вылет, что не так то?

function upgradeS:spawn_item(spawn_item, dist)
	-- спавним только в игре
	if self:check_game() then
		--self:on_quit()
	 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		db.actor:move_to_slot(db.actor:object(spawn_item))        --Перемещаем объект в слот
	end
end
Скрытый текст

[C]: in function 'move_to_slot'
    ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:367: in function 'spawn_item'
    ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:419: in function <...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:374>
[11.03.25 22:09:13.074]     Locals: 
[11.03.25 22:09:13.074]      string (*temporary) : [luabind::detail::class_rep::function_dispatcher] Caught unhandled exception!
[11.03.25 22:09:13.074]     End
[11.03.25 22:09:13.074]     Locals: 
[11.03.25 22:09:13.074]      userdata (*temporary) : (game_object): 000002C97146F1D0
[11.03.25 22:09:13.074]      nil (*temporary) : [not available]
[11.03.25 22:09:13.074]     End
[11.03.25 22:09:13.074]     Locals: 
[11.03.25 22:09:13.074]      Userdata: self
[11.03.25 22:09:13.074]              userdata self.owner : (CUIGameCustom): 000002C9725967B0
[11.03.25 22:09:13.074]      string spawn_item : novice_outfit_aa
[11.03.25 22:09:13.074]      number dist : 1.000000
[11.03.25 22:09:13.074]     End
[11.03.25 22:09:13.074]     Locals: 
[11.03.25 22:09:13.074]      Userdata: self
[11.03.25 22:09:13.074]              userdata self.owner : (CUIGameCustom): 000002C9725967B0
[11.03.25 22:09:13.074]      nil actor : [not available]
[11.03.25 22:09:13.074]      nil npc : [not available]
[11.03.25 22:09:13.074]      userdata outfit : (game_object): 000002C97CC7C9D0
[11.03.25 22:09:13.074]      number UPcost : 200.000000
[11.03.25 22:09:13.074]     End
[11.03.25 22:09:13.074] *********************************************************************************
[11.03.25 22:09:13.074] ********************************************************************************
[11.03.25 22:09:13.074] !![LogStackTrace] Thread: [X-RAY Primary thread]
[11.03.25 22:09:13.097] !!stack trace:

 

@Stalkersof, попробуй немного по другому:

function upgradeS:spawn_item(spawn_item, dist)
	-- спавним только в игре
	if self:check_game() then
		--self:on_quit()
	 	local Sobj = alife():create (spawn_item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		if db.actor:object(Sobj) then
			db.actor:move_to_slot(db.actor:object(Sobj))        --Перемещаем объект в слот
		else
			-- тут действие если Sobj не найден!!!
		end
	end
end

 

Если я в чём-то не прав - вскоре @Купер, меня "поправит", в свойственной ему манере.

Изменено пользователем ted.80

@ted.80 Не. вылетает.

Скрытый текст

[C]: in function 'object'
    ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:367: in function 'spawn_item'
    ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:425: in function <...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:380>
[11.03.25 23:10:23.134]     Locals: 
[11.03.25 23:10:23.134]      string (*temporary) : [luabind::detail::class_rep::function_dispatcher] Caught unhandled exception!
[11.03.25 23:10:23.134]     End
[11.03.25 23:10:23.134]     Locals: 
[11.03.25 23:10:23.134]      userdata (*temporary) : (game_object): 000002623DF0C060
[11.03.25 23:10:23.134]      Userdata: (*temporary)
[11.03.25 23:10:23.134]     End
[11.03.25 23:10:23.134]     Locals: 
[11.03.25 23:10:23.134]      Userdata: self
[11.03.25 23:10:23.134]              userdata self.owner : (CUIGameCustom): 0000026237A52B20
[11.03.25 23:10:23.134]      string spawn_item : novice_outfit_aa
[11.03.25 23:10:23.134]      number dist : 1.000000
[11.03.25 23:10:23.134]      Userdata: Sobj
[11.03.25 23:10:23.134]     End
[11.03.25 23:10:23.134]     Locals: 
[11.03.25 23:10:23.134]      Userdata: self
[11.03.25 23:10:23.134]              userdata self.owner : (CUIGameCustom): 0000026237A52B20
[11.03.25 23:10:23.134]      nil actor : [not available]
[11.03.25 23:10:23.134]      nil npc : [not available]
[11.03.25 23:10:23.134]      userdata outfit : (game_object): 0000026230270A50
[11.03.25 23:10:23.134]      number UPcost : 200.000000
[11.03.25 23:10:23.134]     End
[11.03.25 23:10:23.134] *********************************************************************************
[11.03.25 23:10:23.134] ********************************************************************************
[11.03.25 23:10:23.134] !![LogStackTrace] Thread: [X-RAY Primary thread]
[11.03.25 23:10:23.159] !!stack trace:

 

Короче мне ответили на гитхабе ОГСР. Что 

db.actor:move_to_slot()

Принимает не строку а клиентский объект и удалили пост. Вот теперь вопрос как из строки(секции костюма)получить этот самый объект.

Попробовал так.

function upgradeS:spawn_item(spawn_item, dist)
	-- спавним только в игре
	if self:check_game() then
	    alife():create(spawn_item, db.actor:position(),  db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		local s_obj = alife():object( spawn_item )
		local c_obj = level.object_by_id(s_obj.id)
		db.actor:move_to_slot(c_obj)        --Перемещаем объект в слот
	end
end

Вылет string (*temporary) : attempt to index local 's_obj' (a nil value)

@Stalkersof попробуй так:

Скрытый текст
function upgradeS:spawn_item(spawn_item_sec, dist)
    -- спавним только в игре
    if self:check_game() then
        local s_obj = alife():create(spawn_item_sec, db.actor:position(),  db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
        if s_obj then
            local c_obj = level.object_by_id(s_obj.id)
            if c_obj then
                db.actor:move_to_slot(c_obj) -- Перемещаем объект в слот
            end
        end
    end
end

 

Ещё, у тебя метод называется "spawn_item" и параметр в этом методе называется так же --> upgradeS:spawn_item(spawn_item, dist)

В примере выше, изменил параметр на "spawn_item_sec".

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

@Shkiper2012 Попробовал и вылета нет и не работает. Да я так тоже пробовал. Короче надо ждать ОГСРовцев может подскажут чего

Убрал условие 

if c_obj then

Вылет. nil c_obj : [not available]

@Stalkersof Откуда берёшь скрипт? В огсре по-моему у game_object вообще нет метода move_to_slot.

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

2 минуты назад, Balavnik сказал:

@Stalkersof  В огсре по-моему у game_object вообще нет метода move_to_slot.

Я имел в виду движок ОГСР там есть этот метод. 

@Stalkersof Ага, посмотрел в двиг, вижу. В lua_help почему-то не добавлен.

 

Похоже, серверный объект уже существует, а клиентский нет. По-моему клиентский объект создаётся на следующем апдейте после создания серверного.

  • Нравится 1

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

13 минут назад, Balavnik сказал:

@Stalkersof  По-моему клиентский объект создаётся на следующем апдейте после создания серверного.

А что делать? Таймер штоль мутить

@Stalkersof Можешь и таймер. А используешь огсе-сигналы? Там по идее есть установка на следующий апдейт?

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

3 минуты назад, Balavnik сказал:

@Stalkersof А используешь огсе-сигналы? 

Использую, но я пока только научился скрипты к биндеру подключать

Ну да в этом проблема была. Я через level.add_call() сделал. Ща поставлю там секунду по времени, а то у меня там еще костюм из слота удаляется. В общем спавню костюм в рюкзак, удаляю в слоте, через секунду(можно и меньше перемещаю в пустой слот. Короче таймер.

3 часа назад, Stalkersof сказал:

Я через level.add_call() сделал. Ща поставлю там секунду по времени

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

 

Вообще, подобного рода вопросы (действия с объектами при выходе в онлайн) уже баян, причем очень давний.

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

Telegram-канал RayTwitty Space

[ТЧ 1.0006]

 

Задача: привязать субтитры к звуку, который выдается после прибытия NPC в определенную точку и окончания анимации разворота.
Пример логики: p2:name = wp02|sig=arrive|syn|s=mil_collect_phrase1

 

Привязка к флагу switched в [state_mgr.script] state_manager:set_state учитывает только прибытие на точку. Как правильно привязать обработку именно к моменту вывода звука?

Spoiler
[state_mgr.script]
function state_manager:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys)
(+) в конец
	if switched then
		if synsound then
			-- действие
		end
	end
end

 

 

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

@Norman Eisenherz 

Я бы начал с этого: move_mgr.script, move_mgr:waypoint_callback - блок звук.

 

 

Правильно понимаю, если в любом скрипте (в его начале, не в теле функции) объявить переменную, типа local my_var = 0 - то она локальна только для данного скрипта и функций в нём, и чтобы сделать её глобальной, нужно убрать local, или ещё перенести в _g.script?

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

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

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

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

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

Войти

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

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

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