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

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

@mortan, чтоб можно было разобрать через нет-пакеты свойства любого предмета. К примеру для показа простым наведением курсора какие именно патроны заряжены в конкретный ствол.
Мне нужно скриптовое решение, чтобы можно было и для ЧН адаптировать если надо. Правка движка ни разу не универсальный прием.

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

@TIGER_VLAD, Если используешь движок, где есть коллбэки на нажатие/удержание/отпускание клавиш (например, X-Ray extensions), то можно попробовать так:

[spoiler=noclip.script]

--[[ -------------------------------------------------------------------------------------------------------
-- File: 			noclip.script
-- Description: 	Noclip режим (режим свободного полета).
--]] -------------------------------------------------------------------------------------------------------
local debug_log = true 	-- Пишем лог? 	Да = true / Нет = false
local module_init = true
local module_name = script_name()
local function dbg_logf(fmt,...) if debug_log then log1(fmt,...) end end

noclip_active = true 	-- Вкл. = true / ВЫКЛ. = false
local distant_step = 1 	-- Кол-во метров, на который смещается камера в режиме NOclip.

-- Вкл./ВЫКЛ. режима NOclip. --
function noclip_ON_OFF()
	if (noclip_active == true) then
		dbg_logf("~~noclip  >>> OFF  ")
		noclip_active = false

		-- ВЫКЛ.режим бога. --
		local console = get_console()
		console:execute("g_god off")
	else
		dbg_logf("--noclip  >>> ON  ")
		noclip_active = true

		-- Вкл.режим бога. --
		local console = get_console()
		console:execute("g_god on")
	end
end

-- Коллбэк на удержание клавиши. --
function on_key_hold(key, bind)
	if (noclip_active == false) then return true end
	
	-- kR -- +1 метр к скорости! --
	if bind == key_bindings.kWPN_RELOAD then
		distant_step = distant_step + 1
	end
	
	-- kT -- -1 метр к скорости! --
	if bind == key_bindings.kWPN_FUNC then
		distant_step = distant_step - 1
		if distant_step <= 0 then
			distant_step = 1
		end
	end

	-- kW -- Вперед! --
	if bind == key_bindings.kFWD then
		local position 	= db.actor:position() 
		local direction = device().cam_dir
		db.actor:set_actor_position(position:mad(direction, distant_step))
	end

	-- kS -- Назад! --
	if bind == key_bindings.kBACK then
		local position 	= db.actor:position() 
		local direction = device().cam_dir
		db.actor:set_actor_position(position:mad(direction, (-distant_step)))
	end

	-- kA -- Стрейф влево! --
	if bind == key_bindings.kL_STRAFE then
		local position 	= db.actor:position() 
		local direction = device().cam_right
		db.actor:set_actor_position(position:mad(direction, (-distant_step)))
	end 

	-- kD -- Стрейф вправо! --
	if bind == key_bindings.kR_STRAFE then
		local position 	= db.actor:position() 
		local direction = device().cam_right
		db.actor:set_actor_position(position:mad(direction, distant_step))
	end

	-- kSpace -- Наверх! --
	if bind == key_bindings.kJUMP then
		local position 	= db.actor:position() 
		local direction = device().cam_top
		db.actor:set_actor_position(position:mad(direction, distant_step))
	end

	-- Left SHIFT 	-- Вниз! --
	if bind == key_bindings.kCROUCH_TOGGLE then
		local position 	= db.actor:position() 
		local direction = device().cam_top
		db.actor:set_actor_position(position:mad(direction, (-distant_step)))
	end

end

if module_init then
	dbg_logf("**DBG: LOADING MODULE: "..module_name..".script -- Ok. ")
end

 

 

 

Во время режима NOclip я включаю режим бога, чтоб гг не застрелили пока он летит до пункта назначения.

Клавишами R(по-умолчанию "Перезарядка") и T(у меня это = "Переключение на подствольник") регулирую скорость (а точнее, кол-во метров на которое смещается камера).

Клавиши: W,A,S,D - управление как обычно.

 

  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

