НаноБот 737 Опубликовано 31 Декабря 2013 В общем с Новым годом всех! Тут проблема, написал скрипт для гранат с УДЗ (Ударно-Дистанционый Запал). ТЧ 1.0004 --[[---------------------------------------------------------------------------- Гранаты с ударным запалом, РГО, РГН Для модов ТЧ. (с) НаноБот Пос. изменение 27.12.2013 г. --]]---------------------------------------------------------------------------- local udz_grn = { "grenade_f1", "grenade_rgd5" } -- список гранат с ударным запалом УДЗ local dist_vzvod = 1000 -- мс, время взвода взрывателя. local udar = 150 -- динамическое ускорение (м/с^2) свыше которого срабатывает взрыватель local grenades = { } local id_grn, id_new local sect_grn, sect_new local flg local con = get_console() function log(arg) con:execute("load ~ "..arg) con:execute("flush") end function update(delta) for id, v in pairs(grenades) do track_thrown(id, delta) end if flg then if id_grn and level.object_by_id(id_grn) == nil and UDZ(sect_grn) then for id_exp = 1, 65534 do local obj = level.object_by_id(id_exp) if obj and obj:section() == sect_grn then if alife():object(id_exp) == nil and grenades[id_exp] == nil then grenades[id_exp] = { } grenades[id_exp]["time"] = time_global() log("Граната брошена-("..obj:section()..")ID-("..id_grn..")ID_explo-("..id_exp..")time-("..time_global()..")delta-("..delta..")") break end end end end id_grn = id_new sect_grn = sect_new end local slot = db.actor:active_slot() local grn = db.actor:item_in_slot(slot) if grn and slot == 3 then id_new = grn:id() sect_new = grn:section() else id_new = nil sect_new = nil end if id_grn ~= id_new then flg = true log("Граната взята в руки-("..tostring(sect_new)..")IDnew-("..tostring(id_new)..")ID_grn-("..tostring(id_grn)..")time-("..time_global()..")") else flg = false end end function track_thrown(id, delta) local grn = level.object_by_id(id) if grn == nil then log("Граната исчезла-ID-("..id..")time-("..time_global()..")") grenades[id] = nil return end if grenades[id]["explode"] then -- граната взорвана (от удара) return end --[[if grenades[id]["destroy_time"] < time_global() then -- граната взорвана от самоликвидатора log("Граната взорвана от самоликвидатора! -ID-("..id..")time-("..time_global()..")") grenades[id]["explode"] = true return end--]] local ps = grn:get_physics_shell() if ps == nil then -- физ. оболочки у зарег. гранаты НЕТ! return end local lvel = vector() ps:get_linear_vel(lvel) grenades[id]["lvel"] = lvel local last_lvel = grenades[id]["last_lvel"] if grenades[id]["time"] + dist_vzvod > time_global() or last_lvel == nil then -- предохранитель safety lock grenades[id]["last_lvel"] = lvel return end local vel = vector() vel.x = lvel.x - last_lvel.x vel.y = lvel.y - last_lvel.y vel.z = lvel.z - last_lvel.z local acc = vel:magnitude()/(delta * 0.001) log("скорость гранаты-("..lvel:magnitude()..")ускорение-("..acc..")ID-("..id..")time-("..time_global()..")") if acc > udar then -- основной показатель удара - динамическое ускорение (торможение) grn:explode(0) log("Граната принудительно взорвана-ID-("..id..")time-("..time_global()..")") grenades[id]["explode"] = true end grenades[id]["last_lvel"] = grenades[id]["lvel"] end function UDZ(sectgrn) if sectgrn then for i, sect in pairs (udz_grn) do if sectgrn == sect then return true end end end return false end Результат вылет с полупустым логом, последния запись в логе "Граната принудительно взорвана..." а далее вылет. В ЧН и соотвествено в ЗП вылета нет, там гранаты немного подругому сделаны, гранаты кидаются и НПСами, причем движку всё равно кто кинул ГГ или НПС, обрабатываются точно так же. Причем вылет получается только тогда когда я кидаю в НПС (солдат), в мутантов (кабанов) проблем нет, и то не всегда, раз прошел кардон, свалку, и дальше, при этом активно использовал гранаты вылета не было, но чаще все же вылетает. Я так понимаю это баг движка, когда денжер обрабатывается от гранаты и когда она взорвана (какие-то переменные равны нил) происходит внутрения ошибка и вылет. Наверно для ТЧ надо с фейковыми гранатами делать, у ЧН и ЗП проблем нет, но этот скрипт то же не годится, я там написал другой доработаный скрипт. Кстати, как работают гранаты, есть класс G_F1 и G_RGD5 эти предметы можно брать в руки и производить другие манипуляции, в общем муляжи гранат в каком то смысле, в момент броска этот предмет исчезают и спанится (в инвентарь) предмет класса II_EXPLO с секцией той же что эта граната, далее этот предмет телепортируется в фокус с физ. оболочкой и даётся импульс с нужной силой, далее через destroy_time мс взрывается и ещё через несколько секунд исчезает. Этот предмет не серверный, т.е. alife():object(id_exp) == nil. Короче может для ТЧ можно ещё как то проблему решить, а то не понятно как удалять настоящие гранаты, если граната уже ударилась, фейковая при этом заспавнилась взорвалась, а настоящия отлетела в сторону, удалить скриптом нельзя, сделать не прозрачными то же вроде нельзя. 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 2 Октября 2014 (изменено) Если ли методы для ТЧ, что бы НПС или ГГ мог видеть например гранату или другой предмет. Метод npc:see(obj), работает только для живых существ, для любого не живого объекта возвращает nil. Мне это нужно для ослепляющих гранат, т.е. видит ГГ или НПС гранату в момент взрыва или нет. В общем 4 метода. 1-й: Заспавнить взрывной предмет над реальной гранатой и тут же взорвать, по хит_колбеку понять что НПС в прямой видимости, по углу от вектора направления головы (npc:head_orientation()) и вектора хита(local_direction) определить, видит ли НПС на гранату. В общем метод работает как то не очень, и не работает для ГГ. 2-й: В момент взрыва заспавнить бота(невидимку) в точку взрыва гранаты и после определения функцией see, тут же удалить. Функция see отработает как надо, и для ГГ, и для НПС, работает только на открытом пространстве, не отработает правильно, если взорвётся высоко над землёй, и в стеснёном пространстве, возможны лаги при спауне бота. 2-й: Установить всех НПСов в радиусе поражения, создать спец пули(не видимые не большие предметы) и направить им в голову, при столкновении с геометрией спецпули отклонятся от прямой траектории. В общем через кусты не работает как надо, и ресурсоёмко, особено если много НПСов. 4-й: Трассировка. Тут всё просто, скриптовая замена той же функции see, но это только для модифицированной X - ray game.dll В общем, вопрос, если ещё какие небуть методы для это шняги. for o in npc:memory_visible_objects() do не спасет отца русской демократии ? dc Изменено 16 Октября 2014 пользователем Dennis_Chikin ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 30 Октября 2018 В XRay гранатомёты реализованы оооочень по быдлокодерски, там много ошибок, например запуск ракет должен быть из метода FireTrace, лишь так можно пофиксить, например, произошла осечка, а ракета полетела, или оружие заблокировано, а ракета всё равно полетела. Так же при перезарядке ракеты не респаунется, т.е. старые удаляются, новые спаунятся. В общем, надо править движок, у меня в принципе есть эти правки, которые исправляют часть ошибок. И ещё, в XRayExtensions для ЗП я исправил некоторые ошибки, доработал класс РПГ-7 с возможностью многозарядного гранатомёта. 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 5 Сентября 2022 Как поменять скриптом отношения между мутантами? Надо чтобы даже дружественные мутанты начали враждовать, даже между собой начали грызтись. Со сталкерами разобрался, работает, с мутантами не работает. Имею ввиду метод change_goodwill. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 6 Сентября 2022 Поковырял движок. В общем, отношение между мутантами так легко не поменяешь, как прописано в monster_relations так оно и будет. Ну ладно, фиг с ним! 4 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 7 Сентября 2022 @dsh у тебя там метод set_monster_relation в level есть. Так что проще добавить просто скриптовый метод, который меняет индивидуально отношение между монстрами. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 28 Октября 2023 Решил переделать гравиган/гравипривод ну т.е. НПС работают с этим прибором через скриптовые схемы ИИ. Надо чтобы в момент захвата НПС удерживал захваченный предмет в прицеле, т.е. пока оружие подлетает к оператору он должен целиться на него. Эвалуатор работает, а вот экшен не всегда. Вот такой код. Скрытый текст class "action_operator_gravygun" (action_base) function action_operator_gravygun:__init(npc, action_name, storage) super(nil, action_name) self.st = storage end function action_operator_gravygun:hit_callback(amount, dir, who) local npc = self.object log1("action_operator_gravygun:hit_callback() name: "..npc:name()) end function action_operator_gravygun:initialize() action_base.initialize(self) local npc = self.object -- if npc:path_completed() then -- npc:set_desired_position() -- npc:set_desired_direction() -- end -- npc:set_mental_state(anim.danger) -- npc:set_item(object.aim1, npc:active_item()) log1("action_operator_gravygun:initialize()["..time_global().."] name: "..npc:name()) end function action_operator_gravygun:execute() action_base.execute(self) local npc = self.object local wpn = npc:active_item() if wpn and wpn:section()==gdrive_section then local target = wpn:binded_object().target if target then state_mgr.set_state(npc, "threat_heli", nil, nil, {look_object = target}, nil, nil, {yaw_delta=10}) end end end function action_operator_gravygun:finalize() action_base.finalize(self) local npc = self.object log1("action_operator_gravygun:finalize()["..time_global().."] name: "..npc:name()) end Делал на основе схемы rx_ff Bak'а, наверное надо initialize доделать, а именно раскомментировать код или ещё как настроить. 1 2 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 737 Опубликовано 29 Октября 2023 А что возвращает best_item? Написано, это объект который монстр хочет пожевать, а я думал это предмет который сталкер хочет подобрать. И вообще, как узнать что НПС хочет что-то подобрать. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение