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

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

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

local t = 0
local BACKPACK_SLOT = 8

 

function ItTank(obj)
    if not obj then return false end
    local list = {

    ["airtank"] = true,
}
    return list[obj:section()]
end

 

local toxic_level = ini_file([[items\settings\txr_toxic_level.ltx]]):r_float("hit_level", level.name())
local min_cond = sys_ini:r_float_ex("airtank", "inv_condition")

 

function item_to_tank()
    local slot = db.actor:item_in_slot(BACKPACK_SLOT)

    local function list(actor,obj)
    if slot and ItTank(obj) then
    if t < time_global() then

    local cond = obj:condition()
    obj:set_condition(cond-min_cond)
    db.actor.health = toxic_level+0.001
    t = time_global() + 1000
end
end
end
    db.actor:iterate_inventory(list,db.actor)
end

  • Всем привет.
  • У меня такая проблема если вставить в слот airtank, потом вытащить его и поставить другой. То хит наноситься всё равно 1 airtank который стоял до этого в слоте. Я так понимаю нужно присвоить ид предмету? Как мне это сделать?
Изменено пользователем Colder
Ссылка на комментарий

@Colder, функция "item_in_slot" возвращает объект, находящийся в заданном слоте. Перебирать инвентарь не нужно, можно сразу работать с полученным объектом и описанная "проблема" отпадёт сама собой.

  • Спасибо 1
  • Нравится 2
  • Согласен 1

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

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

Чем obj:set_fastcall(fx, obj) лучше/хуже level.add_call(fx1, fx2)? Оба варианта проверки активны только в онлайне, у обоих есть авто-отключение проверки при выполнении заданного условия и, если верить старым постам, одинаково частое срабатывание отдельно от апдейта ГГ.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

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

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

local spawned_sleepbags = {}
local dist = 1.5

function on_item_sleep(obj)
    if obj:section() == "sleep_bag" then                    -- спальный мешок
    alife():create("compression_bag", pos, lvid, gvid, pid)            -- спавним компресионый мешок гг

    pos.x = pos.x + 1
    pos.z = pos.z + 0

    local matt = alife():create("mattress", pos, lvid, gvid)        -- спавним матрас
    spawned_sleepbags[matt.id] = true

    elseif obj:section() == "compression_bag" then

    for id, v in pairs(spawned_sleepbags) do
    local sp = level.object_by_id(id)
    if sp and (v == true) then

    local sp_distance = sp:position():distance_to(db.actor:position())
    if (sp_distance < dist) then

    alife():release(alife():object(sp:id()), true)                -- удаляем матрас и спавним мешок обратно
    alife():create("sleep_bag", pos, lvid, gvid, pid)

    local bag = db.actor:object("compression_bag")                -- удаляем компресионый мешок у гг
    alife():release(alife():object(bag:id()), true)
    spawned_sleepbags[id] = nil
    break
end
end
end
end
end

 

Изменено пользователем Colder
Ссылка на комментарий
4 часа назад, Colder сказал:

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

Ну так надо его заспавнить?) В коде этого и НЕ делается.
Добавь bool флаг, записывай в него результат каждой проверки в цикле, по окончании цикла если флаг останется в false, то компрессионный мешок надо спавнить обратно.

  • Нравится 3

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
3 часа назад, Colder сказал:

он спавниться каждым действием

Логично, если ты без всяких условий спавнишь, то так и будет.

15.12.2023 в 04:45, Zander_driver сказал:

Добавь bool флаг, записывай в него результат каждой проверки в цикле, по окончании цикла если флаг останется в false, то

А вот это я просто так, для красоты написал?

:mda:

  • Нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

@Colder , можно: вместо break сделай return, а сразу после цикла поставь спавн этого мешка. Получится, если в цикле return не сработал, значит дистанция больше, значит спавним мешок обратно.

  • Спасибо 1
  • Нравится 1
  • Согласен 1

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

naxac.gif

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

Понадобилось тут разобраться с поворотом объектов. Оказывается есть целых 3 ключевых понятия: direction, angle и rotation.
С последними двумя все просто, углы поворота над плоскостью, первый в радианах, второй в градусах (именно это значение мы видим в SDK).

А вот первое - это направление в диапазоне от -1 до 1.

Набросал функции получения direction имея angle/rotation, которые должны работать по идее даже в оригинале (где имеется полурабочий класс матрицы, но его достаточно):

function angle_to_direction(angle)
	local m = matrix()
	m:setXYZ(angle.x, angle.y, angle.z)
	return m.k
end

function rotation_to_direction(angle)
	local m = matrix()
	m:setXYZ(utils.deg2rad(angle.x), utils.deg2rad(angle.y), utils.deg2rad(angle.z))
	return m.k
end

А вот чтобы обратно получить angle/rotation имея direction, нужно, как я понял получить доступ к матрице трансформации объекта (XFORM), применив к нему getXYZ (ну или getHPB).

Прав ли я в рассуждениях и что такое на самом деле direction? Направление относительно чего?

 

P.S. Частично угол поворота можно восстановить при помощи методов вектора getH и getP, но только yaw и pitch.

  • Полезно 3
Ссылка на комментарий
1 час назад, RayTwitty сказал:

чтобы обратно получить angle/rotation имея direction, нужно, как я понял получить доступ к матрице трансформации объекта (XFORM), применив к нему getXYZ (ну или getHPB).

Прав ли я в рассуждениях

Да, прав.

Вообще общепринято во всех 3D-движках, положение и ориентацию в пространстве любого объекта выражать через матрицу.

