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

Внимание.

В следствии глобального сбоя системы сайт восстановлен из бэкапа за 16.10.2026

 

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

@*Shoker*, лично я пользуюсь скриптом actor_menu, с помощью него можно отловить открытие/закрытие всех окон помимо пда, с пда немного по другому, вешаешь свою функцию на коллбэк ГГ получения инфопоршня. В коллбэк вторым параметром передается полученный инфопоршень, а далее проверкой, на открытие пда выдается инфопоршень ui_pda, на закрытие ui_pda_hide.

Изменено пользователем Viнt@rь
  • Нравится 1

Есть вопрос по level.main_input_receiver()

Получаю текущее открытое окно test_wnd = level.main_input_receiver(), скрываю его test_wnd:Show(false). Далее идёт старт таймера, по его окончанию пытаюсь показать обратно то окно

test_wnd:Show(true), но ловлю вылет. В логе только это: 

 

 

stack trace:

001B:03DA7261 xrGame.dll

 

Viнt@rь, проверял пару раз, не терял. Этот способ так и не заработал, сделал скрытие окна иначе..

@abramcumner,@Shredder, @Viнt@rь,

Спасибо за советы, я просто искал универсальный метод, т.к если мои наработки будут использоваться в других модах, об этом могут тупо забыть. 

 

-----------------------------------------------------------------------

 

Такой вот вопросец по биндеру объектов, возможно это уже баян, но для меня было новостью.
Может даже косяк из за правленых экзешников, но сейчас уже поздно проверять и это, надо игру переставлять, собстно такое дело:
Платформа ЗП 1.6.02, экзешники из Мизери и там хз какие правки вносились но по идее стандартные на рендер, солнце и т.д, собственно сделал в скриптах свой биндер (object_binder)

в него добавил методы save\load чтобы сохранять свои данные. И тут вылезла такая проблема.

Если сохранять\загружать игру на одной и той же локации то оба метода прекрасно вызываются, однако если перейти на другую локацию а потом обратно то метод load у объекта не вызывается, соответственно сохранённые данные уже не грузятся и полезность данных методов падает до нуля. Я сперва думал что проблема тока с моим биндером, но потом сделал вывод в консоль из motivator_binder (который хранит инфу о онлайн-сталкерах) и оказалось что там та-же самая проблема, притом что ПЫС хранят там в save\load довольно много инфы, а функция load просто не вызывается при переходе из другой локации соответственно вся сохранённая инфа теряется, и это ведь только один из кучи биндеров!

Я завтра ещё проверю но вообще интересно - это нормальная ситуация? Сбоев с игрой я пока не ловил, но я уже давно не делал в ней длинные сессии, да и то всегда на одной локации. 

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

@*Shoker*,да, для оригинального ЗП совершенно нормальная ситуация.
  • Нравится 1

@abramcumner, "для оригинального", а что есть решение? На других частях сталкера всё нормально? 
Или ты просто имеешь ввиду что в ЗП так и должно быть, если да то странно.

Просто на save\load же повешены пстор и прочие данные объектов, я вообще удивлён что игра после этого ещё работает.



Вообщем разобрался, оказывается чтобы клиентские данные сохранялись при переходе на другой уровень нужно в серверном классе добавить метод keep_saved_data_anyway(), возвращающий true.
Другой вопрос что у тех же сталкеров в ЗП этот метод в серверном классе не прописан, остаётся выяснить - это баг или фича. %)

Изменено пользователем *Shoker*
  • Нравится 1

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

В bind_smart_terrain.script есть код:

function smart_terrain_binder:net_spawn( server_object )

if not object_binder.net_spawn( self, server_object ) then return false end

-- получить ссылку на настоящий серверный объект

self.se_smart_terrain = alife():object( server_object.id )

Вопрос: до этого самого server_object как-то можно добраться, чтобы хотя-бы просто тупо его прибить ?

@Dennis_Chikin,

