Muzafir 19 Опубликовано 18 Августа 2020 Подскажите, как можно выдать ГГ квест без диалога с кем-либо? Во всех уроках квесты активируются в диалоге. Мне нужно чтобы ГГ получал задание после перехода на локацию. Окружить точку перехода спейс-рестрикоторами или может какой-то способ потолковей есть? Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 18 Августа 2020 1 час назад, UriZzz сказал: then Функция получения квеста() Ты имеешь ввиду, здесь нужно выдать игроку инфопорцию, которая стартует квест? Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 18 Августа 2020 Ок, спасибо. В скриптах я новичок, но с этим понятно. Сейчас буду разбираться, как повесить коллбэк на net_spawn Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 18 Августа 2020 Всю голову сломал этими скриптами. Если я правильно понял, чтобы выдать ГГ задание сразу после перехода на локацию, то в файле bind_stalker.script нужно найти функцию function actor_binder:net_spawn(data) и в нее вставить такой кусок кода: if (level.name() == "simeiz") and -- название локации not has_alife_info("keep_base_defend") then -- и данная инфопорция (старт квеста) не выдавалась self.object:give_info_portion("keep_base_defend ") – выдать ее end 4 Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 Помогите новичку. Хочу выдать задание ГГ сразу после появления на локации. Вот так выглядит у меня ф-ия actor_binder:net_spawn(data) function actor_binder:net_spawn(data) printf("actor net spawn") level.show_indicators() self.bCheckStart = true self.weapon_hide = false -- спрятано или нет оружие при разговоре. weapon_hide = false -- устанавливаем глобальный дефолтовый флаг. if object_binder.net_spawn(self,data) == false then return false end db.add_actor(self.object) if self.st.disable_input_time == nil then level.enable_input() end self.weather_manager:reset() -- game_stats.initialize () if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end --' Загружаем настройки дропа death_manager.init_drop_settings() if (level.name() == "simeiz") and not has_alife_info("keep_base_defend_started") then self.object:give_info_portion("keep_base_defend_started") end return true end Как видно, свой код я вставил перед return'ом, но ничего не происходит. Задание не выдается. Название инфопорции и локации перепроверил - все верно Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 Пробовал только что. Получаю вылет без лога Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 (изменено) 7 минут назад, UriZzz сказал: @Muzafir, а что за локация "simeiz"? Локация моя. Недавно допилил графику. Хочу немного "оживить" перед релизом. Чтобы интереснее было изучать, если кто-то захочет глянуть. Кстати, все заработало через функцию delta. Обычного звука получения задания нет, но задание в ПДА появляется. Через нет_спавн почему-то не получалось. Изменено 20 Августа 2020 пользователем Muzafir 1 Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 таск в поршень добавлен. Не знаю, как с помощью скриптов проверить, что возвращает db.actor:has_info(), но таск создан. Это первое, что я проверил Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 Ок. Попробую еще раз. Я тоже где-то читал, что так правильно, так и Zander_driver сказал, но почему-то не работало. Если не лень, гляньте выше, где я выложил целиком нет-спаун. Может куда-то не туда засовываю? Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 (изменено) Да, если при несуществующем инфопоршне получаю именно такой вылет Если вешаю на нет_спаун, выше, строчек --' Загружаем настройки дропа death_manager.init_drop_settings() Как только в перестрелке кого-либо убивают, получаю вылет с руганью на этот death_manager. script Если после него просто ничего не происходит. Если вешаю на update. Задание появляется в ПДА, но беззвучно и не засчитывается при убийстве группы нападающих (как должно). Тут, вероятно, что-то уже с заданием. Изменено 20 Августа 2020 пользователем Muzafir Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 2 минуты назад, Zander_driver сказал: Если все условия срабатывают, то сам поршень смотри - вписан ли туда task, и правильно ли. Все очень логично, что ты предлагаешь. Но почему этот же код при копи-пасте в delta-update работает? Эх, Сталкер - ни шага без боли!!! Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 3 минуты назад, mole venomous сказал: Только процессор нагружает. Я это понимаю, поэтому и хочу сделать по-человечески. Только что намеренно написал название локации неправильно. Никаких вылетов. Выходит это условие не проверяется? Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 2 минуты назад, Zander_driver сказал: Дык он "написанное" сравнивает с тем, что возвращает level.name(). В "написанном" что угодно может быть, вылета от этого не будет. Ты все же проверь так как я тебе написал. ок, сейчас догнал Если поставить выше деф-менеджера вылет такой: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...a.l.k.e.r. soc\gamedata\scripts\death_manager.script:135: bad argument #1 to 'pairs' (table expected, got nil) Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 (изменено) Нынешний код: function actor_binder:net_spawn(data) printf("actor net spawn") level.show_indicators() self.bCheckStart = true self.weapon_hide = false -- спрятано или нет оружие при разговоре. weapon_hide = false -- устанавливаем глобальный дефолтовый флаг. if object_binder.net_spawn(self,data) == false then return false end db.add_actor(self.object) if self.st.disable_input_time == nil then level.enable_input() end self.weather_manager:reset() -- game_stats.initialize () if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end if (level.name() == "simeiz") and not has_alife_info("keep_base_defend_started") then self.object:give_info_portion("keep_base_defend_started") end --' Загружаем настройки дропа death_manager.init_drop_settings() return true end death_manager - стандартный. Я только в конце одной строки дописал новую группировку. На количество строк это не повлияло 135 строка - это for k,v in pairs(spawn_items) do --' Доспавниваем необходимое количество итемов: --' Необходимо составить список объектов которые могут быть заспавнены для персонажа local spawn_items = item_by_community[self.npc:character_community()] for k,v in pairs(spawn_items) do --' По каждому объекту необходимо получить зависимости if check_item_dependence(self.npc, k) == true then --' По каждому объекту необходимо получить количество local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max)) --' Необходимо заспавнить нужное количество. create_items(self.npc, k, number, v) end end end Изменено 20 Августа 2020 пользователем Muzafir для наглядности Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 Вносил, точно помню. Сейчас перепроверю, может накосячил там где-то На всякий, настройки дропа - это death_items_by_communities.ltx? Проверил, как ты сказал - и название локации и инфопорция точно правильны Поделиться этим сообщением Ссылка на сообщение
Muzafir 19 Опубликовано 20 Августа 2020 В death_items_by_communities.ltx косяка нет. Я просто скопировал секцию и переименовал. Добавлю твою проверку. Еще раз спасибо. Поделиться этим сообщением Ссылка на сообщение