Deviks спасибо, систему понял, я так думаю, что есле это под гулаговая работа (путь, который активируется через рестриктор) то то что под чертой писать не надо? НПС сами я так понимаю перейдут на эту работу?
Stalk15
Научись в конце концов читать простейшие сообщения лога:
[error]Description : Specified story object is already in the Story registry!
Лог сообшает тебе о том, что ошибка возникла при появлении (попытка заспавнить) в игре объекта, стори-айди (Story_Id) которого уже зарегистрирован. Т.е. в игре уже имеется другой объект с таким же Story_Id.
Ты очевидно допустил простейшую ошибку и спавнишь "копию" уже имеющегося рестриктора, не изменив стори-айди, а разглагольствуешь о Кордоне/Свалке/онлайне ... Так погадалками ты долго и себя будешь путать и подобными постами топик 'засорять'.
Сделай простейшую проверку перед спавном на наличие в игре предполагаемого к использованию идентификатора - и многое прояснится.
Сообщение было успешно отредактировано Artos (03-06-2010 00:54 GMT3 часа, назад)
Struck
HideActorMenu() не подойдет в любом случае.
Сам загляни в азбуку (lua_help.script).
1. Этот метод применим только начиная с ЧН.
2. Применим к "class CUIGameCustom', т.е. к тем окнам, которые ты можешь создать и управлять.
Чем закрыть (кроме горячей кнопки) не знаю, не интересовался.
Gun12
Ты прав, этот кусок можно попробовать использовать.
Только потребуется чтобы self'ом оказалось именно нужное окно (инвентаря), а не иное.
function actor_binder:info_callback(npc, info_id)
... on_info(info_id)--/#+# сигнал получения инфопоршня
end
function on_info(info_id) --/ вы(опре)деляем нужный инфопоршень
if info_id == "ui_inventory" then --/ открылось окно "инвентаря"
local wnd_inv = level.main_input_receiver() --/ объект "окно инвентаря"
Check_on_inventory(wnd_inv) --/ что-то проверяем ... при открытом "инвентаре"
end
end
function Check_on_inventory(wnd_inv)
... --/ что-то делаем/проверяем
if wnd_inv and условие then --/ при требуемом событии - закрываем wnd_inv:GetHolder():start_stop_menu(wnd_inv,true) --/ закрываем "инвентарь"
end
end
Это только "рыба"(!), работает "однократно", т.е. в момент открытия окна. Следует ее дописать, вероятно 'запомнить' событие открытия окна и собственно объект окна ... и оптимизировать.
Artos
Я рестриктору при спавне story_id не присваивал.Вот в этой статье написано, что если story_id не нужен, то в функции спавна нужно просто вместо sid прставить значение nil.Я так и сделал, но вылет все равно происходит.Странно
Artos
Не помню, закрывается ли окно инвентаря автоматом, при нажатии "Esc".
Если так, то сохранять нет смысла.
Вот один из вариантов (уже правленный, как и пост, после нашей дискуссии). Уже проверено. Работает как и задумано .
Код:
function actor_binder:update(delta)
...
if db.actor:has_info("ui_inventory") then
on_info()
end
end
И дальше :
Код:
local wnd_inv
function on_info()
if wnd_inv then
if "условие" then
wnd_inv:GetHolder():start_stop_menu(wnd_inv,true)
wnd_inv = nil
end
else
wnd_inv = level.main_input_receiver()
end
end
Сообщение было успешно отредактировано Gun12 (03-06-2010 23:50 GMT3 часа, назад)
Gun12
По эскейпу закрывается, но не суть ...
1. При данном варианте кодов on_info() - 'точечная' одноразовая функция, которая срабатывает в момент открытия окна инвентаря.
Если кому-то требуется закрывать окно НЕ сразу, а по какому-то отложенному во времени событию, то коды закрытия следует вынести в стороннюю функцию.
2. wnd_inv - это один и тот же объект в отрезке 'окно открыто-закрыто'. Но(!) если окно закрыть и вновь открыть - это уже совершенно разные объекты.
Определять/обнулять этот объект можно введя двойную проверку на открытие и(!) закрытие окна, нечто типа:
Код:
local bShow = false --/ флаг открыто/закрыто окно инвентаря"
local wnd_inv = nil --/ объект "окно инвентаря"
--/ Открытие/закрытие инвентаря
function on_info(npc, info_id)
if info_id == "ui_inventory" then
bShow = true
wnd_inv = level.main_input_receiver()
elseif info_id == "ui_inventory_hide" then
bShow = false
wnd_inv = nil
end
end
Ну и использовать полученный флаг и/или объект по мере необходимости.
Stalk15
Я не собираюсь гадать что ты там у себя нагородил при спавне, как ты понял прочитанное, да и собственно рецензировать прочитанное ...
Я тебе дал однозначное толкование ошибки - а уж "как и почему" - гадай сам или формулируй вопросы так, чтобы их можно было понять и ответить (не очередным тутором по спавну рестриктора).
Сообщение было успешно отредактировано Artos (03-06-2010 19:47 GMT3 часа, назад)
ArtosGun12 спасибо, теперь вопрос следующий, как вывести кастом статик с таймером?(в формате ММ:СС)
Н-р у меня работает функция и вот пока он работает чтобы был на экране таймер с отсчётом до окончании работы функции, или просто как вывести таймер на экран?
Stalk15
Ну а если у рестриктора не будет сида, что будешь делать? Не писать же его каждому рестриктору. Я когда делал по статье, спокойно передавал nil. Возможно ты где-то ошибся.
Мастер с обрезом
Дружищееее!!! Приветствую на сайте.
Почему я конкретно не отвечаю?
Тут г. Artos прививает всем "лентяям" привычку прикладывать хоть немного собственных усилий для достижения цели.
Я полностью поддерживаю эту идею, и стараюсь ответить на вопрос так, чтобы человек "помучался", ради его собственного же блага.
добавлено спустя 7 минут
Цитата#Sine :...я так думаю, что есле это под гулаговая работа (путь, который активируется через рестриктор) то то что под чертой писать не надо? НПС сами я так понимаю перейдут на эту работу?
И тут же буду противоречить себе.
Просто уже подготовил ответ, поэтому чтобы не пропал выложу :
Значит так.
Работа (записанная в таблице t), которую делает сталкер, зависит от двух условий.
Состояния гулага :
Код:
state = {***}
и соответствующей этому состоянию секции логики :
Код:
section = "logic@***"
Т.е. сталкер будет выполнять эту работу (отрабатывать эту секцию логики), пока функция :
Код:
function load_states(gname, type)
будет возвращать значение, соответствующее записанному(ым) в :
Код:
state = {***}
для данного гулага.
Отсюда следует, что для того чтобы переключить сталкера на другую работу,
необходимо изменить состояние гулага и секцию логики.
Поскольку таблица t - это отдельно взятая работа, то для новой работы нужно создать такую же таблицу,
но в вышеупомянутые поля записать новые значения состояния и секции логики :
Код:
t = { section = "logic@new***"
... ,
state = {новое значение},
...
}
table.insert(sj, t)
С секцией понятно. Создаёшь в файле config\misc\gulag_*.ltx новую логику.
А вот в функцию load_states добавляешь новое условие, для переключения на новое состояние.
Что именно писать - зависит от твоей необходимости.
Например (по-проще). Есть загрузка состояний, которые уже используются в гулаге :
Код:
if type == "esc_bridge" then
return function(gulag)
if ( level.get_time_hours() >= 5 and level.get_time_hours() <= 22 ) then
return 0 -- день
else
return 1 -- ночь
end
end
end
Добавим новое. После строки return function(gulag) вставляем :
Код:
if has_alife_info("поршн") then
return 2
end
Т.е. при установке поршна "поршн", гулаг переключится в состояние 2, которое и нужно указать
в строке state = {2} новой работы.
Как выдать поршн - твоё дело.
Если ты хочешь через рестриктор, то тебе уже сказали.
Только если этот рестриктор нужен исключительно для выдачи поршна, нужно отправить его в NIL, чтобы без дела не грузил систему :
Код:
on_actor_inside = nil %+поршн%
Пойдёт ли сталкер на новую работу, зависит от полей :
Код:
in_rest = "***", out_rest = "***"
Если их значения - пустая строка "", то без проблем.
Если же в них установлены значения (имена рестрикторов), то нужно убедиться, что пути работы не попадают в рестриктор,
указанный в in_rest, и не выходят за пределы рестриктора, указанного в out_rest, иначе в новой таблице работы нужно снять
"мешающие" рестрикторы (поставить значение "").
Если у тебя в гулаге несколько НПС, то при переключении состояния они выйдут из своей логики, соответствующей бывшему состоянию.
Поэтому необходимо им тоже установить логику для нового состояния.
Если при переключении НПС должны продолжать выполнять ту же работу, то в поле state, этой логики, нужно добавить новое состояние :
Код:
state = {***, 2}
Сообщение было успешно отредактировано Gun12 (04-06-2010 02:10 GMT3 часа, назад)
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.