mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
272
gamemodes/terrortown/entities/weapons/weapon_zm_improvised.lua
Normal file
272
gamemodes/terrortown/entities/weapons/weapon_zm_improvised.lua
Normal file
@@ -0,0 +1,272 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
SWEP.HoldType = "melee"
|
||||
|
||||
if CLIENT then
|
||||
SWEP.PrintName = "crowbar_name"
|
||||
SWEP.Slot = 0
|
||||
|
||||
SWEP.DrawCrosshair = false
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModelFOV = 54
|
||||
|
||||
SWEP.Icon = "vgui/ttt/icon_cbar"
|
||||
end
|
||||
|
||||
SWEP.Base = "weapon_tttbase"
|
||||
|
||||
SWEP.UseHands = true
|
||||
SWEP.ViewModel = "models/weapons/c_crowbar.mdl"
|
||||
SWEP.WorldModel = "models/weapons/w_crowbar.mdl"
|
||||
|
||||
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.Weight = 5
|
||||
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
|
||||
|
||||
|
||||
local function CrowbarCanUnlock(t)
|
||||
return not GAMEMODE.crowbar_unlocks or GAMEMODE.crowbar_unlocks[t]
|
||||
end
|
||||
|
||||
-- will open door AND return what it did
|
||||
function SWEP:OpenEnt(hitEnt)
|
||||
-- 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:GetOwner(), 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:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
|
||||
|
||||
if not IsValid(self:GetOwner()) then return end
|
||||
|
||||
if self:GetOwner().LagCompensation then -- for some reason not always true
|
||||
self:GetOwner():LagCompensation(true)
|
||||
end
|
||||
|
||||
local spos = self:GetOwner():GetShootPos()
|
||||
local sdest = spos + (self:GetOwner():GetAimVector() * 70)
|
||||
|
||||
local tr_main = util.TraceLine({start=spos, endpos=sdest, filter=self:GetOwner(), mask=MASK_SHOT_HULL})
|
||||
local hitEnt = tr_main.Entity
|
||||
|
||||
self:EmitSound(sound_single)
|
||||
|
||||
if IsValid(hitEnt) or tr_main.HitWorld then
|
||||
self: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.SurfaceProps)
|
||||
edata:SetHitBox(tr_main.HitBox)
|
||||
--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:GetOwner():LagCompensation(false)
|
||||
self:GetOwner():FireBullets({Num=1, Src=spos, Dir=self:GetOwner():GetAimVector(), Spread=Vector(0,0,0), Tracer=0, Force=1, Damage=0})
|
||||
else
|
||||
util.Effect("Impact", edata)
|
||||
end
|
||||
end
|
||||
else
|
||||
self: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:GetOwner()})
|
||||
|
||||
self:GetOwner():SetAnimation( PLAYER_ATTACK1 )
|
||||
|
||||
if hitEnt and hitEnt:IsValid() then
|
||||
if self:OpenEnt(hitEnt) == OPEN_NO and tr_all.Entity and tr_all.Entity: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:GetOwner())
|
||||
dmg:SetInflictor(self)
|
||||
dmg:SetDamageForce(self:GetOwner():GetAimVector() * 1500)
|
||||
dmg:SetDamagePosition(self:GetOwner():GetPos())
|
||||
dmg:SetDamageType(DMG_CLUB)
|
||||
|
||||
hitEnt:DispatchTraceAttack(dmg, spos + (self:GetOwner():GetAimVector() * 3), sdest)
|
||||
|
||||
-- self:SendWeaponAnim( ACT_VM_HITCENTER )
|
||||
|
||||
-- self:GetOwner():TraceHullAttack(spos, sdest, Vector(-16,-16,-16), Vector(16,16,16), 30, DMG_CLUB, 11, true)
|
||||
-- self:GetOwner():FireBullets({Num=1, Src=spos, Dir=self:GetOwner():GetAimVector(), Spread=Vector(0,0,0), Tracer=0, Force=1, Damage=20})
|
||||
|
||||
else
|
||||
-- if tr_main.HitWorld then
|
||||
-- self:SendWeaponAnim( ACT_VM_HITCENTER )
|
||||
-- else
|
||||
-- self:SendWeaponAnim( ACT_VM_MISSCENTER )
|
||||
-- end
|
||||
|
||||
-- See if our nodraw trace got the goods
|
||||
if tr_all.Entity and tr_all.Entity:IsValid() then
|
||||
self:OpenEnt(tr_all.Entity)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if self:GetOwner().LagCompensation then
|
||||
self:GetOwner():LagCompensation(false)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
self:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
|
||||
self:SetNextSecondaryFire( CurTime() + 0.1 )
|
||||
|
||||
if self:GetOwner().LagCompensation then
|
||||
self:GetOwner():LagCompensation(true)
|
||||
end
|
||||
|
||||
local tr = self:GetOwner():GetEyeTrace(MASK_SHOT)
|
||||
|
||||
if tr.Hit and IsValid(tr.Entity) and tr.Entity:IsPlayer() and (self:GetOwner():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:GetOwner():SetAnimation( PLAYER_ATTACK1 )
|
||||
|
||||
ply.was_pushed = {att=self:GetOwner(), t=CurTime(), wep=self:GetClass()} --, infl=self}
|
||||
end
|
||||
|
||||
self:EmitSound(sound_single)
|
||||
self:SendWeaponAnim( ACT_VM_HITCENTER )
|
||||
|
||||
self:SetNextSecondaryFire( CurTime() + self.Secondary.Delay )
|
||||
end
|
||||
|
||||
if self:GetOwner().LagCompensation then
|
||||
self:GetOwner():LagCompensation(false)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:GetClass()
|
||||
return "weapon_zm_improvised"
|
||||
end
|
||||
|
||||
function SWEP:OnDrop()
|
||||
self:Remove()
|
||||
end
|
||||
Reference in New Issue
Block a user