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

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

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
Ссылка на комментарий

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...of chernobyl ru\gamedata\scripts\bind_stalker.script:2: attempt to index global 'xr_motivator' (a nil value)
 

stack trace:
 

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

bind_stalker, se_zones,xr_motivator,xr_kamp. Если надо скину проблемные файлы.

 

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

@Алекс Мутный поищи Script Syntax Checker, возможно где-то рабочие ссылки остались. Или воспользуйся Lua плагином к Notepad++ от Charsi: https://disk.yandex.ru/d/UIMIb8_8vZtMD

У тебя явно ошибка синтаксиса в скрипте xr_motivator образовалась после слияния, раз он не загружается. Может скобку какую не закрыл или лишний end вставил.

Upd: нашёлся какой-то архив с чекером. https://disk.yandex.ru/d/TeUbiQ0sGjqW-w

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

Подскажите как правильно прочитать строку из ltx файла ввиде:

[item]
item_1

item_2

item_3

item_4

...

...

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

пробовал так:

 

function ..... ()

    local spawn = {}
    local ini_pack = ini_file("items\\settings\\txr_list.ltx")

    local need = ini_pack:line_count("item")
    spawn.section = need[math.random(table.getn(need))]

 

Ругаеться на getn.

P.S Мне нужно выбрать 1 из предметов.

Заранее спасибо!

 

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

@Colder 

function read_list(section, ini)
	if not ini then
		ini = system_ini()
	end
	local t = {}
	for i = 0, ini:line_count(section) - 1 do
		local result, id, value = ini:r_line(section, i, "", "")
		if result then
			t[id] = value
		end
	end
	return t
end

local t = read_list("item", ini_file("items\\settings\\txr_list.ltx"))
ключи таблицы - твои предметы

 

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

Подскажите что делаю не так? Пытаюсь вывести вес в ящике. Когда выкладываешь/берешь все работает. Закрываешь/открываешь ящик вес сбрасываеться по 0.

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


local box_info_wnd
local cur_box_weight = 0

function init(obj)
    printf("_bp: init(): name='%s'", obj:name())
    local ini = obj:spawn_ini()
    if ini and ini:section_exist("animation") then
    abort("object '%s': animation section is deprecated, use logic + impulse combination", obj:name())
    return
end
    if (not ini) or (not ini:section_exist("logic") and not ini:section_exist("drop_box")) then
    if obj:clsid() ~= clsid.projector and obj:clsid() ~= clsid.inventory_box then
    return
end
end
    db.storage[obj:id()] = {}
    local new_binder = generic_physics_binder(obj)
    obj:bind_object(new_binder)
end

class "generic_physics_binder" (object_binder)
function generic_physics_binder:__init(obj) super(obj)
    self.initialized = false
    self.loaded = false
end 

function generic_physics_binder:reload(section)
    object_binder.reload(self, section)
end

function generic_physics_binder:reinit()
    object_binder.reinit(self)
    db.storage[self.object:id()] = {}
    self.st = db.storage[self.object:id()]
end

function generic_physics_binder:update(delta)
    object_binder.update(self, delta)

    if not self.initialized and db.actor then
    self.initialized = true
    xr_logic.initialize_obj(self.object, self.st, self.loaded, db.actor, modules.stype_item)

    local particle = utils.cfg_get_string(self.st.ini, self.st.section_logic, "particle", self.object, false, "", nil)
    if particle ~= nil then
    self.particle = particles_object(particle)
    self.particle:play_at_pos(self.object:position())
end
    local graph_point_marker = utils.cfg_get_string(self.st.ini, self.st.section_logic, "graph_point_marker", self.object, false, "", nil)
    if graph_point_marker ~= nil then
    self.disable_graph_point = patrol(graph_point_marker):game_vertex_id(0)
    game_graph():accessible(self.disable_graph_point, false)
    printf("GRAPH POINT DISABLED")
end
    self.cur_box_weight = get_box_weight(self.object)
end
    if self.st.active_section ~= nil or (self.object:spawn_ini() ~= nil and self.object:spawn_ini():section_exist("drop_box") == true) or self.object:clsid() == clsid.inventory_box then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta)

    self.object:set_callback(callback.hit, generic_physics_binder.hit_callback, self)
    self.object:set_callback(callback.death, generic_physics_binder.death_callback, self)
    self.object:set_callback(callback.use_object, generic_physics_binder.use_callback, self)
    elseif self.object:section() == "inventory_box" or self.object:section() == "active_backpack" or self.object:section() == "active_system" then
    self.object:set_callback(callback.use_object, generic_physics_binder.use_callback, self)
end
end

function generic_physics_binder:net_spawn(data)
    if not object_binder.net_spawn(self, data) then
    return false
