Перейти к содержанию

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

 
 
49 минут назад, denis2000 сказал:

Neptun Могу посоветовать глянуть в сторону менеджера заданий task_manager.script. Теоретически через него можно осуществить все требуемые манипуляции.

Уже глядел и даже добился некоторого результата: вывел на экран расстояние до точки активного задания в онлайн режиме, но вот в чем соль: функция работает только с последним заданием из списка (что видно в пда) , игра не читает, какой квест в приоритете, а просто берет крайнее. 

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


Ссылка на сообщение
Поделиться на другие сайты
 

Neptun если я правильно понял, что именно нужно

local task = db.actor:get_task("id задания", true)
    if task and db.actor:is_active_task(task) then ...

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

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


Ссылка на сообщение
Поделиться на другие сайты
 
9 минут назад, M31 сказал:

Neptun если я правильно понял, что именно нужно

local task = db.actor:get_task("id задания", true)
    if task and db.actor:is_active_task(task) then ...

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

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


Ссылка на сообщение
Поделиться на другие сайты
 

Neptun А активное и выделенное задание - это разные объекты?

У таска есть статус selected, но статуса active нет.

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

Путь во мгле. Связь времен.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

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


Ссылка на сообщение
Поделиться на другие сайты
 

Neptun в смысле, надо что-то делать с каждым выделенным заданием, а не с каким-то определенным? Опиши что именно хочешь сделать

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

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


Ссылка на сообщение
Поделиться на другие сайты
 
14 минут назад, denis2000 сказал:

Neptun А активное и выделенное задание - это разные объекты?

У таска есть статус selected, но статуса active нет

Активное, значит Гг его взял, выделенное - он его отслеживает. Игра походу так это видит.

Статус такой тоже видел и даже писал проверку под него, но как-то не задалось, может, неправильно делал? 


Дополнено 2 минуты спустя
6 минут назад, M31 сказал:

Neptun в смысле, надо что-то делать с каждым выделенным заданием без списков заданий? Опиши что именно хочешь сделать

Если список заданий, которые Гг взял, они в пда все отмечены. Когда нажимаешь на tab, то появляются подробности текущего задания, игрок может менять текущее задание на любое доступное. Мне нужно проверить, что игрок отслеживает какое-то (абсолютно любое, ведь заданий может и не быть вовсе) текущее задание, опираясь от этого я совершу ряд иных манипуляций с данным заданием. 

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


Ссылка на сообщение
Поделиться на другие сайты
 
58 минут назад, Neptun сказал:

что игрок отслеживает какое-то (абсолютно любое, ведь заданий может и не быть вовсе) текущее задание, опираясь от этого я совершу ряд иных манипуляций с данным заданием

Есть подготовленный список id заданий и соответствующих им действий или будешь делать одинаковое действие с любым выбранным игроком заданием? Вот что хочу узнать

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

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


Ссылка на сообщение
Поделиться на другие сайты
 
13 минут назад, M31 сказал:

Есть подготовленный список id заданий и соответствующих им действий или будешь делать одинаковое действие с любым выбранным игроком заданием? Вот что хочу узнать

Второе. Любое выбранное игроком задание. 

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


Ссылка на сообщение
Поделиться на другие сайты
 

Neptun если с self.status не работает, можно в check_task проверять db.actor:is_active_task. Только делай проверку на то, что выбранное задание сменилось, постоянно проверяться будет. Например, в начале файла добавляешь local act_task = "", и в check_task 

   if act_task == "" or (db.actor:is_active_task(self.t) and act_task ~= self.id) then
       act_task = self.id
        ...
   end

Ну как вариант, если других способов не подскажут

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


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, Neptun сказал:

Статус такой тоже видел и даже писал проверку под него, но как-то не задалось, может, неправильно делал?

По эксперементировал сейчас и судя по всему статус selected вообще движком не выставляется.

Скорее всего метод предложенный уважаемым M31 и придется использовать (если конечно движок не редактировать).

  • Жму руку 1

Путь во мгле. Связь времен.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

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


Ссылка на сообщение
Поделиться на другие сайты
 

Здравствуйте, ещё раз, как убрать мини-карту и панель быстрых предметов. Очень много смотрел про это,но там меняли их координаты,а мне надо чтобы вообще в игре их не было. 

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


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, M31 сказал:

