• TTT Doors
    7 replies, posted
  • Avatar of Apozen
  • 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.
  • Avatar of Apozen
  • Ahh that really sucks :| I played on a server one time and the guy said "server restart attempting door fix" then he fixed the doors somehow.
  • Avatar of my_hat_stinks
  • garrysmod\gamemodes\terrortown\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
  • Avatar of Apozen
  • 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]
  • Avatar of Chessnut
  • [lua] CreateConVar("ttt_crowbar_unlocks", "1", FCVAR_ARCHIVE) [/lua] I wonder.
  • Avatar of Apozen
  • [QUOTE=Chessnut;34762215][lua] CreateConVar("ttt_crowbar_unlocks", "1", FCVAR_ARCHIVE) [/lua] I wonder.[/QUOTE] LMAO let me try that. EDIT: Winner, I feel like a fool now.