@trantat, ну если гнаться за "универсальным" приёмом то далеко не уедешь если ты не скриптовый гуру. В любом случае я думаю это ещё кому-нибудь да пригодится. В скриптах увы ничем не могу помочь.

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

@Shkiper2012, Только что попробовал твой код, нажимаю T - cкорость уменьшается, но все равно большая. Я бы хотел добиться скорости приблизительную к скорости ходьбы. Пробовал изменять значение переменной на local distant_step = 0.1 и получаю

, когда ГГ летит не по направлению взгляда. Видать не получится у меня ничего, ну и на том всем спасибо. Изменено пользователем TIGER_VLAD
Ссылка на комментарий

@TIGER_VLAD,

Я тоже пытался реализовать функцию полета через db.actor:set_actor_position() и получил такой же результат как у Вас.

Скорее всего, это происходит из-за того что функция set_actor_position() корректирует передаваемые ей координаты на коллизию с объектами, что при малых значениях delta и дает наблюдаемый нами эффект.

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

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

S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)

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

Подскажите, почему когда я пишу верные координаты при спавне нпс через allspawn он появляется в другом месте...

пс: упд коорды и просто коорды указаны верно, проверял раз 5...

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

 

 

пишу верные координаты

Может дело в том, откуда Вы получили/взяли эти самые верные координаты? Вдруг они и не такае уж и верные?

Других причин вроде быть не должно.

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

 

 

почему когда я пишу верные координаты при спавне нпс через allspawn он появляется в другом месте
Откуда уверенность, что спавн происходит не по координатам ? И насколько это - в другом месте ? Из вариантов: непись может просто успевает свалить с точки спавна(такое возможно в зависимости от прописанной неписю логики\ее отсутствия), для непися выставлены флаги спавна с привязкой к AI-сетке - движок его подвинет к ближайшей ноде, если точка задана не на сетке.
  • Согласен 1
Ссылка на комментарий

@UnLoaded

Коорды ставил около перехода на свалку а непись появляется за жд насыпью со стороны сидора...


@UnLoaded,

Забыл сказать что непись мертвый.

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

Подскажите для ТЧ скриптовый аналог функции use_ai_locations. Если не ошибаюсь, через нет-пакеты этот флаг можно править.  

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

@hi_flyer, под ТЧ что ты понимаешь? В x-ray extensions есть этот метод. Если тебе нужно именно через нетпакет, то вот код, который я некоторое время использовал

function clear_used_ai_locations( sobj )
  local pk = get_netpk( sobj, 1 )
  if pk and pk:isOk() then
    local data = pk:get()
    data.object_flags = bit_and(
      data.object_flags, bit_not( object_flags.UsedAI_Locations )
    )
    pk:set( data )
  end
end

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

Так, что-то я туплю совсем. Есть два костра, с разными путями. Пути прописаны в секциях логики kamp1 и kamp2.

Между ними гоняется непись.

 

Инициализация непися выглядит так:

 

function add_to_binder( npc, ini, scheme, sect, st )
    local nm = npc:name()
    -- log( "info", "add_to_binder, %s...", nm )

    local kamp_end = xr_evaluators_id.stohe_kamp_base + 1
    local on_pos = xr_evaluators_id.stohe_kamp_base + 2

    local mgr = npc:motivation_action_manager()
    mgr:add_evaluator( kamp_end, evaluator_kamp_end( "kamp_end", st, sect ) )
    mgr:add_evaluator( on_pos, evaluator_on_position( "kamp_on_position", st, sect ) )

    local a = action_wait( nm, "action_kamp_wait", st )
    a:add_precondition( world_property( stalker_ids.property_alive, true ) )
    a:add_precondition( world_property( stalker_ids.property_danger, false ) )
    a:add_precondition( world_property( stalker_ids.property_enemy,    false ) )
    -- a:add_precondition( world_property( stalker_ids.property_anomaly, false ) )
    xr_motivator.addCommonPrecondition( a )

    a:add_precondition( world_property( on_pos, true ) )
    a:add_effect( world_property( kamp_end, true ) )
    mgr:add_action( xr_actions_id.stohe_kamp_base + 3, a )
    subscribe_action( npc, st, a )

    a = action_go_position( nm, "action_go_kamp", st )
    a:add_precondition( world_property( stalker_ids.property_alive, true ) )
    a:add_precondition( world_property( stalker_ids.property_danger, false ) )
    a:add_precondition( world_property( stalker_ids.property_enemy, false ) )
    -- a:add_precondition( world_property( stalker_ids.property_anomaly, false ) )
    xr_motivator.addCommonPrecondition( a )

    a:add_precondition( world_property( on_pos, false ) )
    a:add_effect( world_property( on_pos, true ) )
    mgr:add_action( xr_actions_id.stohe_kamp_base + 1, a )

    a = mgr:action( xr_actions_id.alife )
    a:add_precondition( world_property( kamp_end, true ) )