Neptun если с self.status не работает, можно в check_task проверять db.actor:is_active_task. Только делай проверку на то, что выбранное задание сменилось, постоянно проверяться будет. Например, в начале файла добавляешь local act_task = "", и в check_task 

   if act_task == "" or (db.actor:is_active_task(self.t) and act_task ~= self.id) then
       act_task = self.id
        ...
   end

Ну как вариант, если других способов не подскажут

Р

Действительно, работает: переключаю задания, происходит обновление, но только один раз, к сожалению, проблема ведь в том, что задание в процессе игры обновляется, а функция продолжает читать старые данные. Есть ли способ впихнуть обновление действия?

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


Ссылка на сообщение
Поделиться на другие сайты
 
30 минут назад, Pastalker56 сказал:

их координаты,а мне надо чтобы вообще в игре их не было. 

Костыльный вариант:
1) Слоты быстрого использования: сдвинуть элементы с худа, а сам функционал загасить unbind'ами через get_console(). При этом стоить помнить, что пользователь может вернуть функционал через консоль (конечно, если не выводить данное действие на апдейт, чего делать категорически не советую).
2) Миникарту также можно вывести за пределы экрана, при этом пиликающие звуки заменить $no_sound'ом.

Если же нужно ограниченить функциональность на уровне движка (полностью выпиливать не советую, потому что у Вас есть все шансы поломать другие механики, ибо опыта, как пониманию, в C/C++ нет):
1) Отключить работу самих кейбиндов можно в xrGame/ActorInput.cpp, для этого достаточно подрезать кейсы с kQUICK_USE_1 по kQUICK_USE_4. Статики на экране можно либо попросту сдвинуть за границы худа, либо отследить их инициализацию и зачистить все упоминания (чего, опять же, делать не советую).
2) Миникарта (CUIZoneMap) отрисовывается в методе Draw() класса CUIMainIngameWnd (xrGame/ui/UIMainIngameWnd.cpp). Достаточно закомментировать соответствующую строчку кода.

  • Спасибо 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : C:\xray\stcop_engine\src\xrServerEntities\script_engine.cpp
[error]Line          : 213
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...r. call of pripyat\gamedata\scripts\xr_conditions.script:698: attempt to index field 'actor' (a nil value)

Помогите, вылетает при save-load. Заранее спасибо

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

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


Ссылка на сообщение
Поделиться на другие сайты
 

Neptun какие данные у задания считываются?

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


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, M31 сказал:

Neptun какие данные у задания считываются?

Его target. Пробовал добавить условия else, но игра почему-то выводила данные предыдущего задания, то есть если я выбрал задание 2, то данные о метке идут с задания 1, и наоборот: выбрал задание 1, данные от задания 2; если выбрал задание 3, а перешёл от задания 1, то получаю данные задания 1.

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


Ссылка на сообщение
Поделиться на другие сайты
 
В 03.12.2022 в 14:22, GameCube сказал:

Люди, кто-нибудь знает как сделать чтобы сталкеры во время выброса двигались в укрытия, а то они как сидели , так и сидят на своих коврах. Укрытия я вроде везде прописал. Но можете перечислить список файлов где надо вносить изменения, может что пропустил. Заранее спасибо.

GameCube По хорошему NPC должны "сами" решать, как реагировать на выброс. А именно куда и как прятаться и прятаться ли. А не руководствоваться прописанными ltx-костылями-скриптами. Которые для большинства NPC как раз отсутствуют. Если, конечно, они не какие-то особенные квестовые товарищи со специфичным уникальным поведением именно в выброс.

Эта задача решается добавлением поведенческой схемы с околовысшим приоритетом. На птичьем языке это выглядит так:

class "eva_surgeon" (property_evaluator) -- v460 npc should react to surge if he is got no exclusive/dynamic surge job already
function eva_surgeon:__init(storage, eva_name) super(nil, eva_name)
	self.st = storage
	self.engaged = false