end
    if self.object:clsid() == clsid.projector then
    db.add_sl(self.object)
end
    if self.object:spawn_ini() ~= nil and self.object:spawn_ini():section_exist("drop_box") == true then
    self.box_items = xr_box.ph_item_box(self.object)
end
    self.object:set_callback(callback.on_inv_box_item_take, self.on_put, self)
    self.object:set_callback(callback.on_inv_box_item_drop, self.on_drop, self)
    return true
end

function generic_physics_binder:net_destroy()
    local st = db.storage[self.object:id()]
    if st.active_scheme then
    xr_logic.issue_event(self.object, st[st.active_scheme], "net_destroy")
end
    if self.particle ~= nil then
    self.particle:stop()
end
    db.del_sl(self.object)
    db.storage[self.object:id()] = nil

    self.object:set_callback(callback.on_inv_box_item_take, nil)
    self.object:set_callback(callback.on_inv_box_item_drop, nil)

    object_binder.net_destroy(self)
end

function generic_physics_binder:on_put(item)
    local wnd = level.get_car_body_wnd()
    if not wnd:IsShown() or db.actor:is_talking() then
    return
end
    self.cur_box_weight = get_box_weight(self.object)
    if box_info_wnd then
    box_info_wnd:update_info(self.cur_box_weight)
end
end

function generic_physics_binder:on_drop(item)
    local wnd = level.get_car_body_wnd()
    if not wnd:IsShown() or db.actor:is_talking() then
    return
end
    self.cur_box_weight = get_box_weight(self.object)
    if box_info_wnd then
    box_info_wnd:update_info(self.cur_box_weight)
end
end

function generic_physics_binder:net_save_relevant()
    return true
end

function generic_physics_binder:save(packet)
    object_binder.save(self, packet)
    xr_logic.save_obj(self.object, packet)
end

function generic_physics_binder:load(reader)
    self.loaded = true
    object_binder.load(self, reader)
    xr_logic.load_obj(self.object, reader)
end

function generic_physics_binder:use_callback(obj, who)
    if obj:section() == "inventory_box" or obj:section() == "active_backpack" or obj:section() == "active_system" then
    dxr_carbody.use_inventory_box = obj
end
    if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
end
end

function generic_physics_binder:hit_callback(obj, amount, local_direction, who, bone_index)
    printf("_bp: generic_physics_binder:hit_callback: obj='%s'", obj:name())
    if self.st.ph_on_hit then
    xr_logic.issue_event(self.object, self.st.ph_on_hit, "hit_callback", obj, amount, local_direction, who, bone_index)
end
    if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "hit_callback", obj, amount, local_direction, who, bone_index)
end
end

function generic_physics_binder:death_callback(victim, who)
--    printf("_bp: generic_physics_binder:death_callback: obj='%s'", victim:name())
    printf("_bp: generic_physics_binder:death_callback: obj='%s'", victim and victim:name() or self.object:name())
    if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who)
end
    if self.particle ~= nil then
        self.particle:stop()
end
    if self.disable_graph_point ~= nil then
    game_graph():accessible(self.disable_graph_point, true)
    printf("GRAPH POINT ENABLED")
end
    if self.object:spawn_ini() ~= nil and self.object:spawn_ini():section_exist("drop_box") == true then
    self.box_items:spawn_items()
end
end

---------------------------------------------------------------------------------------------------
function get_box_weight(box)
    if box == nil then
    return 0
end
    local weight = 0.0
    for i=0,box:inv_box_count()-1 do
    weight = weight + box:object_from_inv_box(i):get_weight() or 0
end
    return weight
end

function show_box_info()
    box_info_wnd = box_info_wnd or box_info()

    if box_info_wnd ~= nil then
    box_info_wnd:show()
end
end

function hide_box_info()
    if box_info_wnd then
    get_hud():RemoveDialogToRender(box_info_wnd)
end
    box_info_wnd = nil
end

class "box_info" (CUIScriptWnd)

function box_info:__init() super()
    local xml = CScriptXmlInit()
    xml:ParseFile("carbody_new.xml")
    xml:InitWindow("main", 0, self)
    self.weight = xml:InitStatic("weight_static", self)
    get_hud():AddDialogToRender(self)
end
    
function box_info:show()
    self:update_info(self.cur_box_weight)
    self:Show(true)
end

function box_info:hide()
    self:Show(false)
end

function box_info:update_info(cur)
    if cur ~= nil then
    self.weight:SetText(string.format("%5.1f",cur))
    else
    self.weight:SetText(string.format("%5.1f",0))
end
end
 

 

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

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

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

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

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

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

Войти

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

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

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