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

[SoC] Ковыряемся в файлах


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

@AndrewMor, давай начнем с простого. Как созданы циклические задания в оригинале? Далее проецируй реализацию оригинала на свою, какие отличия? Задание можно создать полностью в скрипте, иными словами доступно создание полноценного генератора, и как выдавать в таком случае квесты - решать только тебе. Рандомный квест выдать очень просто, делаешь несколько инфо, подшиваешь к каждому таск и рандомно выдаешь, если предполагается цикличность, то выключаешь инфопоршни либо создаешь какие-то флаги, на этом все. В CRandomTask, несмотря на его название, квесты не рандомны, для каждого существует однозначный прекондишн, таких моментов чтобы тебе на голову свалилось какое-попало задание нет и быть не может (без дополнительных правок, разумеется).

 

@UnLoaded, @HellRatz, блокировка перехода достаточно однозначная операция, что тут не понятного? Блокировка предполагает оставить активность режект пути чтобы юзер, в случае чего, не убежал и не свалился с локации, для такого случая ваши варианты не годятся, нужно переделывать интерфейс, просто забить еще один месадж бокс и пинать актора по режект пути если переход заблокирован, я предлагаю пойти таким путем. вывести несколько функций, написать биндер и подшить обработку кастом даты чтобы было удобно управлять активностью с помощью кондлиста, это не лучший вариант, но определенно неплохой и достаточно простой и быстрый.

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

 

 

Рандомный квест выдать очень просто,

Может, я не совсем правильно объяснил: циклический квест есть и работает. Просто нужно выдать не из диалога, а скриптом. Во всяком случае, я пока не въехал, как. Был бы благодарен за пример.

Сталкер - наше всё!

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

[tm_eliminate_camp_5]

type = eliminate_lager

community = actor

;--init_condition = {=actor_on_level(l02_garbage) +agroprom_military_case_have}

 

task_manager.script (переписанный):

function CRandomTask:actor_update()	-- Проверяем можем ли мы сейчас выдать какой либо самоинициализующийся таск
	local t = self.task_info
	for k, v in pairs( self.task_id_self_inited ) do
		if t[v].enabled and t[v].status == "normal" then
			if self:check_task_props( v )
			  and pick_section( actor, actor, t[v].init_condition ) then
				self:action_give_task( actor, nil, nil, t[v].yes_phrase_id )
	end	end	end
end

блокировка перехода достаточно однозначная операция, что тут не понятного? Блокировка предполагает оставить активность режект пути чтобы юзер, в случае чего, не убежал и не свалился с локации,

Вот это как раз тот случай, когда на месте, где должен быть level_changer, ставится просто рестриктор, который дергает actor:set_actor_position()

Ну или невидимая стена чуть дальше области захвата level_changer'ом.

Изменено пользователем Dennis_Chikin
  • Полезно 1
Ссылка на комментарий

 

 

Вот это как раз тот случай, когда на месте, где должен быть level_changer, ставится просто рестриктор, который дергает actor:set_actor_position() Ну или невидимая стена чуть дальше области захвата level_changer'ом.

Level changer и есть рестриктор, зачем еще один? В него же пишешь флажок "выключенности", если активен, выдаешь при заходе хоть в сферу хоть в бокс месадж бокс с одной кнопкой, при нажатии на которую получаешь пинка по режект пути, а он из себя может представлять все что угодно, хоть wp (что с моей точки зрения лучше), хоть set_actor_position. На оригинале, я уже писал, все эти ченжеры на скриптах эмулируются элементарно, и ничего выключать там или удалять, в оффлайн переводить и еще куда-нибудь отправлять не требуется. Но лучше уже в движке сделать, там это во-первых быстрее, во-вторых проще, в третьих правильнее.

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

 

 

task_manager.script (переписанный):

А как квест-то выдать? Код

 

local new_task = CGameTask()

new_task:load("ecolog_eliminate_lager_1")

db.actor:give_task(new_task, 3600*1000, true)

 

не работает. Или как-то иначе выдавать надо?

Сталкер - наше всё!

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

Чего-то не хватает, да.

function CRandomTask:action_give_task( a, npc, p1, p2 )	-- Выдача квеста игроку

local task = CGameTask()

local id = self.task_id_by_yes_phrase_id[p2]

local nfo = self.task_info

local t = nfo[id]

local ct = t.complex_type

task:load( ct )

 

local t_type = t.type

task:set_title( t_type )

 

task:get_objective( 0 ):set_article_id( t.description )

local o = SGameTaskObjective( task, 1 )

o:set_description( t.name )

 

local tg = t.target_objects -- Выбираем текущую цель квеста

if tg then

