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

Скриптование


Svoboда

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

Подскажите, как можно выдать ГГ квест без диалога с кем-либо? Во всех уроках квесты активируются в диалоге. Мне нужно чтобы ГГ получал задание после перехода на локацию. Окружить точку перехода спейс-рестрикоторами или может какой-то способ потолковей есть?

Поделиться этим сообщением


Ссылка на сообщение
1 час назад, UriZzz сказал:

then

Функция получения квеста()

Ты имеешь ввиду, здесь нужно выдать игроку инфопорцию, которая стартует квест?

Поделиться этим сообщением


Ссылка на сообщение

Ок, спасибо. В скриптах я новичок, но с этим понятно. :good2: Сейчас буду разбираться, как повесить коллбэк на net_spawn  

Поделиться этим сообщением


Ссылка на сообщение

Всю голову сломал этими скриптами. Если я правильно понял, чтобы выдать ГГ задание сразу после перехода на локацию, то в файле 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

Поделиться этим сообщением


Ссылка на сообщение

Помогите новичку. Хочу выдать задание ГГ сразу после появления на локации. Вот так выглядит у  меня ф-ия 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'ом, но ничего не происходит. Задание не выдается. Название инфопорции и локации перепроверил - все верно

Поделиться этим сообщением


Ссылка на сообщение
7 минут назад, UriZzz сказал:

@Muzafir, а что за локация "simeiz"?

Локация моя. Недавно допилил графику. Хочу немного "оживить" перед релизом. Чтобы интереснее было изучать, если кто-то захочет глянуть.

Кстати, все заработало через функцию delta. Обычного звука получения задания нет, но задание в ПДА появляется. Через нет_спавн почему-то не получалось. 

Изменено пользователем Muzafir
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

таск в поршень добавлен. Не знаю, как с помощью скриптов проверить, что возвращает db.actor:has_info(), но таск создан. Это первое, что я проверил

Поделиться этим сообщением


Ссылка на сообщение

Ок. Попробую еще раз. Я тоже где-то читал, что так правильно, так и Zander_driver сказал, но почему-то не работало. Если не лень, гляньте выше, где я выложил целиком нет-спаун. Может куда-то не туда засовываю?

Поделиться этим сообщением


Ссылка на сообщение

Да, если при несуществующем инфопоршне получаю именно такой вылет

Если вешаю на нет_спаун, выше, строчек 

--' Загружаем настройки дропа
    death_manager.init_drop_settings()

Как только в перестрелке кого-либо убивают, получаю вылет с руганью на этот death_manager. script

Если после него просто ничего не происходит.

 

Если вешаю на update. Задание появляется в ПДА, но беззвучно и не засчитывается при убийстве группы нападающих (как должно). Тут, вероятно, что-то уже с заданием.

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

Поделиться этим сообщением


Ссылка на сообщение
2 минуты назад, Zander_driver сказал:

Если все условия срабатывают, то сам поршень смотри - вписан ли туда task, и правильно ли.

Все очень логично, что ты предлагаешь. Но почему этот же код при копи-пасте в delta-update работает?

Эх, Сталкер - ни шага без боли!!!

Поделиться этим сообщением


Ссылка на сообщение

 

3 минуты назад, mole venomous сказал:

Только процессор нагружает.

Я это понимаю, поэтому и хочу сделать по-человечески. 

Только что намеренно написал название локации неправильно. Никаких вылетов. 

Выходит это условие не проверяется?

Поделиться этим сообщением


Ссылка на сообщение
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)

Поделиться этим сообщением


Ссылка на сообщение

Нынешний код:

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

Изменено пользователем Muzafir
для наглядности

Поделиться этим сообщением


Ссылка на сообщение

Вносил, точно помню. Сейчас перепроверю, может накосячил там где-то

На всякий, настройки дропа - это death_items_by_communities.ltx?

Проверил, как ты сказал - и название локации и инфопорция точно правильны

Поделиться этим сообщением


Ссылка на сообщение

 В death_items_by_communities.ltx косяка нет. Я просто скопировал секцию и переименовал. 

Добавлю твою проверку. Еще раз спасибо.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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