TTT Doors

Is there a way to prevent crowbars from opening doors via lua?
I’m annoyed all the time when players can just whack a door to make it open.

Not that I know of. All I know is that you can decompile it and change all the doors properties

Ahh that really sucks :expressionless: I played on a server one time and the guy said “server restart attempting door fix”
then he fixed the doors somehow.

garrysmod\gamemodes errortown\entities\weapons\weapon_zm_improvised

Edit in one or more of these areas:
Line 60, return false or remove the function
Line 83, return before it opens or remove the function
Lines 182-184 and lines 210-212, remove these lines

You’ll probably want to remove lines 78-80, too, since it will be redundant

Thanks, I’ll mess around with that and return with feedback :slight_smile:

Tried that, but now you don’t spawn with a crowbar at all :
[lua]

if SERVER then
AddCSLuaFile( “shared.lua” )

end

SWEP.HoldType = “melee”

if CLIENT then
SWEP.PrintName = “crowbar_name”

SWEP.Slot = 0

SWEP.Icon = “VGUI/ttt/icon_cbar”
SWEP.ViewModelFOV = 54
end

SWEP.Base = “weapon_tttbase”
SWEP.ViewModel = “models/weapons/v_crowbar.mdl”
SWEP.WorldModel = “models/weapons/w_crowbar.mdl”
SWEP.Weight = 5
SWEP.DrawCrosshair = false
SWEP.ViewModelFlip = false
SWEP.Primary.Damage = 20
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = true
SWEP.Primary.Delay = 0.5
SWEP.Primary.Ammo = “none”
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = true
SWEP.Secondary.Ammo = “none”
SWEP.Secondary.Delay = 5

SWEP.Kind = WEAPON_MELEE
SWEP.WeaponID = AMMO_CROWBAR

SWEP.InLoadoutFor = {ROLE_INNOCENT, ROLE_TRAITOR, ROLE_DETECTIVE}

SWEP.NoSights = true
SWEP.IsSilent = true

SWEP.AutoSpawnable = false

SWEP.AllowDelete = false – never removed for weapon reduction
SWEP.AllowDrop = false

local sound_single = Sound(“Weapon_Crowbar.Single”)
local sound_open = Sound(“DoorHandles.Unlocked3”)

if SERVER then
CreateConVar(“ttt_crowbar_unlocks”, “1”, FCVAR_ARCHIVE)
CreateConVar(“ttt_crowbar_pushforce”, “395”, FCVAR_NOTIFY)
end

– only open things that have a name (and are therefore likely to be meant to
– open) and are the right class. Opening behaviour also differs per class, so
– return one of the OPEN_ values
local function OpenableEnt(ent)
local cls = ent:GetClass()
if ent:GetName() == “” then
return OPEN_NO
elseif cls == “prop_door_rotating” then
return OPEN_ROT
elseif cls == “func_door” or cls == “func_door_rotating” then
return OPEN_DOOR
elseif cls == “func_button” then
return OPEN_BUT
elseif cls == “func_movelinear” then
return OPEN_NOTOGGLE
else
return OPEN_NO
end
end

– will open door AND return what it did
– Get ready for some prototype-quality code, all ye who read this
if SERVER and GetConVar(“ttt_crowbar_unlocks”):GetBool() then
local openable = OpenableEnt(hitEnt)

  if openable == OPEN_DOOR or openable == OPEN_ROT then
     local unlock = CrowbarCanUnlock(openable)
     if unlock then
        hitEnt:Fire("Unlock", nil, 0)
     end

     if unlock or hitEnt:HasSpawnFlags(256) then
        if openable == OPEN_ROT then
           hitEnt:Fire("OpenAwayFrom", self.Owner, 0)
        end
        hitEnt:Fire("Toggle", nil, 0)
     else
        return OPEN_NO
     end
  elseif openable == OPEN_BUT then
     if CrowbarCanUnlock(openable) then
        hitEnt:Fire("Unlock", nil, 0)
        hitEnt:Fire("Press", nil, 0)
     else
        return OPEN_NO
     end
  elseif openable == OPEN_NOTOGGLE then
     if CrowbarCanUnlock(openable) then
        hitEnt:Fire("Open", nil, 0)
     else
        return OPEN_NO
     end
  end
  return openable

else
return OPEN_NO
end
end

function SWEP:PrimaryAttack()
self.Weapon:SetNextPrimaryFire( CurTime() + self.Primary.Delay )

if not IsValid(self.Owner) then return end

if self.Owner.LagCompensation then – for some reason not always true
self.Owner:LagCompensation(true)
end

local spos = self.Owner:GetShootPos()
local sdest = spos + (self.Owner:GetAimVector() * 70)