end

 

 

 

Если случается ивент "disable", неписю делается следующее:

 

    local kamp_end = xr_evaluators_id.stohe_kamp_base + 1
    local on_pos = xr_evaluators_id.stohe_kamp_base + 2

    local mgr = npc:motivation_action_manager()

-- todo: слишком сложно. ПРОСТО оторвать лишние эвалюаторы СОВСЕМ. Оставить все в одном.
    local a = mgr and mgr:action( xr_actions_id.alife )
    if a then a:remove_precondition( kamp_end )
    else log( "warning", "(%s):removeNpc, no action (alife) (%s)", self.center_point, npc:name() )
    end

    a = mgr:action( xr_actions_id.stohe_kamp_base + 3 )
    if a then
        xr_logic.unsubscribe_action_from_events( npc, st, a )
        mgr:remove_action( xr_actions_id.stohe_kamp_base + 3 )
        -- log( "info", "(%s):removeNpc, %s, 2", self.center_point, npc:name() )
    else log( "warning", "(%s):removeNpc, no action (action_kamp_wait) (%s)", self.center_point, npc:name() )
    end

    mgr:remove_action( xr_actions_id.stohe_kamp_base + 1 )
    -- log( "info", "(%s):removeNpc, %s, 3", self.center_point, npc:name() )

    mgr:remove_evaluator( kamp_end )
    -- mgr:add_evaluator( kamp_end, property_evaluator_const( true ) )
    mgr:remove_evaluator( on_pos )
    -- mgr:add_evaluator( on_pos, property_evaluator_const( true ) )

 

 

И, с новым сторейжем, опять дергается function add_to_binder()

 

Вот какого он продолжает выполнять action_go_position:execute(), благополучно пропустив action_go_position:initialize() ?

 

И как ему все-таки сказать, что вообще-то надо бы action_go_position:initialize() все-таки сделать ?
 

p.s. Зачем такие сложности ? По тому что без этого в какой-то момент начинается вообще адова каша: какая схема по какому эвалюатору дергается, и с чьим сторэйжем - черт ногу сломит.

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

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

p.s. Ну и конечно это вот колдунство с планировщиком для решения банальной задачи реинициализации схемы выглядит, мягко говоря, странно.

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

Адекватное решение - это вообще не плодить экшены, которые можно не плодить, да.

Раз уж оно именно так сделано.

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

Тэкс, граждане... А кто ТОЧНО знает, в чем смысл *:net_save_relevant() ?

Это, часом, не средство сказать, что объект МОЖНО сохранять, а иначе - НИ-НИ ?

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

@Dennis_Chikin, если я ничего не путаю, то true из этого метода говорит движку, что бы он сохранял клиентский объект при его переходе в оффлайн. Иначе, только при сейве в онлайне. Могу напутать, т.к. давно это смотрел.

  • Не согласен 1
Ссылка на комментарий

При переходе в офлайн он его не сохраняет совершенно точно В ПРИНЦИПЕ. В смысле, хоть true, хоть false, хоть эпическая поэма.

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

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

@Dennis_Chikin, у меня осталось в памяти впечатление, что оно делалось для того, что бы сохранять/не сохранять при переходе в оффлайн. Ну а то, как оно работает - это уже второй вопрос. Оно не только в этом вопросе работает совсем не так, как задумывалось и декларировалось.

  • Не согласен 1
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...