Как сделать выбивание дверей?

Может кто помнит в далеком 16 году был нексус рп и там был дробовик который мог выламывать двери и переворачивать машины если стрелять снизу верх
И вот вопрос как сделать похожее или может кто видел такое в воркшопе

вот это должно быть похоже

Скрипт из 2015 года, который я писал еще для FA:S пушек, потом удалял, снова возвращал. Он требует рефакторинга, но он рабочий, если удовлетворить зависимости

Пиши в ЛС, если сильно нужен и не можешь сам починить

DBUST = DBUST or {}


DOOR_HEALTH = 2000 -- дефолт

-- Хук
function DBUST:DoorRepairTime(door)
	return 30
end


local function healthToColor(hp)
	local a = hp / DOOR_HEALTH * 255
	return Color(255,a,a)
end

local function isBusted(door)
	if door.fake then return true end
end

function DBUST.Repair(door)
	door:SetNoDraw(false)
	door:SetNotSolid(false)

	SafeRemoveEntity(door.fake)
	door.fake = nil
end

function DBUST.Fix(door, hp)
	hp = hp or DOOR_HEALTH
	door:SetHealth(hp)
	door:SetColor(healthToColor(hp))
end

function DBUST.RestoreDoor(door, hp)
	if isBusted(door) then -- была выбита. (Не первоначальная настройка)
		DBUST.Repair(door)
	end

	DBUST.Fix(door, hp)
end

local function unlockDoor(door)
	door:Fire("unlock", "", .5)
	door:Fire("open", "", .6)
	door:Fire("setanimation", "open", .6)
end

function DBUST.Buste(door, bUnlockOnly)
	local fake

	if bUnlockOnly then
		unlockDoor(door)

	-- Создаем призрака
	else
		fake = ents.Create("prop_physics")
		fake:SetCollisionGroup(COLLISION_GROUP_DEBRIS_TRIGGER)
		fake:SetMoveType(MOVETYPE_VPHYSICS)
		fake:SetSolid(SOLID_BBOX)
		fake:SetPos(door:GetPos() + Vector(0, 0, 2))
		fake:SetAngles(door:GetAngles())
		fake:SetModel(door:GetModel())
		fake:SetSkin(door:GetSkin())
		fake:Spawn()


		-- Прячем и обрабатываем настоящую дверь
		door:Extinguish()
		door:SetNoDraw(true)
		door:SetNotSolid(true)

		unlockDoor(door)

		-- Линкуем друг друга
		door.fake = fake
		fake.door = door


		-- Создаем эффект искр
		local effectdata = EffectData()
		effectdata:SetOrigin(fake:GetPos() + fake:OBBCenter())
		effectdata:SetMagnitude(5)
		effectdata:SetScale(2)
		effectdata:SetRadius(5)
		util.Effect("Sparks", effectdata)
	end

	local restore_delay = hook.Call("DoorRepairTime", DBUST, door)

	timer.Simple(restore_delay, function()
		if IsValid(door) then
			DBUST.RestoreDoor(door)
		end
	end)

	door:EmitSound("physics/wood/wood_crate_break" .. math.random(5) .. ".wav")

	if door:isLocked() then
		door:keysUnLock()
	end

	hook.Run("OnDoorBusted",door,fake) -- fake may be nil
	return fake
end

-- Если не указать дамаг, то дверь просто откроется без вываливания
function DBUST.DamageDoor(door,damager,damage)
	if isBusted(door) then return end

	if hook.Run("DoorShouldTakeDamage",door,damager,damage) == false then
		return
	end

	door:SetHealth(door:Health() - math.max(damage or DOOR_HEALTH,0))
	door:SetColor(healthToColor(door:Health()))

	if door:Health() <= 0 then
		return DBUST.Buste(door, !damage) -- damage = nil or false
	end
end

hook.Add("InitPostEntity", "DBUST.ResetDoors", function()
	for _,door in ipairs(ents.GetAll()) do
		if door:isDoor() then
			DBUST.RestoreDoor(door)
		end
	end
end)




hook.Add("EntityTakeDamage", "arc.DoorBusting", function(ent, d)
	local att = d:GetInflictor()

	if not att:IsPlayer() then return end

	if isDoor(ent) then -- IsValid(att:GetActiveWeapon())
		local fake = DBUST.DamageDoor(ent, att, d:GetDamage() * 0.5) -- *5
		if fake then -- вывалилась
			local pos  = ent:GetPos()
			local norm = (pos - att:GetPos()):GetNormal()
			local push = 10000 * norm

			timer.Simple(.01,function()
				fake:SetVelocity(push)
				fake:GetPhysicsObject():ApplyForceCenter(push)
			end)
		end
	end
end)

hook.Add("onLockpickCompleted", "dbust_door", function(pl, ok, ent)
	if ok and ent:isDoor() then
		DBUST.DamageDoor(ent, ent:GetOwner(), ent:Health() + 1)
		return true
	end
end)

Куда-нибудь в addons/anyname/lua/autorun/server/doorbusting.lua

Вот так делал выбивание кулаками с этим скриптом:

А вот как-то так профу слесаря (чинил двери)