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

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


Svoboда

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

Доброго времени суток.

Вопрос: можно ли установить "состояние"(condition)  предмету на классе "антирада"?

Если - да, то как это корректно сделать.


local sim = alife()

local pos = db.actor:position()
local lvid = db.actor:level_vertex_id()
local gvid = db.actor:game_vertex_id()
local pid = db.actor:id()
local obj = sim:create("Мой предмет section", pos, lvid, gvid, pid)
if obj then
       obj:set_condition(0.5)
end

Либо так:
local se_obj = (alife():object(obj:id())
if se_obj then
      se_obj:set_condition(0.5)
end

Итог: вылет со строкой: attempt to call method 'condition' (a nil value)

 

Мне это нужно для того, чтобы: несколько таких предметов не группировались в инвентаре ГГ, для отслеживание их состояния, а так же возможность их использования. Если подобное уже описывалось на форуме - ткните куда копать. Поиск не выдал ничего конкретного(либо я плохо искал.).

Заранее признателен.

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

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


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

Признателен всем ответившим.

Для себя нашел такой выход, как создание "нового" класса на базе "object_binder" для нужного предмета.

И уже в нем задаю нужные параметры.

Хотя ХЕ и 7, тоже интересуюсь, но пока только хожу около них, как кот у горячей каши, а "съесть" не могу. =)

 

Ещё такой вопрос: как отловить момент перезарядки, разрядки и момент смены типов патронов у оружия? Есть ли флаг или что-то подобное для этого?

Я сейчас "ловлю" последний патрон в стволе, но может быть есть более изящный способ?

 

Для версии ТЧ 1.0006, нужно для манипуляций с оружием.

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

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


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

@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

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


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

Снимаю флаг  flUsedAI_Locations (в данном примере для предметов из ящиков, чтоб не проваливались)

local sobj_item     = alife():object( obj_itm.id )
local pk            = m_netpk.get( sobj_item )
local data          = pk:get()
data.object_flags   = bit_and( data.object_flags, bit_not( 128 ) ) -- снять флаг flUsedAI_Locations
pk:set( data )

Как выставить флаг обратно, так же скриптом?  (В побитовой математике не шарю.)

 

@TIGER_VLAD Можно попробовать, через имитацию нажатия клавиши (если есть такой функционал).

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


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

Можно ли скриптом "повесить" актора в пространстве? Чтоб он завис в воздухе.

Пробовал делать через "db.actor:set_actor_position( ... точка в пространстве ... )",

и обновлять через апдейт - в результате камеру "колбасит не по-детстки".

Можно конечно, что-нибудь спавнить под актором и фиксировать, но это не то.

Есть варианты? Именно скриптом.

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


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

[ЗП, СоС]

Можно ли скриптово отловить момент(...какой-либо флаг, поршень, окно...),

когда при разговоре с механиком, открыто окно с ремонтом/апгрейдами для предметов?

 

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


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

[ЗП, СоС]

Как скриптово отследить в каком положении находится актор (идёт/бежит/сидит/в глубоком присяди/и т.п...).

Есть ли какой-либо флаг/метод/что-либо?

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


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

[ЗП, СоС]

Как заставить нпс скриптом перезарядить оружие, которое держит в руках (с анимацией и прочим)?

Смотрел как сделано у @Bak в AI Additions, но так до конца и не понял.

Вроде используется такая штука, после кучи проверок:

    npc:set_item(object.aim_force_full1,wpn)

Пытаюсь сделать по аналогии, типа так:

Скрытый текст

-- добавление недостающих команд для оружия
if not object.aim_force_full1 then
    object.aim_ready1 = object.drop+1                   -- eObjectActionAimReady1 = 12
    object.aim_ready2 = object.aim_ready1+1             -- eObjectActionAimReady2 = 13
    object.aim_force_full1 = object.aim_ready2+1        -- eObjectActionAimForceFull1 = 14
    object.aim_force_full2 = object.aim_force_full1+1   -- eObjectActionAimForceFull2 = 15
end


local target_obj    = level.get_target_obj()
local npc           = target_obj
local wpn           = npc and npc:active_item()
if npc and wpn then
    log("reloading wpn -- start --")


    -- 1 -- Либо так: --
    -- npc:set_item( object.reload, wpn )
    -- npc:set_item( object.reload1, wpn )
    -- npc:set_item( object.reload2, wpn )


    -- 2 -- или так:
    npc:set_item( object.aim_force_full1, wpn )


    log("reloading wpn -- end --")
end

 

Ничего "не выходит" - нпс просто стоит "как ни в чем не бывало".

Или парой строк скрипта не обойтись (нужно писать схему поведения, добавлять в планировщик и т.д.)?

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

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


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

[ЗП/СоС]

Как прочесть/выставить режим огня для оружия, с помощью нет-пакетов?

Если есть готовые примеры, ткните, пожалуйста.

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


Ссылка на сообщение
В 18.11.2018 в 17:48, Fenrir02 сказал:

Как именно применить это на практике?

@Fenrir02,

в нужную функцию вставляем:

level.send_event_key_press(DIK_keys.DIK_F3) 

-- вместо "DIK_F3" может быть любая другая клавиша.

 

Результатом будет имитация нажатия,

как будто ты нажал на кл."F3" (не касаясь пальцем физически).

 

Только вот не помню, должна ли быть локация загружена в этот  момент,

так как используется пространство "level".

На всякий, может проверку поставить, типа "if level then ... end"

  • Спасибо 1

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


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

@Stalkersof попробуй так:

Скрытый текст
function upgradeS:spawn_item(spawn_item_sec, dist)
    -- спавним только в игре
    if self:check_game() then
        local s_obj = alife():create(spawn_item_sec, db.actor:position(),  db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
        if s_obj then
            local c_obj = level.object_by_id(s_obj.id)
            if c_obj then
                db.actor:move_to_slot(c_obj) -- Перемещаем объект в слот
            end
        end
    end
end

 

Ещё, у тебя метод называется "spawn_item" и параметр в этом методе называется так же --> upgradeS:spawn_item(spawn_item, dist)

В примере выше, изменил параметр на "spawn_item_sec".

Рекомендую их как-то различать, чтоб не было двойных толкований. В данном случае это не критично, но в других, может сыграть злую шутку.

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


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

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