В Unreal Engine она называется Transform, в X-Ray - XFORM, но суть одна и та же. Вся информация о положении и ротации хранится там, и получается оттуда.

1 час назад, RayTwitty сказал:

что такое на самом деле direction? Направление относительно чего?

Тут могу ошибиться в деталях формулировки, но емнип, так:

У каждого 3д-объекта можно взять условно направление "вперед" - обычно это положительное направление по одной из осей локальных координат этого объекта. (А вот +x или +z считается направлением "вперед" в X-Ray... блин, уже не помню) но одно из них).

direction это направление этого локального вектора "вперед", у данного объекта, в глобальной системе координат игры. Т.е. буквально направление куда объект "смотрит".

Относительно его позиции, в той же глобальной системе координат.

  • Нравится 1
  • Полезно 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
28 минут назад, Zander_driver сказал:

А вот +x или +z считается направлением "вперед" в X-Ray... блин, уже не помню

наверное это ещё зависит от того как ориентирована сама локация/плоскость на которую ставиться объект, потому что если сама плоскость или лока ориентирована не строго по осям в глобальной системе коорд-т, то чтобы объект подвинуть вперёд возможно надо уменьшать x, а на какой-то плоскости z, а на третьей и x и z или наоборот, вообще чтоб представить положение объекта в 3D-пространстве на 2D-мониторе довольно трудно, тут надо иметь или хорошее воображение в голове или 3 Д шлем/очки или сделать модель в реальном мире и подвигать её физически:)

  • Смешно 1
Ссылка на комментарий
13 минут назад, CiberZold сказал:

наверное это ещё зависит от того как ориентирована сама локация/плоскость на которую ставиться объект, потому что если сама плоскость или лока ориентирована не строго по осям в глобальной системе коорд-т

НЕТ! :)

"Вперед" - это ведь ВСЕГДА, понятие в локальной системе координат объекта. Не зависит и не может оно зависеть от локации, где объект находится.

Только от общепринятых (в данном конкретном движке, игре, игровой студии) дефиниций.

Глобальный смысл у дирекции появляется тогда, когда мы ее переводим в глобальную же систему координат.

До этого "вперед" это просто общепринятое вперед, одинаковое для любых объектов в этом движке.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
12 минут назад, Zander_driver сказал:

"Вперед" - это ведь ВСЕГДА, понятие в локальной системе координат объекта. Не зависит и не может оно зависеть от локации, где объект находится.

так ты сам себе противоречишь если говоришь, что ВПЕРЁД это локальное понятие, а потом что оно не может зависеть от локации:) когда мы говорим вперёд то по логике имеем ввиду вперёд относительно чего-то, в глобальном понимании это не имеет смысла, как представь объект, который летает в космосе, в глобальной системе коорд-т, да он может подвинуться типа вперёд (двинуть по оси z например), но это не имеет никакого смысла, потому что там нет ни лева/права, верха/низа, вперёд/назад, это всё приобретает смысл только относительно ещё какого-то объекта или плоскости, так же как ты можешь идти вперёд по улице в своём городе строго прямо и на север по компасу) но это вперёд относительно поверхности Земли, в глобальной системе коорд-т ты можешь в этом момент двигаться по вектору между осями z, y, x одновременно, который ещё и меняет направление в течении дня, т.к. Земля ещё движется вокруг Солнца и своей оси, так что когда говоришь вперёд это локально и зависит от локации, глобальное вперёд может и существует, но не имеет смысла на практике.

  • Жуть! 1
Ссылка на комментарий
2 минуты назад, CiberZold сказал:

так ты сам себе противоречишь

Хорошо.

Где можно прочесть составленный вами учебник векторной математики? Или как называется написанный вами 3D-движок, действующий по вашим правилам пространственной геометрии?

Очень необычно. Хочу ознакомиться для расширения кругозора.

@CiberZold Ну или как вариант.

Прочитай сам какой-то приличный учебник по теме. Или вникни как работает 3D движок любой приличный, хоть даже X-Ray. Чтобы пурги не нести.

  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
16 минут назад, Zander_driver сказал:

3D-движок, действующий по вашим правилам пространственной геометрии?

я же не говорю что движок работает не так, понятно что движок работает по глобальной системе, он же не может подстраиваться под каждую локацию, я говорю о том что это малоудобно практически, человек хочет подвинуть объект вперёд на локации относительно самой локации, относительно других объектов, и по твоему совету двигает по оси Z типа вперёд, уменьшая эти коорд-ты, а у него по факту, этот объект по твоему совету, двигается не вперёд, а вправо и назад например, потому что так ориентирована локация, и что ему дело до твоего движка и теоретических рассуждений:biggrin:

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

Ну что тут можно сказать.

Не изучайте в школе математику, физику, геометрию. В том числе трехмерную. И тогда мир вокруг вас будет наполнен магией и волшебством. Кому-то может быть, так и прикольнее. :pardon::crazy2:

  • Нравится 1
  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
1 час назад, Zander_driver сказал:

У каждого 3д-объекта можно взять условно направление "вперед" - обычно это положительное направление по одной из осей локальных координат этого объекта

Просто в игре у объектов, расположенных совершенно по-разному - один на стене, другой на потолке - может быть вектор с одинаковым значением direction. Как будто бы direction это вращение вокруг какой-то своей оси координат, изначально заданной углами вращения в глобальной системе координат.

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

@naxac когда в рюкзаке 2 спальника, то компрессионый мешок все равно спавниться постоянно 

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

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

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

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

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

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

Войти

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

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

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