Zander_driver 10 334 Опубликовано 15 Декабря 2023 Поделиться Опубликовано 15 Декабря 2023 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. Ссылка на комментарий
Colder 12 Опубликовано 16 Декабря 2023 Поделиться Опубликовано 16 Декабря 2023 Я пробывал спавнить гг но он спавниться каждым действием при использовании Ссылка на комментарий
Zander_driver 10 334 Опубликовано 16 Декабря 2023 Поделиться Опубликовано 16 Декабря 2023 3 часа назад, Colder сказал: он спавниться каждым действием Логично, если ты без всяких условий спавнишь, то так и будет. 15.12.2023 в 04:45, Zander_driver сказал: Добавь bool флаг, записывай в него результат каждой проверки в цикле, по окончании цикла если флаг останется в false, то А вот это я просто так, для красоты написал? 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. Ссылка на комментарий
naxac 2 447 Опубликовано 16 Декабря 2023 Поделиться Опубликовано 16 Декабря 2023 @Colder , можно: вместо break сделай return, а сразу после цикла поставь спавн этого мешка. Получится, если в цикле return не сработал, значит дистанция больше, значит спавним мешок обратно. 1 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
RayTwitty 508 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 Понадобилось тут разобраться с поворотом объектов. Оказывается есть целых 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 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 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. Ссылка на комментарий
CiberZold 142 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 28 минут назад, Zander_driver сказал: А вот +x или +z считается направлением "вперед" в X-Ray... блин, уже не помню наверное это ещё зависит от того как ориентирована сама локация/плоскость на которую ставиться объект, потому что если сама плоскость или лока ориентирована не строго по осям в глобальной системе коорд-т, то чтобы объект подвинуть вперёд возможно надо уменьшать x, а на какой-то плоскости z, а на третьей и x и z или наоборот, вообще чтоб представить положение объекта в 3D-пространстве на 2D-мониторе довольно трудно, тут надо иметь или хорошее воображение в голове или 3 Д шлем/очки или сделать модель в реальном мире и подвигать её физически 1 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 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. Ссылка на комментарий
CiberZold 142 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 12 минут назад, Zander_driver сказал: "Вперед" - это ведь ВСЕГДА, понятие в локальной системе координат объекта. Не зависит и не может оно зависеть от локации, где объект находится. так ты сам себе противоречишь если говоришь, что ВПЕРЁД это локальное понятие, а потом что оно не может зависеть от локации когда мы говорим вперёд то по логике имеем ввиду вперёд относительно чего-то, в глобальном понимании это не имеет смысла, как представь объект, который летает в космосе, в глобальной системе коорд-т, да он может подвинуться типа вперёд (двинуть по оси z например), но это не имеет никакого смысла, потому что там нет ни лева/права, верха/низа, вперёд/назад, это всё приобретает смысл только относительно ещё какого-то объекта или плоскости, так же как ты можешь идти вперёд по улице в своём городе строго прямо и на север по компасу) но это вперёд относительно поверхности Земли, в глобальной системе коорд-т ты можешь в этом момент двигаться по вектору между осями z, y, x одновременно, который ещё и меняет направление в течении дня, т.к. Земля ещё движется вокруг Солнца и своей оси, так что когда говоришь вперёд это локально и зависит от локации, глобальное вперёд может и существует, но не имеет смысла на практике. 1 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 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. Ссылка на комментарий
CiberZold 142 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 (изменено) 16 минут назад, Zander_driver сказал: 3D-движок, действующий по вашим правилам пространственной геометрии? я же не говорю что движок работает не так, понятно что движок работает по глобальной системе, он же не может подстраиваться под каждую локацию, я говорю о том что это малоудобно практически, человек хочет подвинуть объект вперёд на локации относительно самой локации, относительно других объектов, и по твоему совету двигает по оси Z типа вперёд, уменьшая эти коорд-ты, а у него по факту, этот объект по твоему совету, двигается не вперёд, а вправо и назад например, потому что так ориентирована локация, и что ему дело до твоего движка и теоретических рассуждений Изменено 19 Декабря 2023 пользователем CiberZold 1 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 Ну что тут можно сказать. Не изучайте в школе математику, физику, геометрию. В том числе трехмерную. И тогда мир вокруг вас будет наполнен магией и волшебством. Кому-то может быть, так и прикольнее. 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. Ссылка на комментарий
RayTwitty 508 Опубликовано 19 Декабря 2023 Поделиться Опубликовано 19 Декабря 2023 1 час назад, Zander_driver сказал: У каждого 3д-объекта можно взять условно направление "вперед" - обычно это положительное направление по одной из осей локальных координат этого объекта Просто в игре у объектов, расположенных совершенно по-разному - один на стене, другой на потолке - может быть вектор с одинаковым значением direction. Как будто бы direction это вращение вокруг какой-то своей оси координат, изначально заданной углами вращения в глобальной системе координат. Ссылка на комментарий
Это популярное сообщение. Zander_driver 10 334 Опубликовано 20 Декабря 2023 Это популярное сообщение. Поделиться Опубликовано 20 Декабря 2023 2 минуты назад, RayTwitty сказал: у объектов, расположенных совершенно по-разному - один на стене, другой на потолке - может быть вектор с одинаковым значением direction. Может. direction - это не ротация. Не ориентация в пространстве, строго говоря. Два прожектора, из которых один закреплен на полу, а другой на потолке, могут светить в одном и том же направлении. И для обоих это будет направление по касательной к их поверхности на которой закреплены. И так же два прожектора, из которых оба закреплены на полу, могут светить в противоположных направлениях. Причем для обоих это будет направление по касательной к их поверхности на которой закреплены. direction может годиться для выяснения, "насколько в разные / одинаковые стороны смотрят два объекта?", т.е. грубо говоря для сравнения их направлений. Только в том случае, когда базовая плоскость у них одна и та же. Грубо говоря они все стоят на полу. Или все на потолке. Если один на полу, другой на стене, третий на потолке... этого мало) Для полного описания манипуляций вращения, без математических артефактов, применяют Кватернионы. В X-Ray тоже. 2 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. Ссылка на комментарий
Colder 12 Опубликовано 24 Декабря 2023 Поделиться Опубликовано 24 Декабря 2023 (изменено) @naxac когда в рюкзаке 2 спальника, то компрессионый мешок все равно спавниться постоянно Изменено 24 Декабря 2023 пользователем Colder 1 Ссылка на комментарий
Алекс Мутный 0 Опубликовано 31 Декабря 2023 Поделиться Опубликовано 31 Декабря 2023 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. Если надо скину проблемные файлы. Ссылка на комментарий
Kirgudu 1 217 Опубликовано 31 Декабря 2023 Поделиться Опубликовано 31 Декабря 2023 (изменено) @Алекс Мутный поищи Script Syntax Checker, возможно где-то рабочие ссылки остались. Или воспользуйся Lua плагином к Notepad++ от Charsi: https://disk.yandex.ru/d/UIMIb8_8vZtMD У тебя явно ошибка синтаксиса в скрипте xr_motivator образовалась после слияния, раз он не загружается. Может скобку какую не закрыл или лишний end вставил. Upd: нашёлся какой-то архив с чекером. https://disk.yandex.ru/d/TeUbiQ0sGjqW-w Изменено 31 Декабря 2023 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
Colder 12 Опубликовано 3 Января Поделиться Опубликовано 3 Января Подскажите как правильно прочитать строку из 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 из предметов. Заранее спасибо! Ссылка на комментарий
RayTwitty 508 Опубликовано 3 Января Поделиться Опубликовано 3 Января @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 Ссылка на комментарий
Colder 12 Опубликовано 4 Января Поделиться Опубликовано 4 Января (изменено) Подскажите что делаю не так? Пытаюсь вывести вес в ящике. Когда выкладываешь/берешь все работает. Закрываешь/открываешь ящик вес сбрасываеться по 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 Изменено 4 Января пользователем Colder Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти