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

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

А есть ли возможность через скрипт удалять все объекты из инвентаря ГГ определенного класса, сразу одним махом? Кто-нибудь знает?

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


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Den “Angry Wolf” Koslov сказал:

удалять все объекты из инвентаря ГГ определенного класса, сразу одним махом?

Можно все что невозможно, Зона жеж...
Как одна из кучи возможностей:

db.actor:inventory_for_each(function(item)
if item:section() == "секция_обжекта" then
alife():release(item, true)
end
end)

Ну или так:

if db.actor:object("секция_обжекта") ~= nil then
local obj = alife():object(db.actor:object("секция_обжекта"):id())
if obj then
alife():release(obj)
end
end

Вариации самих Разрабов можно отыскать в файле xr_effects.script для Арены хотя бы.
Ну а если правильно описать зачем это Вам и для каких условий, то точно подскажут верное решение.
А удалять по классу немного нелепо имхо - ибо один класс может содержать множество построенных на его настройках обжектов.

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


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

А удалять по классу немного нелепо имхо

Спасибо большое за примеры кода. Дело в том, что я создаю новый класс через движок, специально для этой цели. Идея заключается в следующем. Хотел реализовать, что-то на подобии команды  "удалить весь хлам в инвентаре" при этом хламу дать свой класс, чтобы не перечислять секции item'ов, так как мне нужно сделать так, чтобы остальные предметы снаряжения в рюкзаке оставались на своих местах. Хлам - это фишка геймплея.Так что я не совсем уверен если подойдут имена секций. По моему так скрипт будет игру сильнее нагружать ради проверки на весь хлам. 

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


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

2 вопроса:

1. Можно-ли через скрипты получать\устанавливать опьянение ГГ в ТЧ с X-Ray extension

2. Почему не работает db.actor:set_actor_position(ya_old) Отсюда:

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

function effct() -- ЭТА ВЫЗЫВАЕТСЯ НИЖЕ!
local npc = level_object_by_sid(926) 
	local pos, dir = npc:position(), npc:direction()
	local v = vector():set(pos)
	v.x = pos.x + 3 * math.cos(dir:getH())
	v.z = pos.z + 3 * math.cos(dir:getH())	
	db.actor:object('device_torch'):switch_torch(true)
	db.actor:set_actor_position(v)
	db.actor:set_actor_direction(-npc:position():sub(v):getH() )
end

function pred_mon(act, npc) -- ВЫЗЫВАЕМАЯ Ф-ЦИЯ!
	function _off () -- ВЛОЖЕННАЯ Ф-ЦИЯ! ВЫЗЫВАЕТСЯ НИЖЕ!
		local npc = level_object_by_sid(926)
		db.actor:set_actor_position(ya_old) -- НЕ РАБОТАЕТ, НО ОШИБОК НЕ ВЫЗЫВАЕТ
		ya_old = nil
		switch_offline_id(npc:id())
	end

	local a = db.storage[npc:id()].enemy
	if (a) and (a:section() == "dv_nom_x18_attack" or a:id() == 0) then
		_G.ya_old = vector():set(db.actor:position())
		effct() -- ОНА ВВЕРХУ
		nt.timer(2000, _off) -- ТУТ ВЫЗЫВАЕТСЯ (ЧЕРЕЗ 2 СЕК) ВЛОЖЕННАЯ Ф-ЦИЯ
		return true
	end
end

Функция из таймера вызывается корректно (НПС в оффлайн переходит и таймер "проверенный"), но возвращаться ГГ на своё место ни как не хочет!

 

Изменено пользователем Graff46
Дополнял

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


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

Это не нужно заворачивать в вектор:

_G.ya_old = db.actor:position()

Не?

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

Ранее был известен под ником BoBaH_671.

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


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

@Overfirst На всякий случай. Таким способом создаём новый вектор с параметрами заданного, что бы после манипуляций с исходным векторам не получилось неожиданностей. В луа переменные хранят ссылки на объекты и если объект где-то изменился - то и значение переменной после этого тоже изменится, такая трабла с таблицами бывает бесит. Также смотри как тут, у разрабов, utils.vector_copy_by_val()

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


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

[ЗП, СоС]

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

Смотрел как сделано у @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

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


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

Возможно кому-то известно как динамически менять текстуру для модели оружия? Предположим есть 3 текстуры калаша: новый, ржавый и сильно ржавый в зависимости от состояния. Есть ли возможность как-то менять текстуру через скрипт?

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


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

@Den “Angry Wolf” Koslov Можно, на движковых правках.

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


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

Здрасьте.

 

Пытаюсь добавить подложку к счетчику радиации в контейнере для 8 артов (солянка 2010), чтобы сделать текст заметным на фоне любого арта. Добавил в список новую текстуру (строки, отмеченные знаком "+"), теперь вижу счетчик на подложке, но поверх пустых ячеек – текстуры артов не отображаются. Поменял местами текстуры артов и подложки – вижу исходный вариант с счетчиком поверх артов, но без подложки. Какой должен быть код, чтобы получить порядок вывода "ящик - арт - подложка - счетчик"?

 