странный вопрос. Зачем до него "добираться", вот же он. Прибить вестимо как: alife():release(server_object.id), правда так лучше не делать - на следующем апдейте там удалить.

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

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

ColR_iT

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

Сталкер - наше всё!

Да, вопрос не до конца понятен.

 

@abramcumner, удаление идёт не по id, а по ссылке на объект. Т.е. alife():release(server_object, true)

  • Нравится 1
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

alife():release(server_object.id) - это оригинально, да.

И в любом случае желательно бы сделать это еще до netspawn()

 

По тому как по имени находится то же, что и alife():object( server_object.id ), благополучно удаляется, а потом здесь получаем nil со всеми вытекающими...

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

@Dennis_Chikin,

по-прежнему ничего не ясно. Что ты хочешь изменить/исправить?

Удалить я хочу smart_terrain. В данном случае. По имении что-то находится, и удаляется.

Потом обнаруживается некий server_object, у которого id удаленного smart_terrain'а.

Вот хочется, чтобы и он тоже удалился, вместе с binder'ом. Желательно, сразу.

@Dennis_Chikin,

Ну если честно запутал вконец. Удаляешь по имени, затем ищешь по id. Откуда имя взялось, откуда id? В приведённом выше фрагменте ничего такого нет. Там присутствуют аж две ссылки на серверный объект: self.se_smart_terrain и server_object. Вторая - это ссылка на базовый, не все методы доступны, потому и получаем объект повторно по id, Для удаления однако годятся обе ссылки. Зачем ещё что-то по имени получать?

 

Вместе с клиентским объектом удалить не получится, по-любому придётся ждать завершения жизненного цикла клиентского объекта. Сразу после удаления клиентский ещё можно будет найти с помощью level.object_by_id(). А вот если сразу после удаления можно найти серверный, то либо удалял не тот объект, либо удаление не сработало.

 

Кстати, а зачем удалять смарт? Не лучше ли отключить?

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Смарт не нужен. Совсем. Имя известно. Получаем, удаляем. Через 15 секунд - вылет. db.add_smart_terrain() получил из binder'а nil, и попытался извлечь из него id.

Странный какой-то жизненный цикл...

@Dennis_Chikin, ну дык игрой наверно не предусмотрено удаление смарта прямо во время игры, это всё таки довольно комплексная вещь на которую завязаны многие скрипты, и оригинальная игра не предусматривает внезапное удаление смарта соответственно в скриптах нет никаких проверок на его существование, а того гляди и в движке какая нибудь хрень вылезет. Вообще странно зачем удалять смарт во время игры а не сделать это через all.spawn? Но если это так критично, то попробуй в скрипте smart_terrain.script там в классе class "se_smart_terrain" (cse_alife_smart_zone) в функциях, которые регистрируют созданный смарт поставить проверку по имени на ненужный тебе смарт, чтобы он не регистрировался ни в какие скрипты. Аналогично в биндере проверку по имени делай и не позволяй смарту заносить себя в какие либо таблицы, или даже можешь попробовать в биндере в функции net_spawn() возвращать false для ненужного смарта, тогда по идее он не заспавнится или не перейдёт в онлайн.  Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Dennis_Chikin,

 

Через 15 секунд - вылет. db.add_smart_terrain() получил из binder'а nil

Поставь в bind_smart_terrain.script затычку. Если серверного объекта нет, то не биндить. Типа такого

function bind( obj )
	if not alife():object(obj:id()) then return end
	...
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Подскажите пожалуйста. Вот функция, делающая НПС другом к ГГ

function glavny_vrag(first_speaker, second_speaker)

second_speaker:set_relation(game_object.friend, first_speaker)
end

На что мне надо заменить слово friend, чтобы НПС стал врагом?

 

Надо дело довести до конца!

@riddik121, на слово enemy.  То есть выходит:

function glavny_vrag(first_speaker, second_speaker)
second_speaker:set_relation(game_object.enemy, first_speaker)
end

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

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

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

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

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

Войти

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

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

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