local tr_main = util.TraceLine({start=spos, endpos=sdest, filter=self.Owner, mask=MASK_SHOT_HULL})
local hitEnt = tr_main.Entity

self.Weapon:EmitSound(sound_single)

if IsValid(hitEnt) or tr_main.HitWorld then
self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )

  if not (CLIENT and (not IsFirstTimePredicted())) then
     local edata = EffectData()
     edata:SetStart(spos)
     edata:SetOrigin(tr_main.HitPos)
     edata:SetNormal(tr_main.Normal)

     --edata:SetSurfaceProp(tr_main.MatType)
     --edata:SetDamageType(DMG_CLUB)
     edata:SetEntity(hitEnt)

     if hitEnt:IsPlayer() or hitEnt:GetClass() == "prop_ragdoll" then
        util.Effect("BloodImpact", edata)

        -- does not work on players rah
        --util.Decal("Blood", tr_main.HitPos + tr_main.HitNormal, tr_main.HitPos - tr_main.HitNormal)

        -- do a bullet just to make blood decals work sanely
        -- need to disable lagcomp because firebullets does its own
        self.Owner:LagCompensation(false)
        self.Owner:FireBullets({Num=1, Src=spos, Dir=self.Owner:GetAimVector(), Spread=Vector(0,0,0), Tracer=0, Force=1, Damage=0})
     else
        util.Effect("Impact", edata)
     end
  end

else
self.Weapon:SendWeaponAnim( ACT_VM_MISSCENTER )
end

if CLIENT then
– used to be some shit here
else – SERVER

  -- Do another trace that sees nodraw stuff like func_button
  local tr_all = nil
  tr_all = util.TraceLine({start=spos, endpos=sdest, filter=self.Owner})
  
  self.Owner:SetAnimation( PLAYER_ATTACK1 )

  if hitEnt and hitEnt:IsValid() then
        -- See if there's a nodraw thing we should open
        self:OpenEnt(tr_all.Entity)
     end

     local dmg = DamageInfo()
     dmg:SetDamage(self.Primary.Damage)
     dmg:SetAttacker(self.Owner)
     dmg:SetInflictor(self.Weapon)
     dmg:SetDamageForce(self.Owner:GetAimVector() * 1500)
     dmg:SetDamagePosition(self.Owner:GetPos())
     dmg:SetDamageType(DMG_CLUB)

     hitEnt:DispatchTraceAttack(dmg, spos + (self.Owner:GetAimVector() * 3), sdest)

– self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )

– self.Owner:TraceHullAttack(spos, sdest, Vector(-16,-16,-16), Vector(16,16,16), 30, DMG_CLUB, 11, true)
– self.Owner:FireBullets({Num=1, Src=spos, Dir=self.Owner:GetAimVector(), Spread=Vector(0,0,0), Tracer=0, Force=1, Damage=20})

  else

– if tr_main.HitWorld then
– self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )
– else
– self.Weapon:SendWeaponAnim( ACT_VM_MISSCENTER )
– end

     -- See if our nodraw trace got the goods
  end

end

if self.Owner.LagCompensation then
self.Owner:LagCompensation(false)
end
end

function SWEP:SecondaryAttack()
self.Weapon:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
self.Weapon:SetNextSecondaryFire( CurTime() + 0.1 )

local tr = self.Owner:GetEyeTrace(MASK_SHOT)

if tr.Hit and ValidEntity(tr.Entity) and tr.Entity:IsPlayer() and (self.Owner:EyePos() - tr.HitPos):Length() < 100 then
local ply = tr.Entity

  if SERVER and (not ply:IsFrozen()) then
     local pushvel = tr.Normal * GetConVar("ttt_crowbar_pushforce"):GetFloat()

     -- limit the upward force to prevent launching
     pushvel.z = math.Clamp(pushvel.z, 50, 100)

     ply:SetVelocity(ply:GetVelocity() + pushvel)
     self.Owner:SetAnimation( PLAYER_ATTACK1 )

     ply.was_pushed = {att=self.Owner, t=CurTime()} --, infl=self}
  end

  self.Weapon:EmitSound(sound_single)      
  self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER )

  self.Weapon:SetNextSecondaryFire( CurTime() + self.Secondary.Delay )

end
end

function SWEP:GetClass()
return “weapon_zm_improvised”
end

function SWEP:OnDrop()
self:Remove()
end
[/lua]

[lua]
CreateConVar(“ttt_crowbar_unlocks”, “1”, FCVAR_ARCHIVE)
[/lua]

I wonder.

LMAO let me try that.

EDIT: Winner, I feel like a fool now.