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

Скриптование


Svoboда

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

В общем с Новым годом всех!

Тут проблема, написал скрипт для гранат с УДЗ (Ударно-Дистанционый Запал). ТЧ 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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

Если ли методы для ТЧ, что бы НПС или ГГ мог видеть например гранату или другой предмет.

Метод 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

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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

В XRay гранатомёты реализованы оооочень по быдлокодерски, там много ошибок, например запуск ракет должен быть из метода FireTrace, лишь так можно пофиксить, например, произошла осечка, а ракета полетела, или оружие заблокировано, а ракета всё равно полетела. Так же при перезарядке ракеты не респаунется, т.е. старые удаляются, новые спаунятся. В общем, надо править движок, у меня в принципе есть эти правки, которые исправляют часть ошибок. И ещё, в XRayExtensions для ЗП я исправил некоторые ошибки, доработал класс РПГ-7 с возможностью многозарядного гранатомёта.

  • Полезно 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

Как поменять скриптом отношения между мутантами? Надо чтобы даже дружественные мутанты начали враждовать, даже между собой начали грызтись. Со сталкерами разобрался, работает, с мутантами не работает. Имею ввиду метод change_goodwill.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

Поковырял движок. В общем, отношение между мутантами так легко не поменяешь, как прописано в monster_relations так оно и будет. Ну ладно, фиг с ним!

  • Полезно 4

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

@dsh у тебя там метод set_monster_relation в level есть. Так что проще добавить просто скриптовый метод, который меняет индивидуально отношение между монстрами.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

Решил переделать гравиган/гравипривод ну т.е. НПС работают с этим прибором через скриптовые схемы ИИ. Надо чтобы в момент захвата НПС удерживал захваченный предмет в прицеле, т.е. пока оружие подлетает к оператору он должен целиться на него. Эвалуатор работает, а вот экшен не всегда. Вот такой код.

Скрытый текст
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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение

А что возвращает best_item? Написано, это объект который монстр хочет пожевать, а я думал это предмет который сталкер хочет подобрать. И вообще, как узнать что НПС хочет что-то подобрать.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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