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

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

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

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

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

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

 

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

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

 

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

 

Плагины 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, чтобы НПС стал врагом?

 

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

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

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

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

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

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

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

Войти

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

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

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