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

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

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


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

  Информация (Показать)

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

 

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

  Читать рекомендуется. (Показать)

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


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

@*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

 

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

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

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

 

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

 

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

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

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

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

 

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

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

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

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

@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
  Полезный утиль (Показать)
Ссылка на комментарий

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

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

 

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

Изменено пользователем 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(). А вот если сразу после удаления можно найти серверный, то либо удалял не тот объект, либо удаление не сработало.

 

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

  Полезный утиль (Показать)
Ссылка на комментарий

Смарт не нужен. Совсем. Имя известно. Получаем, удаляем. Через 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
	...
  Полезный утиль (Показать)
Ссылка на комментарий

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

  Показать

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

  Большая Зона - ещё не конец (Показать)
Ссылка на комментарий

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

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

c57d8f0c86.png

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

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

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

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

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

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

Войти

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

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

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