end
function eva_surgeon:evaluate()
	if doin(self.cooldown) then
		return self.engaged
	end
	local npc = alive_stalker(self.object) -- v456 assert, zombied not allowed
	if not npc then
		self.cooldown = ttt_time() + 88888888 -- permanent ban; this doubles ban established at set_scheme (for tst -- v444)
		self.engaged = false
		state_mgr.beh_set(self.object and self.object:id(), "npc_wanna_hide_from_surge", false) -- v416 script behaviour processing
		return false
	end
	self.cooldown = ttt_time() + math.random(24000, 36000) -- update animpoint eva just once per 5 seconds (+- crowd disperse), unless action is triggered
	local nid = npc:id()
	if xr_conditions.surge_started()
		and not npc:critically_wounded() -- oopse
		-- or state_mgr_movement.stucked[nid] -- v469 tst centralized antistuck protocol
	then

		-- v461 off glitching dynamic walker action
		-- local st = db.storage[nid]
		-- local as = st and st.active_section
		-- -- debug23(nid, 3, "%s %s eva_surgeon:eva as %s", nid, self.object:name(), as)
		-- if type(as) ~= "string"
		-- 	or not as:find("surge") -- npc already should be reacting
		-- then

			-- debug23(nid, 3, "%s %s npc_wanna_hide_from_surge true", nid, self.object:name())
			state_mgr.beh_set(nid, "npc_wanna_hide_from_surge", true)
			self.engaged = true
			return true

		-- end

	end
	-- debug23(npc:id(), 3, "%s eva_reflex false", npc:id())
	state_mgr.beh_set(nid, "npc_wanna_hide_from_surge", false) -- v416 script behaviour processing
	self.engaged = false
	return false
end
class "act_surgeon" (action_base)
function act_surgeon:__init (npc, action_name, storage) super(nil, action_name)
	self.st = storage
