AndreySol 215 Опубликовано 7 Апреля 2012 ТЧ v 1.0005 О фонарике актера(ГГ) - пробую удалять его так: local obj = db.actor:item_in_slot(9) if obj then alife():release(alife():object(obj:id()), true) end или так local obj = db.actor:object("device_torch") if obj then alife():release(alife():object(obj:id()), true) end в результате - из 5-ти попыток 1-2 удачно, 3-4 вылет из игры. Что такого с этим долбаным фонариком - почему не удаляется нормально ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 7 Апреля 2012 (изменено) Artos Твоя заковыка в данном случае в том, что получая клиентский объект фонарика, ты по его признаку (ID) пытаешься удалять серверный объект, не проверив наличие его в игре Я поправил код удаления - теперь фонарик вообще перестал удаляться. Его вообще нельзя удалить ? Или это надо как-то иначе делать ? Ты нас тут за кашпировских принимаешь? Чтобы ответить "иль как иначе" необходимо видеть что ты у себя нагородил. --/Artos Изменено 7 Апреля 2012 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 7 Апреля 2012 необходимо видеть что ты у себя нагородил Есть кнопочка в окне инвентаря ("приделана" туда с исп. CUIScriptWnd), в обработчике нажатия этой кнопочки - код удаления фонарика, приведенный выше (и исправленный). Никаких проверок наличия после попытки удаления в коде нет. Результат нажатия кнопки - вылет, ничего или удаление фонарика. Причем абсолютно бессистемно. Еще попробовал вариант с получением объекта фонарика через "iterate_inventory", результат тот-же. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 7 Апреля 2012 (изменено) Осмелюсь предположить, что в твоих "оконных"- кодах объект фонарика кешируется и ты определяешь его наличие по наличию иконки в слоте ... Т.о. даже если ты удалил серверный объект, но не потрудился обновить кеш кодов своего оконного менеджера - то и видишь прежнюю иконку. Да ничего подобного. Простая кнопка, с обработчиком в котором ничего другого, кроме строчек кода для удаления фонарика, нет. Сама кнопка работает отлично, я ее специально в окно инвентаря повесил, чтоб иметь возможность тестово по ее нажатию вызывать всякие функции из скриптов. И иконку я никакую не использую - включаю фонарик, затем открываю инвентарь и жму эту кнопку. Результат - один из трех: вылет, ничего (т.е. фонарик продолжает светить), удаление фонарика (свет от фонарика тухнет, и после закрытия инвентаря его включить назначенной кнопкой уже нельзя). раз уже в третий раз не утруждаешь себя тем, чтобы их показатьВам сильно хочется видеть чуток переделанный код из образца, который я здесь-же на форуме и взял ? Изменено 7 Апреля 2012 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 14 Апреля 2012 Если детектор удалить\выбросить из инвентаря актора(ГГ), а затем получить его(подобрать или взять из нычки\купить\получить в награду за квест) - он автоматом "запрыгнет" в свой родной слот. Вопрос - можно-ли как-то задисэйблить слот, т.е. сделать так, что-бы он не принимал детектор при появлении его в инвентаре актора ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 14 Апреля 2012 (изменено) 7.9 Об этом я конечно подумал, но хотел все-же уточнить насчет других, более "прямых" (на мой взгляд) вариантов. Во-первых, не нужно цитировать предыдущие посты, достаточно вписать ник-нейм. Во-вторых, что значит "прямых", да ещё и на твой взгляд, вариантов? ColR_iT Добавлено через 182 мин.: ColR_iT Ну к примеру какая-то функция движка, позволяющая блокировать слот, или предмет от попадания в прописанный ему слот ? Изменено 14 Апреля 2012 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 16 Апреля 2012 (изменено) Вопрос о фиксации объектов после спауна: скриптово создаю объект, ящик с динамитом, с размещением его на земле (локация Кордон) прям перед входом к Сидоровичу (для тестирования). После создания пытаюсь его фиксировать (пример кода взял здесь-же, на форуме): if object then local pshell = object:get_physics_shell() if pshell then local element = pshell:get_element_by_order(0) if element then element:fix() local text = "попытка фиксации" news_manager.send_tip(db.actor, text, nil, nil, 30000) end end end сообщение появляется, значит ф-ция element:fix() вроде как отрабатывает. Но если после создания предмета сохраниться, а затем загрузиться - предмет исчезает, точнее становится невидимым. Если подойти затем к нему и посмотреть на него (зная точно место, где он должен быть), он "проявляется", т.е. визуально появляется на месте спауна. Что надо исправить, чтоб предмет спаунился нормально ? Изменено 16 Апреля 2012 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 16 Апреля 2012 Artos object_flags - нашел это только в Вашем модуле нет-пакетов. Подскажите как этот параметр влияет на объект. И как его правильно использовать. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 16 Апреля 2012 Artos Вообще-то я указал, что спаун предмета - скриптовый. Какое отношение к этому имеет ACDC и all.spawn не понимаю. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 16 Апреля 2012 Artos Не заметить наличие этого параметра практически везде, для каждого объекта и независимо от типа спавна - ну очень постараться нужно. Просканировал в TextPad папки 'config' и 'scripts' - ни в одной нет буквосочетания "object_flags" ни в одном из файлов, кроме Вашего m_netpk. Malandrinus Из Вашего ответа, как я понял, следует, что ф-ция alife():create(....) не может создать объект на местности без каких-то граблей ? И в купе с ней необходима правка нет-пакета для такого объекта ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 18 Апреля 2012 Artos Получается, что корявый результат единственной ф-ции, позволяющей ввести объект в игру - это повод для комплиментов ПЫСам ? Добавлено через 18 мин.: Artos заморочки своих причуд и похотелок спаун обычного предмета, на обыкновенном грунте(поверхности), на обыкновенной локации - это заморочки моих причуд и похотелок ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 22 Апреля 2012 (изменено) Artos гораздо проще именно в алл.спавне прописывать спавн почти всех необходимых "обыкновенных" предметов ... - чем тогда назвать твое желание именно скриптом ящик динамита спавнить иначе, как не именно твоей похотелкой? Ну хотя-бы тем, что данный ящик я планирую использовать единственный раз, в единственном уникальном квесте. ТЧ v 1.0005 Вопрос по (спавну)созданию объектов. После вызова create(...), как происходит непосредственный процесс создания объекта, если объект спаунится в инвентарь актора(ГГ) ? Из того что я смог найти здесь на форумах я представлял себе это так: непосредственно при вызове 'create' движок создает серверную "часть" объекта. Затем, по "выходу" из ф-ции, в которой вызывали 'create' движок создает клиентскую часть. Вот только как ? Он использует уже существующую серверную часть, копируя из нее необходимые данные, или клиентская часть создается самостоятельно ? А затем синхронизируется с клиентской ? Изменено 22 Апреля 2012 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 23 Апреля 2012 malandrinus Системы здесь нет. Какие из параметров инициализируются по пп. первому, второму или третьему, зависит исключительно от типа объекта и его настроек. Как мне кажется, система как раз то и есть, надо только ее знать для конкретного объекта? Я пробовал для артефакта, примерно так: local npc = db.actor local se_obj = alife():create("af_night_star", npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) local pk = m_netpk.get(se_obj) -- запрос нет-пакета if pk and pk:isOk() then local data = pk:get() -- читаем данные из нет-пакета if data and data.upd then ---- and data.upd and data.upd.torch_flags if data.condition then data.condition = 0.35 -- изменяем свойство в 'state' пакете data.upd.condition = 0.35 -- изменяем свойство в 'update' пакете pk:set(data) end end end В результате получаю такую ситуацию - объект создается и нормально спаунится в инвентарь актора(ГГ), но серверная часть имеет "condition" 35%, как и установлено с помощью нет-пакета, а клиентская имеет "condition" в 100%. После save\load и та и другая части приходят к "condition" в 100%. Значит для такого объекта, на момент создания(спауна), движок параметр "condition" явно не синхронизирует между серверной и клиентской частями ? Подскажите, как это сделать ? Нашел здесь-же на форуме информацию о том, что оказывается не для всех объектов движок вообще делает синхронизацию клиентской\серверной частей - если нет биндера для объекта, нет и синхронизации. Сделал для артефактов биндер в таком виде: function init(obj) local new_binder = genegic_artefacts_binder(obj) obj:bind_object(new_binder) end class "genegic_artefacts_binder" (object_binder) function genegic_artefacts_binder:__init(obj) super(obj) end function genegic_artefacts_binder:reload(section) object_binder.reload(self, section) end function genegic_artefacts_binder:reinit() object_binder.reinit(self) end function genegic_artefacts_binder:update(delta) object_binder.update(self, delta) local object_id = self.object:id() local object_parent = self.object:parent() if object_parent then ----- арты в инвентаре актера\нпс ----- else ----- арты в онлайн ----- end end function genegic_artefacts_binder:net_spawn(data) if not object_binder.net_spawn(self, data) then return false end return true end function genegic_artefacts_binder:net_destroy() end function genegic_artefacts_binder:save(packet) end function genegic_artefacts_binder:load(reader) end Но видимо этого недостаточно, чего-то не хватает. Подскажите, чего ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 25 Апреля 2012 malandrinus, Artos Если надо сохранить, то сохраняй самостоятельно и всякий раз восстанавливай при выходе объекта в онлайн. Я ж нет против, но можно пример, как это сделать ? Вы обзывайте меня как угодно, но я от природы так устроен, что мне с примером проще будет разобраться с этим вопросом. И у Вас руки надеюсь не отсохнут, просто чуток кода для примера выложить ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 29 Июня 2012 (изменено) ColR_iT function spawn_npc() local npc = alife():create("npc", vector():set(мои_координаты), левел_вертекс_айди, гейм_вертекс_айди) local tbl = amk.read_stalker_params(npc) if npc then tbl.sid = 8000 amk.write_stalker_params(tbl, obj) end end Чтобы story_id читался, нужно перевести НПС оффлайн и обратно, либо сейв-лоад У меня такой вопрос по этой теме - после вызова create у нас создается сразу-же серверая часть объекта. Создается она сразу, потому как проверка "if npc then" возвращает истину. Или нет ? И здесь же, мы присваиваем нужный story_id используя нет-пакет. Далее, по выходу из ф-ции "spawn_npc", движек (будем рассматривать случай немедленного выхода НПС в он-лайн) создает клиентскую часть объекта. И клиентская часть не будет иметь нужный story_id. Теперь собственно вопрос - получается движек при создании клиентской части объекта не использует данные из серверной части ? Или использует, но не все ? Я думал, что серверная часть в момент спауна объекта, является "ведущей", т.е. создание клиентской части есть процесс копирования в нее параметров серверной. А уже затем клиентская часть, в процессе он-лайн жизни и в зависимости от получаемых извне изменений своих параметров, синхронизирует их на серверную строну ? Изменено 29 Июня 2012 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 29 Июня 2012 Потому что проблема с сидом совершенно в другом: сид не находится в реестре сидов. А не находится, потому что задаешь его после регистрации. Перехвати событие on_before_register и установи сид там. Что есть "реестре сидов" ? Имеется в виду game_story_ids.ltx ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 30 Июня 2012 abramcumner Вообще-то способ с прописыванием сида в on_before_register давно и успешно у меня работает Если не секрет, как Вы прописываете story_id. Используете self.m_story_id ? Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 30 Июня 2012 (изменено) abramcumner Прописываю также через нет-пакеты. Только делаю это в se_stalker:on_before_register Каким образом ? Я пробовал нижеприведенный код - в on_register() он нормально работает (только надо офф\он-лайн или save\load), а в on_before_register нет, не проходит проверка "if ser_obj then". function se_stalker:on_before_register() local ser_obj = alife():object(self.id) if ser_obj then local pk = m_netpk.get(ser_obj) -- запрос нет-пакета if pk and pk:isOk() then local data = pk:get() -- читаем данные из нет-пакета if data then if data.story_id ~= 93 then data.story_id = 93 pk:set(data) end end end end self:fill_exclusives() end Получается в on_before_register серверный объект еще не зарегистрирован, а он нужен для получения нет-пакета. Модуль m_netpk - авторства Artos'а. Подскажите, что не так ? kratos888 зачем мне ставить отметку на непися через другие функции, когда она ставится во время задания? Не зачем. Правильнее будет присвоить НПСу story_id, вот только как это сделать по-умнее я и сам пытаюсь узнать. Изменено 30 Июня 2012 пользователем AndreySol Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 1 Июля 2012 abramcumner Насчет self я чет и не подумал, а ведь так оно и есть. Кстати такой код всем подряд будет писать сид 93 Это было просто для примера. Поделиться этим сообщением Ссылка на сообщение
AndreySol 215 Опубликовано 15 Июля 2012 ins33 но хотелось бы добавить ключ, который позволит им пользоваться Что имеется в виду ? Если доступ к девайсу по вводу пароля, тогда к примеру глянь в сторону реализации кодового замка - кажись, то что тебе требуется. Если вариант с ключем, как с предметом - тогда и диалог не нужен, отслеживай появление ключа в инвентаре и выдавай по факту инфо-порцию. Поделиться этим сообщением Ссылка на сообщение