Benny/gamemodes/benny/entities/weapons/itemhandler.lua

274 lines
6.2 KiB
Lua
Raw Permalink Normal View History

2024-03-06 17:47:44 -05:00
AddCSLuaFile()
SWEP.Base = "weapon_base"
2024-03-07 22:34:29 -05:00
SWEP.BennyItemHandler = true
2024-03-06 17:47:44 -05:00
SWEP.ViewModel = "models/weapons/c_pistol.mdl"
2024-03-06 17:47:44 -05:00
SWEP.ViewModelFOV = 74
SWEP.ViewModelFlip = false
SWEP.UseHands = true
SWEP.WorldModel = "models/weapons/w_pistol.mdl"
SWEP.DrawWorldModel = true
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Ammo = "none"
SWEP.Primary.Automatic = true
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Ammo = "none"
SWEP.Secondary.Automatic = true
function SWEP:SetupDataTables()
2024-09-20 16:20:22 -04:00
self:NetworkVar( "Entity", "ActiveR" )
self:NetworkVar( "Entity", "ActiveL" )
self:NetworkVar( "Entity", "DesireR" )
self:NetworkVar( "Entity", "DesireL" )
2024-03-06 17:47:44 -05:00
end
function SWEP:ItemR( key )
2024-03-06 17:47:44 -05:00
local active = self:GetActiveR()
return active:IsValid() and active or false
2024-03-06 17:47:44 -05:00
end
function SWEP:ItemL( key )
2024-03-06 17:47:44 -05:00
local active = self:GetActiveL()
return active:IsValid() and active or false
2024-03-06 17:47:44 -05:00
end
function SWEP:Initialize()
end
local size = 8/2
local tracedef = {
mins = Vector( -size, -size, -size ),
maxs = Vector( size, size, size ),
}
function SWEP:ItemCheckTrace()
local p = self:GetOwner()
p:LagCompensation( true )
tracedef.filter = p
tracedef.start = p:EyePos()
2024-04-06 09:30:09 -04:00
tracedef.endpos = p:EyePos() + (p:GetAimVector() * 90)
2024-03-06 17:47:44 -05:00
local trace = util.TraceHull(tracedef)
2024-04-06 09:30:09 -04:00
--print(trace.StartPos:Distance(trace.HitPos))
2024-08-30 18:30:03 -04:00
p:LagCompensation( false )
2024-03-06 17:47:44 -05:00
return trace
end
function SWEP:SetActive( ent )
local p = self:GetOwner()
if ent:GetOwner() != p then return false end
self:SetActiveR( ent )
2024-10-08 20:46:36 -04:00
if ent:IsValid() then
ent:Deploy()
ent:SetNoDraw( false )
-- LAZY FIX
for i, v in ipairs(ent:GetChildren()) do
v:SetNoDraw(false)
end
2024-03-12 18:43:31 -04:00
end
2024-03-06 17:47:44 -05:00
return true
end
function SWEP:Deactive()
end
function SWEP:PrimaryAttack()
if self:GetActiveR():IsValid() then
self:GetActiveR():Attack()
2024-03-06 17:47:44 -05:00
end
end
function SWEP:Reload()
if self:GetActiveR():IsValid() then
self:GetActiveR():Reload()
2024-03-06 17:47:44 -05:00
end
end
function SWEP:SecondaryAttack()
if self:GetActiveR():IsValid() then
self:GetActiveR():AttackAlt()
2024-03-06 17:47:44 -05:00
end
end
if SERVER then
util.AddNetworkString("AEINV_PredictItem")
else
net.Receive("AEINV_PredictItem", function()
local ent = net.ReadEntity()
if ent:IsValid() then
ent:SetPredictable( net.ReadBool() )
print("[prediction] cl prediction start:", ent)
2024-03-06 17:47:44 -05:00
else
print("[prediction] cl tried to predict invalid ent")
2024-03-06 17:47:44 -05:00
end
end)
end
function SWEP:EquipItem( ent )
local p = self:GetOwner()
if CLIENT then print("FUCK OFF") debug.Trace() return end
2024-03-07 22:34:29 -05:00
if IsValid(ent) and ent.BennyItem then
2024-03-06 17:47:44 -05:00
if ent:GetOwner() != NULL then
print( "[equip]", ent, "belongs to", ent:GetOwner(), "not equipping" )
2024-03-06 17:47:44 -05:00
return
elseif p:GetInventory()[ent] then
print( "[equip]", ent, "already belongs to", p )
2024-03-06 17:47:44 -05:00
return
end
print("[equip]", ent)
2024-03-06 17:47:44 -05:00
2024-10-08 20:46:36 -04:00
--self:SetDesireR( ent )
ent:SetHandler( self )
2024-09-20 16:20:22 -04:00
2024-03-06 17:47:44 -05:00
ent:AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
2024-10-08 20:46:36 -04:00
ent:AddEffects( EF_BONEMERGE + EF_BONEMERGE_FASTCULL + EF_NOINTERP )
2024-03-25 00:48:36 -04:00
ent:PhysicsInit( SOLID_NONE )
2024-03-08 20:10:47 -05:00
ent:SetMoveType( MOVETYPE_NONE )
2024-10-08 20:46:36 -04:00
ent:SetAcquisition( CurTime() )
-- Inventory
local inv = p:GetInventory()
local result = inv:AddItem( ent )
if !result then
print("[EquipItem " .. tostring(self) .. "] AddItem failed! " .. tostring(ent))
return
end
2024-03-12 18:43:31 -04:00
ent:SetNoDraw( true )
2024-10-08 20:46:36 -04:00
-- LAZY FIX
for i, v in ipairs(ent:GetChildren()) do
v:SetNoDraw(true)
end
ent:SetLocalPos( vector_origin )
ent:SetLocalAngles( angle_zero )
2024-03-06 17:47:44 -05:00
ent:EmitSound( "ae/items/pickup.ogg", 70, 100, 1, CHAN_STATIC )
2024-10-08 20:46:36 -04:00
-- Start prediction
2024-03-06 17:47:44 -05:00
net.Start("AEINV_PredictItem")
net.WriteEntity( ent )
net.WriteBool( true )
net.Send( p )
end
end
function SWEP:DropItem()
local p = self:GetOwner()
local ent = self:GetActiveR()
if ent:IsValid() then
if CLIENT then print("[drop] DropItem called on cl not allowed") return end
2024-09-21 14:08:48 -04:00
2024-09-20 16:20:22 -04:00
self:SetDesireR( NULL )
ent:SetHandler( NULL )
2024-03-06 17:47:44 -05:00
ent:RemoveEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
ent:RemoveEffects( EF_BONEMERGE + EF_BONEMERGE_FASTCULL )
2024-03-25 00:48:36 -04:00
ent:PhysicsInit( SOLID_VPHYSICS )
2024-03-08 20:10:47 -05:00
ent:SetMoveType( MOVETYPE_VPHYSICS )
2024-04-06 09:30:09 -04:00
ent:SetCollisionGroup( COLLISION_GROUP_PROJECTILE )
2024-03-07 22:34:29 -05:00
2024-10-08 20:46:36 -04:00
-- Inventory
local inv = p:GetInventory()
local result = inv:RemoveItem( ent )
if !result then
print("[DropItem " .. tostring(self) .. "] RemoveItem failed! " .. tostring(ent))
return
end
ent:SetNoDraw( false )
-- LAZY FIX
for i, v in ipairs(ent:GetChildren()) do
v:SetNoDraw(false)
end
2024-03-06 17:47:44 -05:00
ent:SetPos( p:EyePos() + p:GetAimVector() * 0 )
ent:SetAngles( p:EyeAngles() + Angle( 0, 180, 0 ) )
local ep = ent:GetPhysicsObject()
2024-04-06 09:30:09 -04:00
ep:SetVelocity( p:GetAimVector() * 800 )
ep:SetAngleVelocity( Vector( 0, -360*3, 0 ) )
2024-03-06 17:47:44 -05:00
ep:Wake()
-- Prediction is not actually turned off here, for better throwing
2024-04-06 09:30:09 -04:00
--net.Start("AEINV_PredictItem")
-- net.WriteEntity( ent )
-- net.WriteBool( false )
--net.Send( p )
2024-03-06 17:47:44 -05:00
end
end
function SWEP:Think()
local p = self:GetOwner()
if p:IsValid() then
2024-09-20 16:20:22 -04:00
local DesireR = self:GetDesireR()
local ActiveR = self:GetActiveR()
DesireR = DesireR:IsValid() and DesireR or false
ActiveR = ActiveR:IsValid() and ActiveR or false
2024-09-20 16:20:22 -04:00
2024-09-21 14:08:48 -04:00
if DesireR != ActiveR then
if ActiveR then
2024-09-21 14:08:48 -04:00
if ActiveR:GetHolsterIn() == 0 then
ActiveR:StartHolster()
2024-09-21 14:08:48 -04:00
else
-- Waiting for holster to finish
2024-09-21 14:08:48 -04:00
end
2024-09-20 16:20:22 -04:00
else
if DesireR then
2024-09-21 14:08:48 -04:00
self:SetActive( DesireR )
end
2024-09-20 16:20:22 -04:00
end
2024-09-21 14:08:48 -04:00
else
if ActiveR and ActiveR:GetHolsterIn() != 0 then
ActiveR:CancelHolster()
2024-09-20 16:20:22 -04:00
end
end
if p:KeyPressed(IN_WEAPON1) then
if self:GetDesireR() == NULL then
2024-09-21 14:08:48 -04:00
if SERVER then
2024-04-06 09:30:09 -04:00
local trace = self:ItemCheckTrace()
self:EquipItem( trace.Entity )
2024-09-21 14:08:48 -04:00
end
else
if self:GetActiveR() != NULL then
ActiveR:Drop()
if SERVER then
self:DropItem()
end
self:SetActiveR( NULL )
2024-04-06 09:30:09 -04:00
end
end
end
if p:KeyPressed(IN_WEAPON2) then
end
if p:KeyPressed(IN_ALT1) then
end
if p:KeyPressed(IN_ALT2) then
end
if p:KeyPressed(IN_GRENADE1) then
if self:GetActiveR():IsValid() and self:GetActiveR().Alt then
self:GetActiveR():Alt()
2024-04-06 09:30:09 -04:00
end
end
if p:KeyPressed(IN_GRENADE2) then
end
if self:GetActiveR():IsValid() then
self:GetActiveR():Think()
2024-03-06 17:47:44 -05:00
end
else
print( self, "Thinking without an owner." )
end
end
function SWEP:Deploy()
end
2024-09-20 16:20:22 -04:00
function SWEP:Holster( ent )
return false
2024-03-06 17:47:44 -05:00
end