end
vars.surge_covers = {}
function act_surgeon:initialize()
	action_base.initialize(self)
	-- npc should choose the nearest level/online cover; level covers are preselected at load
	local nearest_dist = 88888888
	local nearest_vert
	local npc = self.object
	local npc_pos = npc:position()
	for vert, pos in pairs(vars.surge_covers) do
		local dist = npc_pos:distance_to_sqr(pos)
		if dist < nearest_dist then
			nearest_dist = dist
			nearest_vert = vert
		end
	end
	self.vertex = nearest_vert
	if self.vertex then
		if vars.surge_cover_vertexes[self.vertex] then
			local vertexes = vars.surge_cover_vertexes[self.vertex]
			local vert
			local n = {}
			for k,_ in pairs(vertexes) do
				n[#n + 1] = k
			end
			local num = #n
			for i=1, num do -- CPU hung/lock preventor
				local v = n[math.random(num)]
				if not db.used_level_vertex_ids[v]
					and npc:accessible(v)
				then
					vert = v
					break
				end
			end
			if vert then
				self.vertex = vert
			end
		end
		self.pos = level.vertex_position(self.vertex)
		debug32(3, "%s act_surgeon:ini %s %s", npc:id(), npc:name(), self.vertex)
	end
end
function act_surgeon:execute()
	action_base.execute(self)
	if doin(self.cooldown or 1) then
		return
	end
	self.cooldown = ttt_time() + math.random(12000, 18000)
	local npc = alive_stalker(self.object) -- zombied not allowed: they are immune to any surges
	if not self.vertex
		or not npc
	then
		return
	end
	local nid = npc:id()
	move_mgr.mm_disable(nid)
	local state
	local dist = npc:position():distance_to_sqr(self.pos)
	if dist < 4 then
		state = random_choice(
			"guard",
			-- "guard_chasovoy",
			"guard_na",
			-- "threat",
			-- "threat_danger",
			-- "threat_heli",
			-- "threat_na",
			"hide",
			"hide_na",
			"caution",
			"ward",
			"fold_arms",
			"search",
			"sit",
			"psy_pain",
			"smoking_stand",
			"ispug",
			"drunk_stand",
			"probe_stand",
			"probe_crouch",
			"animpoint_stay_ohrana",
			"drink_vodka_stand"
		)
		local timing = vars.anim_special_timings[state]
		if timing then
			self.cooldown = ttt_time() + timing
		else
			self.cooldown = self.cooldown + math.random(23000, 69000)
		end
		ttt_lib.send_to_vertex(nid, npc:level_vertex_id(), "act_surgeon@ttt@3488", state)
	elseif dist < 64 then
		state = random_choice("sneak_run_no_wpn", "walk", "walk", "run")
		ttt_lib.send_to_vertex(nid, self.vertex, "act_surgeon@ttt@3491", state)
	elseif dist < 1024 then
		state = random_choice("walk", "run", "run", "sprint")
		ttt_lib.send_to_vertex(nid, self.vertex, "act_surgeon@ttt@3491", state)
	else
		state = random_choice("run", "sprint", "sprint")
		ttt_lib.send_to_vertex(nid, self.vertex, "act_surgeon@ttt@3491", state)
	end
	state_mgr.set_state(npc, state, nil, nil, {look_mod = look.path_dir})
	debug23(nid, 3, "%s act_surgeon:exe %s %s %s->%s(%s)",
		nid, npc:name(), state, npc:level_vertex_id(), self.vertex, round(npc:position():distance_to(level.vertex_position(self.vertex))))
end
function act_surgeon:finalize()
	action_base.finalize(self)
end

После чего эта пара evaluator/action должна быть грамотно прописана среди прочих схем. Язык назван "птичьим", потому что это из самописной скриптовой реализации, где вся сердцевина скриптового "ИИ" полностью переписана (это под Аномалию). Привожу как пример и общий принцип.

Конкретно в моей реализации NPC побежит до ближайшего укрытия, где не будет кучковаться в одну точку, а рассредоточится по помещению и будет реагировать разнообразно. Также у меня из-за наивысшего приоритета прекращается стрельба. Но это по вкусу.

Как-то так...

  • Мастер! 1

Я логи в баню удалил, а вот за за рейдеры – не помню!

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


Ссылка на сообщение
Поделиться на другие сайты
 

BarmaGlot ну в оригинальном зп, обычные дефолтные нпсы бегут к ближайшему укрытию. Прикол в том что, если я буду в укрытии, то они выживут, а если я буду не в укрытии, они также погибают как и гг. Вот я и подумал как дать им команду идти в укрытие. То есть они сами должны идти? Без всяких правок в файлах?


Дополнено 0 минут спустя

Kion что перед вылетом делали?

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


Ссылка на сообщение
Поделиться на другие сайты
 
42 минуты назад, GameCube сказал:

BarmaGlot ну в оригинальном зп, обычные дефолтные нпсы бегут к ближайшему укрытию. Прикол в том что, если я буду в укрытии, то они выживут, а если я буду не в укрытии, они также погибают как и гг. Вот я и подумал как дать им команду идти в укрытие. То есть они сами должны идти? Без всяких правок в файлах?


Дополнено 0 минут спустя

Kion что перед вылетом делали?

В way прописывается путь surge для каждого смарта отдельно. Если правильно прописать, то дефолтные нпс без логики сами пойдут к укрытию. 

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


Ссылка на сообщение
Поделиться на другие сайты
 

Neptun можно где-нибудь в if task_updated and not(self.dont_send_update_news) then делать act_task = "". Или в другое условие прописать, но чтобы выше проверки на is_active_task было

Изменено пользователем M31
  • Аплодисменты 1

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


Ссылка на сообщение
Поделиться на другие сайты
 
4 часа назад, GameCube сказал:

в оригинальном зп, обычные дефолтные нпсы бегут к ближайшему укрытию. Прикол в том что, если я буду в укрытии, то они выживут, а если я буду не в укрытии, они также погибают как и гг. Вот я и подумал как дать им команду идти в укрытие. То есть они сами должны идти? Без всяких правок в файлах?

GameCube Именно, как бы "сами", как бы "подумав". Это, действительно, со стороны должно казаться "думанием, искусственным интеллектом" (и, по факту, его натуральный зачаток). В противовес (или, скорее в дополнение) той "логике", что там в ltx-скриптах "наглухо" прописана мод-мейкером, как вот Neptun говорит:

3 часа назад, Neptun сказал:

В way прописывается путь surge для каждого смарта отдельно. Если правильно прописать, то дефолтные нпс без логики сами пойдут к укрытию. 

Беда в том, что эта ltx-логика может и часто бывает не прописана вовсе или прописана неграмотно, ну и всякие разные ситуации "недефолтные". А в парадигме "думания" NPC натурально будет "думать" так же как и человек, расставляя приоритеты для широкого спектра своих действий и/или "инстинктов".

  • Спасибо 1

Я логи в баню удалил, а вот за за рейдеры – не помню!

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


Ссылка на сообщение
Поделиться на другие сайты
 

BarmaGlot понял, то есть можно не заморачиваться по этому поводу.

  • Смех 1

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


Ссылка на сообщение
Поделиться на другие сайты
 
6 часов назад, GameCube сказал:

 

Kion что перед вылетом делали?

Карту локации в ПДА добавлял

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

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


Ссылка на сообщение
Поделиться на другие сайты
 

Здравствуйте, как сделать так чтобы в инвентаре отображались скрытые предметы, типа фонарик,нож...

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


Ссылка на сообщение
Поделиться на другие сайты
 

Kion сбой в скриптах. В каких файлах делали изменения?

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


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   2 пользователя онлайн