tg = tg[ math_random( #tg ) ]

t.selected_target = tg

end

 

-- log( "info", "action_give_task: %s, id: %s", t_type, tostring( tg ) )

if t_type == "eliminate_lager" then

o:set_map_hint( t.text )

o:set_map_location( "eliminate_lager_location" )

o:set_object_id( tg )

elseif t_type == "defend_lager" then

local g = sim:object( tg )

if g then

o:set_map_hint( t.text )

o:set_map_location( "defend_lager_location" )

o:set_object_id( tg )

t.defend_target = ( ini and ini:section_exist( "random_task" )

and ini:line_exist( "random_task", "defend_target" )

and r_u32( "random_task", "defend_target" ) )

or abort( "CRandomTask:action_give_task, invalid custom data, (%s)", tg )

end

elseif t_type == "kill_stalker" then

o:set_map_hint( t.text )

o:set_map_location( "kill_stalker_location" )

o:set_object_id( tg )

storyline.check_kill_task( tg )

if t.target_dialog then -- Добавим id сталкера в список целей

-- amk_add_target_id_to_kill_targets( tg, t.target_dialog, id )

table_insert( kill_targets, { ["id"] = tg, t.target_dialog, ["task_id"] = id } )

pstor.kill_targets = kill_targets

end

elseif t_type == "find_item" then

o:set_map_hint( t.text )

o:set_map_location( "find_item_location" )

o:set_object_id( tg )

end

o:add_complete_func( "task_manager.task_complete" )

task:add_objective( o )

if t.need_return then

local parent = sid_by_npc[ t.parent ]

parent = parent and sim:story_object( parent )

if parent then

o = SGameTaskObjective( task, 2 )

local rt = return_task_by_type[ t_type ]

o:set_description( rt )

o:set_map_hint( game.translate_string( rt ) .. "\\n%c[255,160,160,160]" ..

game.translate_string( t.name ) )

o:set_map_location( "blue_location" )

o:set_object_id( parent.id )

task:add_objective( o )

else return -- Квестодателя прибили

end end

 

actor:give_task( task, ( t.time or 0 ) * 1000 * ( ( t.init_condition

and autoquest_time_factor ) or quest_time_factor ), false )

 

-- дизаблим все остальные задания данного типа, так как игрок не может одновременно обладать двумя заданиями одного типа.

t.status = "selected"

self.active_task_by_type[ct] = id

for k, v in pairs( nfo ) do

if v.complex_type == ct then v.enabled = false end

end

end

 

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

 

 

Чего-то не хватает, да.

Спасибо, буду пробовать.

Но изначально вопрос был в другом. Похоже, что квесты, описанные в таскс_имя_локации, повторно выдать вообще нельзя, так получается? Первично цель была выдавать многократно именно такой квест.

Сталкер - наше всё!

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

Почему же нельзя ? Очень даже можно. Если предусмотреть отсутствие конфликтов по чему попало с чем попало.

https://dl.dropboxusercontent.com/u/27871782/task_manager.script

Читаем, изучаем, и проникаемся пониманием, что ЭТО вообще не надо использовать ни для чего и ни в каком виде.

А нужно использовать что-нибудь другое.

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

 

 

Читаем, изучаем, и проникаемся пониманием, что ЭТО вообще не надо использовать ни для чего и ни в каком виде.

То, что находится по ссылке, я уж точно использовать не буду. А сие не из Солянки ли?

Сталкер - наше всё!

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

Камрады, прошу помощи. Есть торговец, прикручиваю к нему рандомные квесты. Квест на вынос лагеря не появляется в списке доступных, в чем тут дело? Квесты "Принести часть тела монстра", "Принести артефакт", "Найти предмет" в списке есть, а "Вынести лагерь" - нету??

 

;---------------Gavaez---------------------


;---------Eliminate lager-----------
gavaez_eliminate_camp_1
;---------Find Item-----------
gavaez_find_item_1
;---------Monster Part-----------
gavaez_monster_part_1
;--------Artefact---------------
gavaez_find_artefact_1


;--------------------Gavaez-----------------------------
[gavaez_eliminate_camp_1]
type = eliminate_lager
community = actor
text = gavaez_eliminate_camp_1_text
description = gavaez_eliminate_camp_1_descr
parent = gavaez
target = jup_st_stalker1
reward_money = 30000
reward_reputation = +20
reward_rank = 4
reward_item = medkit_scientic, medkit_scientic, medkit_scientic
prior = 1

[gavaez_find_item_1]
type = find_item
community = actor
text = gavaez_eliminate_camp_1_text
description = gavaez_eliminate_camp_1_descr
parent = gavaez
target = outfit_stalker_m1
reward_reputation = +30
reward_rank = 8
reward_item = protection_outfit
prior = 1

[gavaez_monster_part_1]
type = monster_part
community = actor
text = gavaez_eliminate_camp_1_text
description = gavaez_eliminate_camp_1_descr
parent = gavaez
target = mutant_snork_leg
reward_money = 8000
reward_reputation = +20
reward_rank = 2
reward_item = medkit_scientic, medkit_scientic, medkit_scientic
prior = 1

[gavaez_find_artefact_1]
type = artefact
community = actor
text = gavaez_eliminate_camp_1_text
description = gavaez_eliminate_camp_1_descr
parent = gavaez
target = af_fireball
reward_money = 15000
reward_reputation = +10
reward_rank = 5
prior = 1

 

 

Скрин:

http://i-fotki.info/20/225eaffc77cefaab39540bfc2c8f2768504662258756689.jpg.html

 

Кстати, квест на защиту лагеря тоже не появляется в списке. Почему?

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

Сталкер - наше всё!

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

@AndrewMor, для того, чтобы квест eliminate_lager появился, в гулаге должно быть пришедшее население, занявшее работы.

А для defend_lager - в кастом-дате обороняющегося смарта прописан нападающий смарт,

[random_task]
defend_target = story_id смарта 

и этот нападающий смарт должен быть в состоянии рейда (xr_gulag.getGulagState(defend_target) == 1) на обороняющийся.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
для того, чтобы квест eliminate_lager появился, в гулаге должно быть пришедшее население, занявшее работы.

Ага, а ларчик просто открывался. буду знать, спасибо. Гулаг-то у меня еще не заполнен, был создан только смарт-террейн.

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

Сталкер - наше всё!

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

Мои проблемы продолжаются, правда, немного в другом смысле. Создал смарт, гулаг, все заселил, все стоят/сидят/бродят под своей логикой. Квест на вынос лагеря тоже выдается и сдается. Но пробую респавнить сталкеров на тех же позициях (из секций в олл.спавне) - вот так:

 

1. В all.spawn в нужную секцию после логики пишу spawn_story_id = 60003

 

2. В game_spawn_story_ids.ltx прописываю jupiter_valet = 60003

 

3. Вызываю респавн конструкцией spawn_ids_object("jupiter_valet")

 

function spawn_ids_object(name_object)
  local ini = ini_file("game_spawn_story_ids.ltx")
  local spawn_story = ini:r_string("spawn_story_ids",name_object)
  local section_number = alife():spawn_id(tonumber(spawn_story))
  alife():create(section_number)
end

 

Респавн идет на ура, все НПС на своих местах, также стоят/сидят/бродят. Но квест на вынос лагеря по новой не выдается. Почему так?

 

(Предполагаю, что численность населения гулага равна 0, но ведь спавн НПС идет из секций олл.спавна, с привязкой к смарту)

Сталкер - наше всё!

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

Какого лешего это не работает?:

[logic]
active = {=get_state_render} ph_idle@check_power_status

[ph_idle@check_power_status]
on_info = {-lab_x7_power_on} %=turn_off_object% ph_idle@power_on

[ph_idle@power_on]
on_info = {+lab_x7_power_on} %=turn_on_object%

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

Опытным путем выяснил. Для подсчета населения гулага использую конструкцию

 

   local pop = xr_gulag.getGulagPopulationComed("jup_kpp")
   news_manager.send_tip(db.actor, pop, nil, nil, 30000)

 

1. Стартую НИ, узнаю популяцию - выдает 10, как и должно быть.

2. Беру квест на вынос лагеря, выношу лагерь, сдаю квест, получаю награду. Узнаю популяцию - 0, как и должно быть.

3. Респавню НПС вышеописанным способом. Узнаю популяцию - 10, т.е. все НПС берутся под смарт и занимают свои работы. Квест на вынос того же лагеря по новой не выдается, собсно, почему?

 

upd: Отбой, я просто дундук. Повторный квест выдается спустя игровые сутки :D

Изменено пользователем AndrewMor
  • Нравится 1

Сталкер - наше всё!

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

Я имел в виду, что означает этот вылет?

 

Expression : m_pItemDataVector->end() == t_it

Function : CXML_IdToIndex::InitInternal

File : e:\stalker\sources\trunk\xr_3da\xrgame\xml_str_id_loader.h

Line : 184

Description : duplicate item id

Arguments : agrund_semionov

 

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

@Hadzirim Hajad, Id agrund_semionov дублирован в xml файле. Врубай поиск в конфигах и стирай "клонов".

Изменено пользователем mzarkas
  • Полезно 1

Мы по аномалиям зону разберём!

Сидора повесим, а Бармена убьём!

Ну а вояк мы смоем в унитаз!

Пускай плывет в канализации спецназ!

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

Нужна логика НПЦ, вот такая - НПЦ стоит на месте, никуда не ходит. Но стреляет по врагам. Пробовал множество вариаций кемпера, режим снайпера - мой подопытный либо просто игнорил врага, либо начинал движение и воевал, а требуеться ведь полная его статичность...

 

Может есть у кого данный экземпляр...

Изменено пользователем CRAZY_STALKER666
  • Полезно 1

Не соответствует правилам.

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

 

 

но там даже иммунитетов для него нет...

veh_btr_u_01 не пробовал покопать? Там есть секция иммунитетов.

  • Спасибо 1
Ссылка на комментарий
Как это исправить?

Попробуй изменить в конфиге ножа hit_type_2 = wound_2 на hit_type_2 = wound. Этот способ быстрее, так как такие иммунитеты не только у бтра, но и у других машин. Чтобы не править иммунитеты каждой машины, можно изменить только конфиг ножа.

Изменено пользователем SkyLoader
  • Спасибо 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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