Может кто помнит в далеком 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
Дайте рабочий
Он рабочий, но я скинул его “как есть”. Нужно подшлифовать, чтобы он работал конкретно для тебя. Этим уже пусть занимается твой разработчик. Я помог чем захотел
Как сделать такое выбивание?
[C8] Такая себе разведка I Garry's Mod I HL2RP - YouTube 00:00, 00:10
hook.Add('EntityTakeDamage', 'doorram', function(ent, dmg)
if ent:GetClass() ~= 'prop_door_rotating' then return end
if not dmg:IsBulletDamage() and not dmg:IsExplosionDamage() then return end
ent.ramHP = ent.ramHP or 100
ent.ramHP = ent.ramHP - dmg:GetDamage()
if ent.ramHP <= 0 then
ent:keysUnLock()
ent:Fire('open', '')
ent:Fire('setanimation', 'open')
ent:EmitSound('physics/wood/wood_box_impact_hard3.wav')
ent.ramHP = 100
end
end)