[scripts\arc_ui_8container_menu.script]

    b:InitTexture("ui\\ui_icon_equipment")
    b:SetOriginalRect(tx,ty,50,50)

 

+   b:InitTexture("ui\\ui_dg_arc_back")
+   b:SetOriginalRect(0,0,50,50)
    
    b:SetText(t)
    b:SetTextColor(255,0,255,255)

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


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

Можно ли считать код равносильным?
 

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

function get_stat(index) -- index= int        return string
	if(index==0) then
		return "00:00:00"
	elseif(index==1) then
		return tostring(xr_statistic.actor_statistic.surges)
	elseif(index==2) then
		return tostring(xr_statistic.actor_statistic.completed_quests)
	elseif(index==3) then
		return tostring(xr_statistic.actor_statistic.killed_monsters)
	elseif(index==4) then
		return tostring(xr_statistic.actor_statistic.killed_stalkers)
	elseif(index==5) then
		return tostring(xr_statistic.actor_statistic.artefacts_founded)
	elseif(index==6) then
		return tostring(xr_statistic.actor_statistic.founded_secrets)
	end
end

 

 

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

local IndTbl = {}
IndTbl[0] = "00:00:00"
IndTbl[1] = "xr_statistic.actor_statistic.surges"
IndTbl[2] = "xr_statistic.actor_statistic.completed_quests"
IndTbl[3] = "xr_statistic.actor_statistic.killed_monsters"
IndTbl[4] = "xr_statistic.actor_statistic.killed_stalkers"
IndTbl[5] = "xr_statistic.actor_statistic.artefacts_founded"
IndTbl[6] = "xr_statistic.actor_statistic.founded_secrets"

function get_stat(index) -- index= int        return string
	if (IndTbl[index]) then
		return IndTbl[index]
	end
end

 

 

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

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


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

@vampirnik77, Что бы код стал равносильным нужно второй вариант изменить на:

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

local IndTbl = {}
	IndTbl[0] = "00:00:00"
	IndTbl[1] = xr_statistic.actor_statistic.surges
	IndTbl[2] = xr_statistic.actor_statistic.completed_quests
	IndTbl[3] = xr_statistic.actor_statistic.killed_monsters
	IndTbl[4] = xr_statistic.actor_statistic.killed_stalkers
	IndTbl[5] = xr_statistic.actor_statistic.artefacts_founded
	IndTbl[6] = xr_statistic.actor_statistic.founded_secrets

function get_stat(index) -- index= int        return string
	if IndTbl[index] then
		return tostring(IndTbl[index])
	end
end

 

Как мне кажется, второй вариант не только "читабельнее", но и быстрее.

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


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

@WinCap, Да, первый вариант это от пыс, второй от меня, перелопачиваю чуть по чуть скрипты в рамках Scripting basis.

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


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

В луа_хелп метод alive прописан у серверных объетов, в скриптах видел его применение к клиентским объектам, я же использовал этот метод к серверным но иногда получал вылеты с указанием на отсутствие такого метода. Так к каким объектам этот метод применять?

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


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

... в скриптах видел его применение к клиентским объектам...

Если можно, давай фрагмент скрипта в студию. Очень хочется увидеть.

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


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

@AndreySol, например, ряд функций в xr_conditions.script - is_alive, is_alive_one, is_alive_all, actor_alive и др.

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


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

@Kirgudu@Graff46

Не приходилось явно использовать эту ф-цию, по этому посмотрел в исходники:

.def("alive",   &CScriptGameObject::Alive)
bool CScriptGameObject::Alive() const
{
    CEntity *entity    = smart_cast<CEntity*>(&object());
    if (!entity)
    {
        ai().script_engine().script_log(ScriptStorage::eLuaMessageTypeError,"CSciptEntity : cannot access class member Alive!");
        return            (false);
    }
    return (!!entity->g_Alive());
}
IC BOOL   g_Alive() const    { return GetfHealth()>0; }

Так что ф-ция явно клиентская, и оказалась примитивнее не куда - простая проверка на то, что здоровье больше 0.

А lua_help, видимо в наше время читать уже не стоит...

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


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

alive есть и у серверного объекта см: https://github.com/joye-ramone/xray-1.0007-origin/blob/99a20ebf9847c21d9d86151bd60acf54cdbdabdb/xr_3da/xrGame/xrserver_objects_alife_monsters_script3.cpp#L73

Но, только у cse_alife_creature_abstract

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

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


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

Как это тогда?

76516211a5aa65541f7839b417773d71.jpg

или game_object включает cse_alife_creature_abstract ?

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


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

Не понял вопроса, db.actor вернет cse_alife_creature_actor который есть наследник cse_alife_creature_abstract 

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


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

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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

AMK-Team.ru

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