Compare commits
3 Commits
main
...
items-reha
Author | SHA1 | Date |
---|---|---|
Fesiug | 3975ebf158 | |
Fesiug | 825c32e217 | |
Fesiug | 3f6f5464b9 |
|
@ -11,14 +11,14 @@ ENT.BennyItem = true
|
||||||
ENT.AutomaticFrameAdvance = true
|
ENT.AutomaticFrameAdvance = true
|
||||||
|
|
||||||
function ENT:Initialize()
|
function ENT:Initialize()
|
||||||
self:SetModel( self.Class.Model or "models/weapons/w_357.mdl" )
|
self:SetModel( self.Model or "models/weapons/w_357.mdl" )
|
||||||
if SERVER then
|
if SERVER then
|
||||||
self:PhysicsInit( SOLID_VPHYSICS )
|
self:PhysicsInit( SOLID_VPHYSICS )
|
||||||
self:SetCollisionGroup( COLLISION_GROUP_WEAPON )
|
self:SetCollisionGroup( COLLISION_GROUP_WEAPON )
|
||||||
self:GetPhysicsObject():Wake()
|
--self:GetPhysicsObject():Wake()
|
||||||
end
|
end
|
||||||
|
|
||||||
self.Class:Initialize( self )
|
self:EntInitialize( self )
|
||||||
end
|
end
|
||||||
|
|
||||||
if SERVER then
|
if SERVER then
|
||||||
|
@ -103,7 +103,7 @@ local function recurse( modify, includer )
|
||||||
end
|
end
|
||||||
|
|
||||||
function ENT:SetupDataTables()
|
function ENT:SetupDataTables()
|
||||||
local NWVars = { ["Float"] = { "AnimStartTime", "AnimEndTime" } }
|
local NWVars = { ["Entity"] = { "Handler" } }
|
||||||
recurse( NWVars, self.ID )
|
recurse( NWVars, self.ID )
|
||||||
for varname, varlist in pairs(NWVars) do
|
for varname, varlist in pairs(NWVars) do
|
||||||
--local numba = 0
|
--local numba = 0
|
||||||
|
|
|
@ -0,0 +1,159 @@
|
||||||
|
|
||||||
|
AddCSLuaFile()
|
||||||
|
|
||||||
|
ENT.Type = "point"
|
||||||
|
|
||||||
|
function ENT:SetupDataTables()
|
||||||
|
for i=1, 32 do
|
||||||
|
self:NetworkVar("Entity", i-1, "Item" .. i )
|
||||||
|
end
|
||||||
|
self:NetworkVar( "Int", "ReservedSlots" )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:Initialize()
|
||||||
|
self:AddEFlags( EFL_FORCE_CHECK_TRANSMIT )
|
||||||
|
self:SetTransmitWithParent( true ) -- Transmit only when the owner does
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:Think()
|
||||||
|
if !self:GetOwner():IsValid() then
|
||||||
|
self:Print("existing without an owner." )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:Print( ... )
|
||||||
|
print( "[Inventory[" .. self:EntIndex() .. "], " .. tostring(self:GetOwner()) .. "]", ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:UpdateTransmitState()
|
||||||
|
return TRANSMIT_ALWAYS
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:ReevalRecreate()
|
||||||
|
self:RemoveEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
||||||
|
if self:GetOwner():IsValid() then
|
||||||
|
if self:GetOwner():IsEFlagSet( EFL_KEEP_ON_RECREATE_ENTITIES ) then
|
||||||
|
self:AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
||||||
|
self:Print("To be saved during recreate.")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
self:Print("Will NOT be saved during recreate.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self:Print("Will NOT be saved during recreate. No owner either")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:AttachToEntity( ent )
|
||||||
|
if ent.SetInventory then
|
||||||
|
ent:SetInventory( self )
|
||||||
|
else
|
||||||
|
error( "[Inventory " .. tostring(self) .. "] " .. tostring(ent) .. " doesn't have a SetInventory function. Not attaching.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
self:SetOwner( ent )
|
||||||
|
self:SetParent( ent )
|
||||||
|
self:SetPos( vector_origin )
|
||||||
|
self:SetAngles( angle_zero )
|
||||||
|
self:ReevalRecreate()
|
||||||
|
self:Print("Attached to: " .. tostring(ent))
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:GetItems()
|
||||||
|
local itemlist = {}
|
||||||
|
|
||||||
|
for i=1, 32 do
|
||||||
|
local curr = self["GetItem"..i](self)
|
||||||
|
if curr == NULL then continue end
|
||||||
|
table.insert( itemlist, curr )
|
||||||
|
end
|
||||||
|
|
||||||
|
return itemlist
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:GetWeighted()
|
||||||
|
local itemlist = {}
|
||||||
|
|
||||||
|
for i, v in pairs(self:GetItems()) do
|
||||||
|
if i == 0 then continue end
|
||||||
|
table.insert( itemlist, v )
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort( itemlist, function( a, b )
|
||||||
|
return a:GetAcquisition() < b:GetAcquisition()
|
||||||
|
end)
|
||||||
|
|
||||||
|
return itemlist
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:AddItem( ent )
|
||||||
|
if !ent:IsValid() then
|
||||||
|
self:Print("Invalid entity, printing trace" )
|
||||||
|
debug.Trace()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1+self:GetReservedSlots(), 32 do
|
||||||
|
local curr = self["GetItem"..i](self)
|
||||||
|
if curr == NULL then continue end
|
||||||
|
if curr == ent then self:Print("We already own this entity " .. tostring(ent) ) return false end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1+self:GetReservedSlots(), 32 do
|
||||||
|
local curr = self["GetItem"..i](self)
|
||||||
|
if curr == NULL then
|
||||||
|
self["SetItem"..i](self, ent)
|
||||||
|
ent:SetParent( self:GetOwner() )
|
||||||
|
ent:SetOwner( self:GetOwner() )
|
||||||
|
self:ReevalRecreate() -- Why do I have to do this.
|
||||||
|
if ent.GetInventory then ent:GetInventory():ReevalRecreate() end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:Print("Inventory full, can't fit " .. tostring(ent) )
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:RemoveItem( ent )
|
||||||
|
if !ent:IsValid() then
|
||||||
|
self:Print("Invalid entity, printing trace" )
|
||||||
|
debug.Trace()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1+self:GetReservedSlots(), 32 do
|
||||||
|
local curr = self["GetItem"..i](self)
|
||||||
|
if curr == ent then
|
||||||
|
self["SetItem"..i](self, NULL)
|
||||||
|
ent:SetParent( NULL )
|
||||||
|
ent:SetOwner( NULL )
|
||||||
|
self:ReevalRecreate() -- Why do I have to do this.
|
||||||
|
if ent.GetInventory then ent:GetInventory():ReevalRecreate() end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:Print("Couldn't remove " .. tostring(ent) .. " from inventory." )
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function ENT:GetItem( ent )
|
||||||
|
if !ent:IsValid() then
|
||||||
|
self:Print("Invalid entity, printing trace" )
|
||||||
|
debug.Trace()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1+self:GetReservedSlots(), 32 do
|
||||||
|
local curr = self["GetItem"..i](self)
|
||||||
|
if curr == ent then
|
||||||
|
return curr, i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:Print("Couldn't find " .. tostring(ent) .. " in inventory." )
|
||||||
|
return false
|
||||||
|
end
|
|
@ -29,22 +29,14 @@ function SWEP:SetupDataTables()
|
||||||
self:NetworkVar( "Entity", "DesireL" )
|
self:NetworkVar( "Entity", "DesireL" )
|
||||||
end
|
end
|
||||||
|
|
||||||
function SWEP:ItemR( run )
|
function SWEP:ItemR( key )
|
||||||
local active = self:GetActiveR()
|
local active = self:GetActiveR()
|
||||||
if run and active:IsValid() then
|
return active:IsValid() and active or false
|
||||||
return active.Class[run]( active.Class, active, self )
|
|
||||||
else
|
|
||||||
return active:IsValid() and active or false
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function SWEP:ItemL( run )
|
function SWEP:ItemL( key )
|
||||||
local active = self:GetActiveL()
|
local active = self:GetActiveL()
|
||||||
if run and active:IsValid() then
|
return active:IsValid() and active or false
|
||||||
active.Class[run]( active.Class, active, self )
|
|
||||||
else
|
|
||||||
return active:IsValid() and active or false
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function SWEP:Initialize()
|
function SWEP:Initialize()
|
||||||
|
@ -70,11 +62,14 @@ end
|
||||||
function SWEP:SetActive( ent )
|
function SWEP:SetActive( ent )
|
||||||
local p = self:GetOwner()
|
local p = self:GetOwner()
|
||||||
if ent:GetOwner() != p then return false end
|
if ent:GetOwner() != p then return false end
|
||||||
--if self:GetActiveR():IsValid() then self:Deactive() end
|
|
||||||
self:SetActiveR( ent )
|
self:SetActiveR( ent )
|
||||||
if self:ItemR() then
|
if ent:IsValid() then
|
||||||
self:ItemR( "Deploy" )
|
ent:Deploy()
|
||||||
self:ItemR():SetNoDraw( false )
|
ent:SetNoDraw( false )
|
||||||
|
-- LAZY FIX
|
||||||
|
for i, v in ipairs(ent:GetChildren()) do
|
||||||
|
v:SetNoDraw(false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
@ -83,22 +78,20 @@ function SWEP:Deactive()
|
||||||
end
|
end
|
||||||
|
|
||||||
function SWEP:PrimaryAttack()
|
function SWEP:PrimaryAttack()
|
||||||
local p = self:GetOwner()
|
if self:GetActiveR():IsValid() then
|
||||||
if self:ItemR() then
|
self:GetActiveR():Attack()
|
||||||
self:ItemR("Attack")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function SWEP:Reload()
|
function SWEP:Reload()
|
||||||
if self:ItemR() then
|
if self:GetActiveR():IsValid() then
|
||||||
self:ItemR("Reload")
|
self:GetActiveR():Reload()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function SWEP:SecondaryAttack()
|
function SWEP:SecondaryAttack()
|
||||||
local p = self:GetOwner()
|
if self:GetActiveR():IsValid() then
|
||||||
if self:ItemR() then
|
self:GetActiveR():AttackAlt()
|
||||||
self:ItemR("AttackAlt")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -129,26 +122,34 @@ function SWEP:EquipItem( ent )
|
||||||
end
|
end
|
||||||
print("[equip]", ent)
|
print("[equip]", ent)
|
||||||
|
|
||||||
self:SetDesireR( ent )
|
--self:SetDesireR( ent )
|
||||||
|
ent:SetHandler( self )
|
||||||
|
|
||||||
ent:AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
ent:AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
||||||
ent:AddEffects( EF_BONEMERGE )
|
ent:AddEffects( EF_BONEMERGE + EF_BONEMERGE_FASTCULL + EF_NOINTERP )
|
||||||
ent:PhysicsInit( SOLID_NONE )
|
ent:PhysicsInit( SOLID_NONE )
|
||||||
ent:SetMoveType( MOVETYPE_NONE )
|
ent:SetMoveType( MOVETYPE_NONE )
|
||||||
|
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
|
||||||
|
|
||||||
ent:SetNoDraw( true )
|
ent:SetNoDraw( true )
|
||||||
ent:SetParent( p )
|
-- LAZY FIX
|
||||||
ent:SetOwner( p )
|
for i, v in ipairs(ent:GetChildren()) do
|
||||||
|
v:SetNoDraw(true)
|
||||||
|
end
|
||||||
ent:SetLocalPos( vector_origin )
|
ent:SetLocalPos( vector_origin )
|
||||||
ent:SetLocalAngles( angle_zero )
|
ent:SetLocalAngles( angle_zero )
|
||||||
ent:SetAcquisition( CurTime() )
|
|
||||||
|
|
||||||
ent:EmitSound( "ae/items/pickup.ogg", 70, 100, 1, CHAN_STATIC )
|
ent:EmitSound( "ae/items/pickup.ogg", 70, 100, 1, CHAN_STATIC )
|
||||||
|
|
||||||
--self:SetActive( ent )
|
-- Start prediction
|
||||||
local inv = p:GetInventory()
|
|
||||||
inv[ent] = true
|
|
||||||
inv:Sync()
|
|
||||||
|
|
||||||
net.Start("AEINV_PredictItem")
|
net.Start("AEINV_PredictItem")
|
||||||
net.WriteEntity( ent )
|
net.WriteEntity( ent )
|
||||||
net.WriteBool( true )
|
net.WriteBool( true )
|
||||||
|
@ -163,29 +164,36 @@ function SWEP:DropItem()
|
||||||
if CLIENT then print("[drop] DropItem called on cl not allowed") return end
|
if CLIENT then print("[drop] DropItem called on cl not allowed") return end
|
||||||
|
|
||||||
self:SetDesireR( NULL )
|
self:SetDesireR( NULL )
|
||||||
|
ent:SetHandler( NULL )
|
||||||
ent:SetParent( NULL )
|
|
||||||
ent:SetOwner( NULL )
|
|
||||||
|
|
||||||
ent:RemoveEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
ent:RemoveEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
||||||
ent:RemoveEffects( EF_BONEMERGE )
|
ent:RemoveEffects( EF_BONEMERGE + EF_BONEMERGE_FASTCULL )
|
||||||
ent:PhysicsInit( SOLID_VPHYSICS )
|
ent:PhysicsInit( SOLID_VPHYSICS )
|
||||||
ent:SetMoveType( MOVETYPE_VPHYSICS )
|
ent:SetMoveType( MOVETYPE_VPHYSICS )
|
||||||
ent:SetCollisionGroup( COLLISION_GROUP_PROJECTILE )
|
ent:SetCollisionGroup( COLLISION_GROUP_PROJECTILE )
|
||||||
ent:SetNoDraw( false )
|
|
||||||
|
|
||||||
|
-- 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
|
||||||
ent:SetPos( p:EyePos() + p:GetAimVector() * 0 )
|
ent:SetPos( p:EyePos() + p:GetAimVector() * 0 )
|
||||||
ent:SetAngles( p:EyeAngles() + Angle( 0, 180, 0 ) )
|
ent:SetAngles( p:EyeAngles() + Angle( 0, 180, 0 ) )
|
||||||
|
|
||||||
|
|
||||||
local inv = p:GetInventory()
|
|
||||||
inv[ent] = nil
|
|
||||||
inv:Sync()
|
|
||||||
|
|
||||||
local ep = ent:GetPhysicsObject()
|
local ep = ent:GetPhysicsObject()
|
||||||
ep:SetVelocity( p:GetAimVector() * 800 )
|
ep:SetVelocity( p:GetAimVector() * 800 )
|
||||||
ep:SetAngleVelocity( Vector( 0, -360*3, 0 ) )
|
ep:SetAngleVelocity( Vector( 0, -360*3, 0 ) )
|
||||||
ep:Wake()
|
ep:Wake()
|
||||||
|
|
||||||
|
-- Prediction is not actually turned off here, for better throwing
|
||||||
--net.Start("AEINV_PredictItem")
|
--net.Start("AEINV_PredictItem")
|
||||||
-- net.WriteEntity( ent )
|
-- net.WriteEntity( ent )
|
||||||
-- net.WriteBool( false )
|
-- net.WriteBool( false )
|
||||||
|
@ -199,24 +207,24 @@ function SWEP:Think()
|
||||||
if p:IsValid() then
|
if p:IsValid() then
|
||||||
local DesireR = self:GetDesireR()
|
local DesireR = self:GetDesireR()
|
||||||
local ActiveR = self:GetActiveR()
|
local ActiveR = self:GetActiveR()
|
||||||
local DesireR_Valid = DesireR:IsValid()
|
DesireR = DesireR:IsValid() and DesireR or false
|
||||||
local ActiveR_Valid = ActiveR:IsValid()
|
ActiveR = ActiveR:IsValid() and ActiveR or false
|
||||||
|
|
||||||
if DesireR != ActiveR then
|
if DesireR != ActiveR then
|
||||||
if ActiveR_Valid then
|
if ActiveR then
|
||||||
if ActiveR:GetHolsterIn() == 0 then
|
if ActiveR:GetHolsterIn() == 0 then
|
||||||
ActiveR.Class.Holster( ActiveR.Class, ActiveR, self )
|
ActiveR:StartHolster()
|
||||||
else
|
else
|
||||||
-- Waiting for holster to finish
|
-- Waiting for holster to finish
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if DesireR_Valid then
|
if DesireR then
|
||||||
self:SetActive( DesireR )
|
self:SetActive( DesireR )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if ActiveR_Valid and ActiveR:GetHolsterIn() != 0 then
|
if ActiveR and ActiveR:GetHolsterIn() != 0 then
|
||||||
ActiveR.Class.UndoHolster( ActiveR.Class, ActiveR, self )
|
ActiveR:CancelHolster()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -228,7 +236,7 @@ function SWEP:Think()
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if self:GetActiveR() != NULL then
|
if self:GetActiveR() != NULL then
|
||||||
ActiveR.Class.Drop( ActiveR.Class, ActiveR, self )
|
ActiveR:Drop()
|
||||||
if SERVER then
|
if SERVER then
|
||||||
self:DropItem()
|
self:DropItem()
|
||||||
end
|
end
|
||||||
|
@ -243,15 +251,15 @@ function SWEP:Think()
|
||||||
if p:KeyPressed(IN_ALT2) then
|
if p:KeyPressed(IN_ALT2) then
|
||||||
end
|
end
|
||||||
if p:KeyPressed(IN_GRENADE1) then
|
if p:KeyPressed(IN_GRENADE1) then
|
||||||
if self:ItemR() and self:ItemR().Class.Alt then
|
if self:GetActiveR():IsValid() and self:GetActiveR().Alt then
|
||||||
self:ItemR("Alt")
|
self:GetActiveR():Alt()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if p:KeyPressed(IN_GRENADE2) then
|
if p:KeyPressed(IN_GRENADE2) then
|
||||||
|
|
||||||
end
|
end
|
||||||
if self:ItemR() then
|
if self:GetActiveR():IsValid() then
|
||||||
self:ItemR("Think")
|
self:GetActiveR():Think()
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
print( self, "Thinking without an owner." )
|
print( self, "Thinking without an owner." )
|
||||||
|
|
|
@ -86,10 +86,10 @@ function GM:CalcView( ply, pos, ang, fov )
|
||||||
ply:SetupBones()
|
ply:SetupBones()
|
||||||
local bm = ply:GetBoneMatrix(ply:LookupBone("DEF-spine.003"))
|
local bm = ply:GetBoneMatrix(ply:LookupBone("DEF-spine.003"))
|
||||||
view.origin = bm:GetTranslation()
|
view.origin = bm:GetTranslation()
|
||||||
view.origin:Add( vector_up*10 )
|
view.origin:Add( vector_up*8 )
|
||||||
|
|
||||||
if ply:GetLayerSequence( GESTURE_SLOT_JUMP ) == ply:LookupSequence("dive_end_handgun") then
|
if ply:GetLayerSequence( BGESTURE_JUMP ) == ply:LookupSequence("dive_end_handgun") then
|
||||||
local progress = ply:GetLayerCycle( GESTURE_SLOT_JUMP )
|
local progress = ply:GetLayerCycle( BGESTURE_JUMP )
|
||||||
|
|
||||||
progress = math.TimeFraction( 0.15, 0.7, progress )
|
progress = math.TimeFraction( 0.15, 0.7, progress )
|
||||||
progress = math.Clamp( progress, 0, 1 )
|
progress = math.Clamp( progress, 0, 1 )
|
||||||
|
@ -126,17 +126,20 @@ function GM:CalcView( ply, pos, ang, fov )
|
||||||
ply:ManipulateBoneScale( bid, Vector(1, 1, 1) )
|
ply:ManipulateBoneScale( bid, Vector(1, 1, 1) )
|
||||||
local bid = ply:LookupBone("DEF-spine.005")
|
local bid = ply:LookupBone("DEF-spine.005")
|
||||||
ply:ManipulateBoneScale( bid, Vector(1, 1, 1) )
|
ply:ManipulateBoneScale( bid, Vector(1, 1, 1) )
|
||||||
|
--local bid = ply:LookupBone("Weapon")
|
||||||
|
--ply:ManipulateBonePosition( bid, vector_origin )
|
||||||
lastfp = fp
|
lastfp = fp
|
||||||
-- print("show")
|
|
||||||
elseif !lastfp and fp then
|
elseif !lastfp and fp then
|
||||||
local bid = ply:LookupBone("DEF-spine.006")
|
local bid = ply:LookupBone("DEF-spine.006")
|
||||||
ply:ManipulateBoneScale( bid, vector_origin )
|
ply:ManipulateBoneScale( bid, vector_origin )
|
||||||
local bid = ply:LookupBone("DEF-spine.005")
|
local bid = ply:LookupBone("DEF-spine.005")
|
||||||
ply:ManipulateBoneScale( bid, vector_origin )
|
ply:ManipulateBoneScale( bid, vector_origin )
|
||||||
|
--local bid = ply:LookupBone("Weapon")
|
||||||
|
--ply:ManipulateBonePosition( bid, Vector(-3, 1, 0) )
|
||||||
lastfp = fp
|
lastfp = fp
|
||||||
-- print("hide")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
return view
|
return view
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -157,7 +160,6 @@ hook.Add( "OnRequestFullUpdate", "Benny_OnRequestFullUpdate_CameraFP", function(
|
||||||
if !bid then return end
|
if !bid then return end
|
||||||
ply:ManipulateBoneScale( bid, Vector(1, 1, 1) )
|
ply:ManipulateBoneScale( bid, Vector(1, 1, 1) )
|
||||||
lastfp = fp
|
lastfp = fp
|
||||||
-- print("fullupdate: show")
|
|
||||||
elseif fp then
|
elseif fp then
|
||||||
local bid = ply:LookupBone("DEF-spine.006")
|
local bid = ply:LookupBone("DEF-spine.006")
|
||||||
if !bid then return end
|
if !bid then return end
|
||||||
|
@ -166,7 +168,6 @@ hook.Add( "OnRequestFullUpdate", "Benny_OnRequestFullUpdate_CameraFP", function(
|
||||||
if !bid then return end
|
if !bid then return end
|
||||||
ply:ManipulateBoneScale( bid, vector_origin )
|
ply:ManipulateBoneScale( bid, vector_origin )
|
||||||
lastfp = fp
|
lastfp = fp
|
||||||
-- print("fullupdate: hide")
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
|
@ -260,7 +260,7 @@ local function OpenDebugMenu()
|
||||||
if !categories[category] then
|
if !categories[category] then
|
||||||
local cate = opt:Add("DCollapsibleCategory")
|
local cate = opt:Add("DCollapsibleCategory")
|
||||||
cate:Dock(TOP)
|
cate:Dock(TOP)
|
||||||
cate:SetLabel(category)
|
cate:SetLabel( l8( "#ItemCategory." .. category .. ".Name" ) )
|
||||||
local plist = vgui.Create("DPanelList")
|
local plist = vgui.Create("DPanelList")
|
||||||
cate:SetContents(plist)
|
cate:SetContents(plist)
|
||||||
categories[category] = plist
|
categories[category] = plist
|
||||||
|
@ -272,7 +272,7 @@ local function OpenDebugMenu()
|
||||||
if !categories[idata.Category] then
|
if !categories[idata.Category] then
|
||||||
local cate = opt:Add("DCollapsibleCategory")
|
local cate = opt:Add("DCollapsibleCategory")
|
||||||
cate:Dock(TOP)
|
cate:Dock(TOP)
|
||||||
cate:SetLabel(idata.Category)
|
cate:SetLabel( l8( "#ItemCategory." .. idata.Category .. ".Name" ) )
|
||||||
local plist = vgui.Create("DPanelList")
|
local plist = vgui.Create("DPanelList")
|
||||||
cate:SetContents(plist)
|
cate:SetContents(plist)
|
||||||
categories[idata.Category] = plist
|
categories[idata.Category] = plist
|
||||||
|
@ -368,6 +368,6 @@ function printallbones( ent )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
concommand.Add("b-debug_listbones", function( ply, cmd )
|
concommand.Add("b-debug_listbones", function( ply, cmd, args )
|
||||||
printallbones( ply )
|
printallbones( args[1] and Entity(args[1]) or ply )
|
||||||
end)
|
end)
|
|
@ -369,77 +369,81 @@ function GM:HUDPaint()
|
||||||
S_Pop()
|
S_Pop()
|
||||||
|
|
||||||
if handler then
|
if handler then
|
||||||
-- Inventory
|
if !p:GetInventory():IsValid() then
|
||||||
local Pw, Ph, Pg = 110, 30, 10
|
hTextS( "No inventory entity!!", "HUD_36", ScrW()/2, ScrH() - 20 - 36, COLOR_MAIN, TEXT_ALIGN_CENTER, nil, COLOR_DARK )
|
||||||
local thespace = 0
|
else
|
||||||
for i, v in ipairs( p:GetInventory():GetWeighted() ) do
|
-- Inventory
|
||||||
thespace = thespace + Pw + Pg
|
local Pw, Ph, Pg = 110, 30, 10
|
||||||
end
|
local thespace = 0
|
||||||
thespace = thespace - Pg
|
|
||||||
thespace = thespace/2
|
|
||||||
|
|
||||||
S_Push( ScrW()/2 - thespace, ScrH() - 20 - Ph )
|
|
||||||
for i, v in ipairs( p:GetInventory():GetWeighted() ) do
|
for i, v in ipairs( p:GetInventory():GetWeighted() ) do
|
||||||
hCol( v == handler:GetDesireR() and COLOR_BRIGHT or COLOR_DARK )
|
thespace = thespace + Pw + Pg
|
||||||
hRect( (i-1)*(Pw+Pg), 0, Pw, Ph )
|
|
||||||
if v == handler:GetActiveR() then
|
|
||||||
hCol( COLOR_MAIN )
|
|
||||||
hORect( (i-1)*(Pw+Pg)+1, 1, Pw-2, Ph-2, 1 )
|
|
||||||
end
|
|
||||||
local x, y = (i-1)*(Pw+Pg), 0
|
|
||||||
hText( l8( v.Class.PrintName ), "HUD_24", x + Pw/2, y + 5, COLOR_MAIN, TEXT_ALIGN_CENTER )
|
|
||||||
hText( i, "HUD_16", x + 4, y + 2, COLOR_MAIN )
|
|
||||||
end
|
end
|
||||||
S_Pop()
|
thespace = thespace - Pg
|
||||||
|
thespace = thespace/2
|
||||||
|
|
||||||
local wep = handler:GetDesireR()
|
S_Push( ScrW()/2 - thespace, ScrH() - 20 - Ph )
|
||||||
if wep and wep.GetClip then
|
for i, v in ipairs( p:GetInventory():GetWeighted() ) do
|
||||||
local Bw, Bh = 8+(8+2)*30-2+8, 160
|
hCol( v == handler:GetDesireR() and COLOR_BRIGHT or COLOR_DARK )
|
||||||
S_Push( w - 20 - Bw, h - 20 - Bh )
|
hRect( (i-1)*(Pw+Pg), 0, Pw, Ph )
|
||||||
hCol( COLOR_DARK )
|
if v == handler:GetActiveR() then
|
||||||
hRect( 0, 0, Bw, Bh )
|
hCol( COLOR_MAIN )
|
||||||
|
hORect( (i-1)*(Pw+Pg)+1, 1, Pw-2, Ph-2, 1 )
|
||||||
S_Push( 0, 0 )
|
end
|
||||||
hCol( COLOR_MAIN )
|
local x, y = (i-1)*(Pw+Pg), 0
|
||||||
local leng = Bw-8-8
|
hText( l8( v.Class.PrintName ), "HUD_24", x + Pw/2, y + 5, COLOR_MAIN, TEXT_ALIGN_CENTER )
|
||||||
hRect( 8, 8, leng-70, 26 )
|
hText( i, "HUD_16", x + 4, y + 2, COLOR_MAIN )
|
||||||
hRect( 8 + leng - 70 + 4, 8, leng-(leng-70)-4, 26 )
|
|
||||||
hText( l8( wep.Class.PrintName ), "HUD_36", 12, 6, COLOR_DARK )
|
|
||||||
local bc = wep.Class.BurstCount
|
|
||||||
hText( fmlookup[bc] or bc .. "RND", "HUD_24", 10 + (leng - 70) + 70/2, 11, COLOR_DARK, TEXT_ALIGN_CENTER )
|
|
||||||
S_Pop()
|
|
||||||
|
|
||||||
local Tw, Th = 6, 18
|
|
||||||
|
|
||||||
if wep.Class.ClipSize>45 then
|
|
||||||
Tw = 3
|
|
||||||
Th = 13
|
|
||||||
elseif wep.Class.ClipSize<14 then
|
|
||||||
Tw = 8
|
|
||||||
Th = 22
|
|
||||||
end
|
end
|
||||||
|
|
||||||
S_Push( Bw - Tw - 8, Bh - Th - 8 )
|
|
||||||
for i=0, wep.Class.ClipSize-1 do
|
|
||||||
if i>29 then
|
|
||||||
hCol( COLOR_DARK )
|
|
||||||
hRect( (0 - Tw - 2)*i-4, -4, Tw+2, Th+8 )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for i=0, wep.Class.ClipSize-1 do
|
|
||||||
if wep:GetClip() >= (i+1) then
|
|
||||||
hCol( COLOR_MAIN )
|
|
||||||
hRect( (0 - Tw - 2)*i, 0, Tw, Th )
|
|
||||||
hCol( COLOR_DARK )
|
|
||||||
hRect( (0 - Tw - 2)*i, Th-4, Tw, 2 )
|
|
||||||
else
|
|
||||||
hCol( COLOR_BRIGHT )
|
|
||||||
hORect( (0 - Tw - 2)*i, 0, Tw, Th )
|
|
||||||
--hORect( (0 - 8 - 2)*i+1, 1, 8-2, 18-2 )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
S_Pop()
|
|
||||||
S_Pop()
|
S_Pop()
|
||||||
|
|
||||||
|
local wep = handler:GetDesireR()
|
||||||
|
if wep and wep.GetClip then
|
||||||
|
local Bw, Bh = 8+(8+2)*30-2+8, 160
|
||||||
|
S_Push( w - 20 - Bw, h - 20 - Bh )
|
||||||
|
hCol( COLOR_DARK )
|
||||||
|
hRect( 0, 0, Bw, Bh )
|
||||||
|
|
||||||
|
S_Push( 0, 0 )
|
||||||
|
hCol( COLOR_MAIN )
|
||||||
|
local leng = Bw-8-8
|
||||||
|
hRect( 8, 8, leng-70, 26 )
|
||||||
|
hRect( 8 + leng - 70 + 4, 8, leng-(leng-70)-4, 26 )
|
||||||
|
hText( l8( wep.Class.PrintName ), "HUD_36", 12, 6, COLOR_DARK )
|
||||||
|
local bc = wep.Class.BurstCount
|
||||||
|
hText( fmlookup[bc] or bc .. "RND", "HUD_24", 10 + (leng - 70) + 70/2, 11, COLOR_DARK, TEXT_ALIGN_CENTER )
|
||||||
|
S_Pop()
|
||||||
|
|
||||||
|
local Tw, Th = 6, 18
|
||||||
|
|
||||||
|
if wep.Class.ClipSize>45 then
|
||||||
|
Tw = 3
|
||||||
|
Th = 13
|
||||||
|
elseif wep.Class.ClipSize<14 then
|
||||||
|
Tw = 8
|
||||||
|
Th = 22
|
||||||
|
end
|
||||||
|
|
||||||
|
S_Push( Bw - Tw - 8, Bh - Th - 8 )
|
||||||
|
for i=0, wep.Class.ClipSize-1 do
|
||||||
|
if i>29 then
|
||||||
|
hCol( COLOR_DARK )
|
||||||
|
hRect( (0 - Tw - 2)*i-4, -4, Tw+2, Th+8 )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i=0, wep.Class.ClipSize-1 do
|
||||||
|
if wep:GetClip() >= (i+1) then
|
||||||
|
hCol( COLOR_MAIN )
|
||||||
|
hRect( (0 - Tw - 2)*i, 0, Tw, Th )
|
||||||
|
hCol( COLOR_DARK )
|
||||||
|
hRect( (0 - Tw - 2)*i, Th-4, Tw, 2 )
|
||||||
|
else
|
||||||
|
hCol( COLOR_BRIGHT )
|
||||||
|
hORect( (0 - Tw - 2)*i, 0, Tw, Th )
|
||||||
|
--hORect( (0 - 8 - 2)*i+1, 1, 8-2, 18-2 )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
S_Pop()
|
||||||
|
S_Pop()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -873,6 +877,82 @@ local function QuickDrawStat( wide, data, first )
|
||||||
return gap
|
return gap
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local c_swag = HSVToColor( 120, 0.5, 1 )
|
||||||
|
local c_swag2 = HSVToColor( 60, 0.5, 1 )
|
||||||
|
local c_swag3 = HSVToColor( 180, 0.5, 1 )
|
||||||
|
|
||||||
|
local function recurse( ent, y )
|
||||||
|
local p = LocalPlayer()
|
||||||
|
local h = p:HandlerCheck()
|
||||||
|
local inv = ent:GetInventory()
|
||||||
|
local irs = inv:GetReservedSlots()
|
||||||
|
|
||||||
|
S_Push( 20, 0 )
|
||||||
|
hTextS( "Inventory [" .. inv:EntIndex() .. "]", "HUD_16", 0, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
for i=1, 32 do
|
||||||
|
local curr = inv["GetItem"..i](self)
|
||||||
|
if irs < i and curr == NULL then continue end
|
||||||
|
local ofinterest = curr != NULL and
|
||||||
|
((curr == h:GetActiveR() or curr == h:GetActiveL()) and c_swag or
|
||||||
|
(curr == h:GetDesireR() or curr == h:GetDesireL()) and c_swag2) or
|
||||||
|
irs >= i and c_swag3 or nil
|
||||||
|
|
||||||
|
local entname = curr == NULL and (irs >= i and "Reserved" or "Null") or tostring(curr)
|
||||||
|
hTextS( i, "HUD_16", 0, y, ofinterest, nil, nil, color_black )
|
||||||
|
hTextS( entname, "HUD_16", 20, y, ofinterest, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
if curr.GetInventory then
|
||||||
|
y = recurse( curr, y )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
S_Pop()
|
||||||
|
|
||||||
|
return y
|
||||||
|
end
|
||||||
|
|
||||||
|
hook.Add("HUDPaint", "Benny_HUDPaint_Debug", function()
|
||||||
|
local p = LocalPlayer()
|
||||||
|
stack = util.Stack()
|
||||||
|
|
||||||
|
local y = 0
|
||||||
|
S_Push( 20, 120 )
|
||||||
|
hTextS( p, "HUD_16", 0, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
|
||||||
|
local h = p:HandlerCheck()
|
||||||
|
if h then
|
||||||
|
hTextS( "Handler:", "HUD_16", 20, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
|
||||||
|
hTextS( "R Active: " .. tostring(h:GetActiveR()), "HUD_16", 40, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
hTextS( "R Desire: " .. tostring(h:GetDesireR()), "HUD_16", 40, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
hTextS( "L Active: " .. tostring(h:GetActiveL()), "HUD_16", 40, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
hTextS( "L Desire: " .. tostring(h:GetDesireL()), "HUD_16", 40, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
end
|
||||||
|
|
||||||
|
local x = 20+20
|
||||||
|
y = recurse( p, y )
|
||||||
|
|
||||||
|
if false then
|
||||||
|
hTextS( "Inventory (Weighted):", "HUD_16", 20, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
|
||||||
|
for i, v in ipairs(p:GetInventory():GetWeighted()) do
|
||||||
|
hTextS( i .. ": " .. tostring(v), "HUD_16", 20+20, y, nil, nil, nil, color_black )
|
||||||
|
y = y + 12
|
||||||
|
end
|
||||||
|
end
|
||||||
|
S_Pop()
|
||||||
|
|
||||||
|
if stack:Size() != 0 then print("Stack unfinished.") end
|
||||||
|
return
|
||||||
|
end)
|
||||||
|
|
||||||
local ScoreWide = 600
|
local ScoreWide = 600
|
||||||
function GM:ScoreboardShow()
|
function GM:ScoreboardShow()
|
||||||
drawscoreboard = true
|
drawscoreboard = true
|
||||||
|
|
|
@ -1,183 +1,63 @@
|
||||||
|
|
||||||
---------------------
|
local Emeta = FindMetaTable("Entity")
|
||||||
-- Your Name is Benny
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
local PT = FindMetaTable("Player")
|
local qt2 = {
|
||||||
|
["slot1"] = 1,
|
||||||
|
["slot2"] = 2,
|
||||||
|
["slot3"] = 3,
|
||||||
|
["slot4"] = 4,
|
||||||
|
["slot5"] = 5,
|
||||||
|
["slot6"] = 6,
|
||||||
|
["slot7"] = 7,
|
||||||
|
["slot8"] = 8,
|
||||||
|
["slot9"] = 9,
|
||||||
|
["slot0"] = 0,
|
||||||
|
}
|
||||||
|
local qt = {
|
||||||
|
["invprev"] = -1,
|
||||||
|
["invnext"] = 1,
|
||||||
|
}
|
||||||
|
|
||||||
function PT:GetItems()
|
hook.Add( "PlayerBindPress", "Benny_PlayerBindPress_Original", function( ply, bind, pressed, code )
|
||||||
return
|
if qt2[bind] then
|
||||||
end
|
local Num = qt2[bind]
|
||||||
|
if pressed then
|
||||||
|
local inv = ply:GetInventory():GetWeighted()
|
||||||
|
local wep = ply:HandlerCheck()
|
||||||
|
local invf = table.Flip( inv )
|
||||||
|
|
||||||
InventoryMeta = {}
|
local NumOfActive = 0
|
||||||
|
NumOfActive = invf[wep:GetDesireR()]
|
||||||
|
|
||||||
function InventoryMeta:Destroy()
|
if Num == NumOfActive then
|
||||||
local p = self[0].Owner
|
Num = 0
|
||||||
p.Inventory = nil
|
|
||||||
p:GetInventory()
|
|
||||||
end
|
|
||||||
|
|
||||||
function InventoryMeta:BugCheck()
|
|
||||||
for i, v in pairs(self) do
|
|
||||||
if i != 0 and !i:IsValid() then
|
|
||||||
self[i] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function InventoryMeta:GetWeighted()
|
|
||||||
local itemlist = {}
|
|
||||||
|
|
||||||
for i, v in pairs(self) do
|
|
||||||
if i == 0 then continue end
|
|
||||||
table.insert( itemlist, i )
|
|
||||||
end
|
|
||||||
|
|
||||||
table.sort( itemlist, function( a, b )
|
|
||||||
return a:GetAcquisition() < b:GetAcquisition()
|
|
||||||
end)
|
|
||||||
|
|
||||||
return itemlist
|
|
||||||
end
|
|
||||||
|
|
||||||
function InventoryMeta:Sync()
|
|
||||||
if SERVER then
|
|
||||||
net.Start("AEINV_InvSync")
|
|
||||||
local count = table.Count( self )-1 -- The header is included
|
|
||||||
net.WriteUInt( count, 8 )
|
|
||||||
for key, _ in pairs( self ) do
|
|
||||||
if key == 0 then continue end
|
|
||||||
net.WriteEntity( key )
|
|
||||||
end
|
end
|
||||||
net.Send( self[0].Owner )
|
input.SelectWeapon( ply:GetWeapon("goat_"..Num) )
|
||||||
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
end
|
if qt[bind] then
|
||||||
|
if pressed then
|
||||||
|
local Num = 0
|
||||||
|
|
||||||
InventoryMeta.__index = InventoryMeta
|
local inv = ply:GetInventory():GetWeighted()
|
||||||
|
local wep = ply:HandlerCheck()
|
||||||
|
local invf = table.Flip( inv )
|
||||||
|
local invc = #inv
|
||||||
|
|
||||||
|
Num = wep:GetDesireR() and invf[wep:GetDesireR()] or 0
|
||||||
|
Num = Num + qt[bind]
|
||||||
|
|
||||||
function PT:GetInventory()
|
if Num > invc then
|
||||||
if !self.Inventory then
|
Num = 0
|
||||||
print("[inventory] new inventory created: ", self)
|
elseif Num < 0 then
|
||||||
self.Inventory = {}
|
Num = invc
|
||||||
self.Inventory[0] = { Owner = self }
|
|
||||||
setmetatable( self.Inventory, InventoryMeta )
|
|
||||||
|
|
||||||
if SERVER then
|
|
||||||
for i, v in pairs( self:GetChildren() ) do
|
|
||||||
if v.AEItem then
|
|
||||||
print( "[inventory] regen: adding", v)
|
|
||||||
self.Inventory[v] = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
self.Inventory:Sync()
|
|
||||||
|
input.SelectWeapon( ply:GetWeapon("goat_"..Num) )
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
self.Inventory:BugCheck()
|
|
||||||
|
|
||||||
return self.Inventory
|
|
||||||
end
|
|
||||||
|
|
||||||
gameevent.Listen( "OnRequestFullUpdate" )
|
|
||||||
hook.Add( "OnRequestFullUpdate", "Benny_OnRequestFullUpdate_Inventory", function( data )
|
|
||||||
local name = data.name // Same as Player:Nick()
|
|
||||||
local steamid = data.networkid // Same as Player:SteamID()
|
|
||||||
local id = data.userid // Same as Player:UserID()
|
|
||||||
local index = data.index // Same as Entity:EntIndex() minus one
|
|
||||||
|
|
||||||
if SERVER then
|
|
||||||
print("[inventory]", Player(id), "FullUpdate resync")
|
|
||||||
Player(id):GetInventory():Sync()
|
|
||||||
end
|
|
||||||
end )
|
|
||||||
|
|
||||||
if SERVER then
|
|
||||||
util.AddNetworkString("AEINV_InvSync")
|
|
||||||
else
|
|
||||||
net.Receive("AEINV_InvSync", function()
|
|
||||||
print("[inventory] sync start:")
|
|
||||||
local p = LocalPlayer()
|
|
||||||
p.Inventory = nil
|
|
||||||
if p.GetInventory then
|
|
||||||
local inv = p:GetInventory()
|
|
||||||
local count = net.ReadUInt(8)
|
|
||||||
for i=1, count do
|
|
||||||
local key = net.ReadEntity()
|
|
||||||
print( "\tadded", key)
|
|
||||||
inv[key] = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
print("\ti don't have an inventory, maybe you asked too early!!")
|
|
||||||
end
|
|
||||||
print("\tsync done")
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
do
|
|
||||||
local qt2 = {
|
|
||||||
["slot1"] = 1,
|
|
||||||
["slot2"] = 2,
|
|
||||||
["slot3"] = 3,
|
|
||||||
["slot4"] = 4,
|
|
||||||
["slot5"] = 5,
|
|
||||||
["slot6"] = 6,
|
|
||||||
["slot7"] = 7,
|
|
||||||
["slot8"] = 8,
|
|
||||||
["slot9"] = 9,
|
|
||||||
["slot0"] = 0,
|
|
||||||
}
|
|
||||||
local qt = {
|
|
||||||
["invprev"] = -1,
|
|
||||||
["invnext"] = 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
hook.Add( "PlayerBindPress", "Benny_PlayerBindPress_Original", function( ply, bind, pressed, code )
|
|
||||||
if qt2[bind] then
|
|
||||||
local Num = qt2[bind]
|
|
||||||
if pressed then
|
|
||||||
local inv = ply:GetInventory():GetWeighted()
|
|
||||||
local wep = ply:HandlerCheck()
|
|
||||||
local invf = table.Flip( inv )
|
|
||||||
|
|
||||||
local NumOfActive = 0
|
|
||||||
NumOfActive = invf[wep:GetDesireR()]
|
|
||||||
|
|
||||||
if Num == NumOfActive then
|
|
||||||
Num = 0
|
|
||||||
end
|
|
||||||
input.SelectWeapon( ply:GetWeapon("goat_"..Num) )
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
if qt[bind] then
|
|
||||||
if pressed then
|
|
||||||
local Num = 0
|
|
||||||
|
|
||||||
local inv = ply:GetInventory():GetWeighted()
|
|
||||||
local wep = ply:HandlerCheck()
|
|
||||||
local invf = table.Flip( inv )
|
|
||||||
local invc = #inv
|
|
||||||
|
|
||||||
Num = wep:GetDesireR() and invf[wep:GetDesireR()] or 0
|
|
||||||
Num = Num + qt[bind]
|
|
||||||
|
|
||||||
if Num > invc then
|
|
||||||
Num = 0
|
|
||||||
elseif Num < 0 then
|
|
||||||
Num = invc
|
|
||||||
end
|
|
||||||
|
|
||||||
input.SelectWeapon( ply:GetWeapon("goat_"..Num) )
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- breaks GESTURE_SLOT_ATTACK_AND_RELOAD and I can't fucking have that
|
|
||||||
hook.Add("DoAnimationEvent", "Benny_DoAnimationEvent_FixAnimations", function( ply, event, data )
|
|
||||||
return ACT_INVALID
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
hook.Add( "PlayerSwitchWeapon", "Benny_PlayerSwitchWeapon_Goat", function( ply, old, ent )
|
hook.Add( "PlayerSwitchWeapon", "Benny_PlayerSwitchWeapon_Goat", function( ply, old, ent )
|
||||||
|
@ -200,7 +80,6 @@ end)
|
||||||
|
|
||||||
for i=0, 9 do
|
for i=0, 9 do
|
||||||
local tent = {}
|
local tent = {}
|
||||||
--tent.Base = "goat"
|
|
||||||
tent.Goat = i
|
tent.Goat = i
|
||||||
|
|
||||||
weapons.Register( tent, "goat_" .. i )
|
weapons.Register( tent, "goat_" .. i )
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,101 @@
|
||||||
|
|
||||||
|
do -- Base
|
||||||
|
local ITEM, Base = CreateItem( "base" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "Item Base"
|
||||||
|
ITEM.Description = "Testing testing"
|
||||||
|
ITEM.Category = "base"
|
||||||
|
|
||||||
|
ITEM.Model = bModel("weapons/test_g18")
|
||||||
|
ITEM.DefaultBodygroups = {}
|
||||||
|
ITEM.HoldType = "handgun"
|
||||||
|
|
||||||
|
ITEM.Vars = {
|
||||||
|
["Float"] = {
|
||||||
|
"Acquisition",
|
||||||
|
"HolsterIn",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
ITEM.DeploySound = bSound("dev/magpouch.ogg")
|
||||||
|
ITEM.StartHolsterSound = bSound("dev/magpouch_replace_small.ogg")
|
||||||
|
ITEM.FinishHolsterSound = bSound("dev/holster.ogg")
|
||||||
|
ITEM.CancelHolsterSound = bSound("dev/grab.ogg")
|
||||||
|
|
||||||
|
function ITEM:EntInitialize()
|
||||||
|
for k, v in ipairs(self.DefaultBodygroups) do
|
||||||
|
if v then
|
||||||
|
self:SetBodygroup( k-1, v )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:Sound( soundName, soundLevel, pitchPercent, volume, channel, soundFlags, dsp, filter )
|
||||||
|
local emiton = self
|
||||||
|
if self:GetHandler():IsValid() then
|
||||||
|
emiton = self:GetHandler()
|
||||||
|
end
|
||||||
|
emiton:EmitSound( soundName, soundLevel, pitchPercent, volume, channel, soundFlags, dsp )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:Attack() end
|
||||||
|
function ITEM:AttackAlt() end
|
||||||
|
|
||||||
|
function ITEM:Think()
|
||||||
|
if self:GetHolsterIn() != 0 and self:GetHolsterIn() <= CurTime() then
|
||||||
|
self:FinishHolster()
|
||||||
|
self:SetHolsterIn( 0 )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:PlayerAnimation( seqname )
|
||||||
|
local p = self:GetOwner()
|
||||||
|
p:DoCustomAnimEvent( BGESTURE_ITEM1_RIGHT, p:LookupSequence( seqname ) )
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Use after children added.
|
||||||
|
function ITEM:ReevalRecreate()
|
||||||
|
self:RemoveEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
||||||
|
if self:GetOwner():IsValid() then
|
||||||
|
if self:GetOwner():IsEFlagSet( EFL_KEEP_ON_RECREATE_ENTITIES ) then
|
||||||
|
self:AddEFlags( EFL_KEEP_ON_RECREATE_ENTITIES )
|
||||||
|
print( "[Item " .. tostring(self) .. "] To be saved during recreate.")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
print( "[Item " .. tostring(self) .. "] Will NOT be saved during recreate.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print( "[Item " .. tostring(self) .. "] Will NOT be saved during recreate. No owner either")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:EntThink() end
|
||||||
|
function ITEM:EntPhysicsCollide() end
|
||||||
|
function ITEM:Reload() end
|
||||||
|
function ITEM:Drop() end
|
||||||
|
function ITEM:Deploy()
|
||||||
|
self:Sound( self.DeploySound, 70, 100, 0.4 )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:StartHolster()
|
||||||
|
self:Sound( self.StartHolsterSound, 70, 100, 0.4 )
|
||||||
|
self:SetHolsterIn( CurTime() + 0.25 )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:FinishHolster()
|
||||||
|
self:Sound( self.FinishHolsterSound, 70, 100, 0.4, CHAN_STATIC )
|
||||||
|
|
||||||
|
self:GetHandler():SetActiveR( NULL )
|
||||||
|
self:SetNoDraw( true )
|
||||||
|
-- LAZY FIX
|
||||||
|
for i, v in ipairs(self:GetChildren()) do
|
||||||
|
v:SetNoDraw(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:CancelHolster()
|
||||||
|
self:SetHolsterIn( 0 )
|
||||||
|
self:Sound( self.CancelHolsterSound, 70, 100, 0.4 )
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,343 @@
|
||||||
|
|
||||||
|
do -- Base Firearm
|
||||||
|
local AnimationLookup = {
|
||||||
|
["fire"] = {
|
||||||
|
["handgun"] = "handgun_fire",
|
||||||
|
["rifle"] = "rifle_fire",
|
||||||
|
},
|
||||||
|
["reload"] = {
|
||||||
|
["handgun"] = "handgun_reload",
|
||||||
|
["rifle"] = "rifle_reload",
|
||||||
|
},
|
||||||
|
["reload_rack"] = {
|
||||||
|
["handgun"] = "handgun_reload_rack",
|
||||||
|
["rifle"] = "rifle_reload_rack",
|
||||||
|
},
|
||||||
|
["reload_insert"] = {
|
||||||
|
["handgun"] = "handgun_reload_insert",
|
||||||
|
["rifle"] = "rifle_reload_insert",
|
||||||
|
},
|
||||||
|
["deploy"] = {
|
||||||
|
["handgun"] = "handgun_deploy",
|
||||||
|
["rifle"] = "rifle_deploy",
|
||||||
|
},
|
||||||
|
["holster"] = {
|
||||||
|
["handgun"] = "handgun_holster",
|
||||||
|
["rifle"] = "handgun_holster",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local ITEM, Base = CreateItem( "base_firearm", "base" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "Firearm Base"
|
||||||
|
ITEM.Description = "Testing testing"
|
||||||
|
ITEM.Category = "base"
|
||||||
|
|
||||||
|
ITEM.Vars = {
|
||||||
|
["Bool"] = {
|
||||||
|
"Loaded",
|
||||||
|
},
|
||||||
|
["Int"] = {
|
||||||
|
"Clip",
|
||||||
|
"BurstCount",
|
||||||
|
"Firemode",
|
||||||
|
},
|
||||||
|
["Float"] = {
|
||||||
|
"Delay",
|
||||||
|
"DelayBurst",
|
||||||
|
"RefillTime",
|
||||||
|
"Accuracy_Reset",
|
||||||
|
"Accuracy_Amount",
|
||||||
|
"DelayReload",
|
||||||
|
},
|
||||||
|
["Entity"] = {
|
||||||
|
"Inventory"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
ITEM.Delay = 0.2
|
||||||
|
ITEM.Pellets = 1
|
||||||
|
ITEM.Accuracy = 1
|
||||||
|
ITEM.ClipSize = 15
|
||||||
|
ITEM.BurstCount = math.huge
|
||||||
|
ITEM.BurstRunaway = false
|
||||||
|
ITEM.BurstAuto = false
|
||||||
|
ITEM.BurstDelay = 0
|
||||||
|
|
||||||
|
ITEM.FireSound = bSound("weapons/m16a2/01.ogg") -- can be an iterative table
|
||||||
|
ITEM.MagOutSound = bSound("weapons/m16a2/magout.ogg")
|
||||||
|
ITEM.MagInSound = bSound("weapons/m16a2/magin.ogg")
|
||||||
|
ITEM.BoltDropSound = bSound("weapons/m16a2/cock.ogg")
|
||||||
|
ITEM.BoltPullSound = bSound("weapons/fnc/cock.ogg")
|
||||||
|
|
||||||
|
function ITEM:EntInitialize()
|
||||||
|
Base.EntInitialize( self )
|
||||||
|
if SERVER then
|
||||||
|
local inv = self:SetupInventory()
|
||||||
|
inv:SetReservedSlots( 1 )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:Attack()
|
||||||
|
if self:GetClip() <= 0 then return end
|
||||||
|
if self:GetDelay() > CurTime() then return end
|
||||||
|
if self:GetDelayBurst() > CurTime() then return end
|
||||||
|
if self:GetBurstCount() >= self.BurstCount then return end
|
||||||
|
if self:GetHolsterIn() != 0 then return end
|
||||||
|
|
||||||
|
self:SetDelay( CurTime() + self.Delay )
|
||||||
|
self:SetClip( self:GetClip() - 1 )
|
||||||
|
self:SetBurstCount( self:GetBurstCount() + 1 )
|
||||||
|
self:Sound( istable(self.FireSound) and TSelShared(self.FireSound, "FireSound") or self.FireSound )
|
||||||
|
|
||||||
|
local p = self:GetOwner()
|
||||||
|
local h = self:GetHandler()
|
||||||
|
if p:IsValid() then
|
||||||
|
self:PlayerAnimation( AnimationLookup["fire"][self.HoldType] )
|
||||||
|
end
|
||||||
|
|
||||||
|
self:PlayAnimation( self:LookupSequence("fire") )
|
||||||
|
|
||||||
|
p:LagCompensation(true)
|
||||||
|
h:FireBullets( {
|
||||||
|
Attacker = p,
|
||||||
|
Damage = 1,
|
||||||
|
Force = 5,
|
||||||
|
Tracer = 0,
|
||||||
|
Num = self.Pellets,
|
||||||
|
Dir = p:GetAimVector(),
|
||||||
|
Src = p:GetShootPos(),
|
||||||
|
Spread = Vector( acc, acc, 0 ),
|
||||||
|
} )
|
||||||
|
p:LagCompensation(false)
|
||||||
|
end
|
||||||
|
function ITEM:AttackAlt() end
|
||||||
|
function ITEM:Think()
|
||||||
|
local InProcess = self:GetBurstCount() > 0
|
||||||
|
local Topped = self:GetBurstCount() == self.BurstCount
|
||||||
|
local Runaway = self.BurstRunaway
|
||||||
|
local BAuto = self.BurstAuto
|
||||||
|
local Firedown = false
|
||||||
|
|
||||||
|
local p = self:GetOwner()
|
||||||
|
if IsValid(p) then
|
||||||
|
Firedown = p:KeyDown( IN_ATTACK )
|
||||||
|
end
|
||||||
|
if Runaway and InProcess and !Topped then
|
||||||
|
self:Attack()
|
||||||
|
else
|
||||||
|
if !Firedown then
|
||||||
|
if !Topped and InProcess then
|
||||||
|
self:SetDelayBurst( CurTime() + self.BurstDelay )
|
||||||
|
end
|
||||||
|
self:SetBurstCount( 0 )
|
||||||
|
end
|
||||||
|
if Topped and BAuto then
|
||||||
|
self:SetBurstCount( 0 )
|
||||||
|
self:SetDelayBurst( CurTime() + self.BurstDelay )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if self:GetRefillTime() != 0 and self:GetRefillTime() <= CurTime() then
|
||||||
|
self:SetClip( self.ClipSize )
|
||||||
|
self:SetRefillTime( 0 )
|
||||||
|
|
||||||
|
if SERVER then
|
||||||
|
local inv = self:GetInventory()
|
||||||
|
local ent = ents.Create("b-item_mag_m16a2")
|
||||||
|
if IsValid(ent) then
|
||||||
|
ent:AddEffects( EF_BONEMERGE + EF_BONEMERGE_FASTCULL )
|
||||||
|
ent:SetOwner( self )
|
||||||
|
ent:SetParent( self )
|
||||||
|
ent:SetLocalPos( vector_origin )
|
||||||
|
ent:SetLocalAngles( angle_zero )
|
||||||
|
ent:Spawn()
|
||||||
|
self:ReevalRecreate()
|
||||||
|
ent:ReevalRecreate()
|
||||||
|
|
||||||
|
ent:SetMoveType( MOVETYPE_NONE )
|
||||||
|
|
||||||
|
inv:SetItem1( ent )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Base.Think( self )
|
||||||
|
end
|
||||||
|
function ITEM:Deploy()
|
||||||
|
self:SetDelay( CurTime() + 0.5 )
|
||||||
|
self:PlayerAnimation( AnimationLookup["deploy"][self.HoldType] )
|
||||||
|
Base.Deploy( self )
|
||||||
|
end
|
||||||
|
function ITEM:Reload()
|
||||||
|
if self:GetDelay() > CurTime() then return end
|
||||||
|
if self:GetHolsterIn() != 0 then return end
|
||||||
|
|
||||||
|
local p = self:GetOwner()
|
||||||
|
local time = 0.4
|
||||||
|
|
||||||
|
if self:GetInventory():GetItem1():IsValid() then -- Mag loaded
|
||||||
|
-- Unload the mag
|
||||||
|
self:SetClip( 0 )
|
||||||
|
self:Sound( self.MagOutSound, 70, 100, 0.4 )
|
||||||
|
self:PlayerAnimation( AnimationLookup["reload"][self.HoldType] )
|
||||||
|
self:PlayAnimation( self:LookupSequence( "magout" ) )
|
||||||
|
time = 0.4
|
||||||
|
|
||||||
|
if CLIENT then
|
||||||
|
local inv = self:GetInventory()
|
||||||
|
local curr = inv:GetItem1()
|
||||||
|
if curr:IsValid() then
|
||||||
|
local bm = self:GetBoneMatrix( self:LookupBone("Weapon") )
|
||||||
|
debugoverlay.Cross( bm:GetTranslation(), 16, 0.5 )
|
||||||
|
|
||||||
|
local class = ITEMS["mag_m16a2"]
|
||||||
|
local ent = ents.CreateClientProp( class.Model ) --- TO BE A SHARED ENTITY IN THE FUTURE :3
|
||||||
|
ent:SetPos( bm:GetTranslation() )
|
||||||
|
ent:SetAngles( bm:GetAngles() + Angle( 0, -90, -90 ) )
|
||||||
|
ent:Spawn()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if SERVER then
|
||||||
|
local inv = self:GetInventory()
|
||||||
|
local curr = inv:GetItem1()
|
||||||
|
if curr:IsValid() then
|
||||||
|
inv:SetItem1( NULL )
|
||||||
|
curr:SetOwner( NULL )
|
||||||
|
curr:SetParent( NULL )
|
||||||
|
|
||||||
|
curr:Remove()
|
||||||
|
self:ReevalRecreate()
|
||||||
|
-- curr:SetMoveType( MOVETYPE_VPHYSICS )
|
||||||
|
-- curr:GetPhysicsObject():Wake()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Load it
|
||||||
|
self:SetRefillTime( CurTime() + 0.4 )
|
||||||
|
self:Sound( self.MagInSound, 70, 100, 0.4 )
|
||||||
|
self:PlayerAnimation( AnimationLookup["reload_insert"][self.HoldType] )
|
||||||
|
self:PlayAnimation( self:LookupSequence( "magin" ) )
|
||||||
|
end
|
||||||
|
|
||||||
|
time = 0.8
|
||||||
|
self:SetDelay( CurTime() + time )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:StartHolster()
|
||||||
|
self:SetDelay( CurTime() + 0.25 )
|
||||||
|
|
||||||
|
self:PlayerAnimation( AnimationLookup["holster"][self.HoldType] )
|
||||||
|
Base.StartHolster( self )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:FinishHolster()
|
||||||
|
Base.FinishHolster( self )
|
||||||
|
end
|
||||||
|
|
||||||
|
function ITEM:CancelHolster()
|
||||||
|
self:PlayerAnimation( AnimationLookup["deploy"][self.HoldType] )
|
||||||
|
Base.CancelHolster( self )
|
||||||
|
end
|
||||||
|
|
||||||
|
do -- Base Mag
|
||||||
|
local ITEM, Base = CreateItem( "base_mag", "base" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "Magazine Base"
|
||||||
|
ITEM.Description = "Testing testing"
|
||||||
|
ITEM.Category = "base"
|
||||||
|
end
|
||||||
|
|
||||||
|
do -- Handguns
|
||||||
|
do -- G18
|
||||||
|
local ITEM, Base = CreateItem( "g18", "base_firearm" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "#Item.g18.Name"
|
||||||
|
ITEM.Description = "#Item.g18.Description"
|
||||||
|
ITEM.Category = "pistol"
|
||||||
|
|
||||||
|
ITEM.Model = bModel("weapons/test_g18")
|
||||||
|
ITEM.HoldType = "handgun"
|
||||||
|
|
||||||
|
ITEM.BurstCount = math.huge
|
||||||
|
ITEM.Delay = (60/1000)
|
||||||
|
ITEM.ClipSize = 33
|
||||||
|
ITEM.FireSound = {
|
||||||
|
bSound("weapons/glock/01.ogg"),
|
||||||
|
bSound("weapons/glock/02.ogg"),
|
||||||
|
bSound("weapons/glock/03.ogg"),
|
||||||
|
}
|
||||||
|
ITEM.MagOutSound = bSound("weapons/glock/magout.ogg")
|
||||||
|
ITEM.MagInSound = bSound("weapons/glock/magin.ogg")
|
||||||
|
ITEM.BoltDropSound = bSound("weapons/glock/cock.ogg")
|
||||||
|
ITEM.BoltPullSound = bSound("weapons/glock/cock.ogg")
|
||||||
|
end
|
||||||
|
do -- MK23
|
||||||
|
local ITEM, Base = CreateItem( "mk23", "base_firearm" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "#Item.mk23.Name"
|
||||||
|
ITEM.Description = "#Item.mk23.Description"
|
||||||
|
ITEM.Category = "pistol"
|
||||||
|
|
||||||
|
ITEM.Model = bModel("weapons/test_mk23")
|
||||||
|
ITEM.DefaultBodygroups = { false, false, 1 }
|
||||||
|
ITEM.HoldType = "handgun"
|
||||||
|
|
||||||
|
ITEM.BurstCount = 1
|
||||||
|
ITEM.Delay = (60/320)
|
||||||
|
ITEM.ClipSize = 12
|
||||||
|
ITEM.FireSound = {
|
||||||
|
bSound("weapons/usp/sup_01.ogg"),
|
||||||
|
bSound("weapons/usp/sup_02.ogg"),
|
||||||
|
bSound("weapons/usp/sup_03.ogg"),
|
||||||
|
}
|
||||||
|
ITEM.MagOutSound = bSound("weapons/usp/magout.ogg")
|
||||||
|
ITEM.MagInSound = bSound("weapons/usp/magin.ogg")
|
||||||
|
ITEM.BoltDropSound = bSound("weapons/usp/slidedrop.ogg")
|
||||||
|
ITEM.BoltPullSound = bSound("weapons/glock/cock.ogg")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
do -- Rifles
|
||||||
|
do -- M16A2
|
||||||
|
local ITEM, Base = CreateItem( "m16a2", "base_firearm" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "#Item.m16a2.Name"
|
||||||
|
ITEM.Description = "#Item.m16a2.Description"
|
||||||
|
ITEM.Category = "assaultrifle"
|
||||||
|
|
||||||
|
ITEM.Model = bModel("weapons/test_m16a2")
|
||||||
|
ITEM.DefaultBodygroups = { false, false, 1 }
|
||||||
|
ITEM.HoldType = "rifle"
|
||||||
|
|
||||||
|
ITEM.BurstCount = 3
|
||||||
|
ITEM.BurstRunaway = true
|
||||||
|
ITEM.BurstAuto = true
|
||||||
|
ITEM.BurstDelay = 0.2
|
||||||
|
ITEM.Delay = (60/1050)
|
||||||
|
ITEM.ClipSize = 30
|
||||||
|
ITEM.FireSound = {
|
||||||
|
bSound("weapons/m16a2/01.ogg"),
|
||||||
|
bSound("weapons/m16a2/02.ogg"),
|
||||||
|
bSound("weapons/m16a2/03.ogg"),
|
||||||
|
}
|
||||||
|
ITEM.MagOutSound = bSound("weapons/m16a2/magout.ogg")
|
||||||
|
ITEM.MagInSound = bSound("weapons/m16a2/magin.ogg")
|
||||||
|
ITEM.BoltDropSound = bSound("weapons/m16a2/cock.ogg")
|
||||||
|
ITEM.BoltPullSound = bSound("weapons/fnc/cock.ogg")
|
||||||
|
|
||||||
|
do
|
||||||
|
local ITEM, Base = CreateItem( "mag_m16a2", "base_mag" )
|
||||||
|
|
||||||
|
ITEM.PrintName = "#Item.mag_m16a2.Name"
|
||||||
|
ITEM.Description = "#Item.mag_m16a2.Description"
|
||||||
|
ITEM.Category = "magazine"
|
||||||
|
|
||||||
|
ITEM.Model = bModel("weapons/test_m16a2_mag")
|
||||||
|
ITEM.DefaultBodygroups = {}
|
||||||
|
ITEM.HoldType = "magazine"
|
||||||
|
|
||||||
|
ITEM.ClipSize = 30
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -134,6 +134,25 @@ L["Gamemode.dem.Description"] = "One half tries to destroy the other halves o
|
||||||
L["Gamemode.hp.Name"] = "Hardpoint"
|
L["Gamemode.hp.Name"] = "Hardpoint"
|
||||||
L["Gamemode.hp.Description"] = "Several teams fight to hold a singular capture point for the longest amount of time."
|
L["Gamemode.hp.Description"] = "Several teams fight to hold a singular capture point for the longest amount of time."
|
||||||
|
|
||||||
|
-- Categories
|
||||||
|
L["ItemCategory.pistol.Name"] = "Handgun"
|
||||||
|
L["ItemCategory.pistol.Description"] = "Lightweight sidearm. Drawn and reloaded quickly."
|
||||||
|
|
||||||
|
L["ItemCategory.smg.Name"] = "Sub-machine Gun"
|
||||||
|
L["ItemCategory.smg.Description"] = "Lightweight automatic weapon. Fires pistol cartridges."
|
||||||
|
|
||||||
|
L["ItemCategory.assaultrifle.Name"] = "Assault Rifle"
|
||||||
|
L["ItemCategory.assaultrifle.Description"] = "High stopping power, but poor maneuverability."
|
||||||
|
|
||||||
|
L["ItemCategory.machinegun.Name"] = "Machine Gun"
|
||||||
|
L["ItemCategory.machinegun.Description"] = "Automatic weapon designed for sustained fire."
|
||||||
|
|
||||||
|
L["ItemCategory.shotgun.Name"] = "Shotgun"
|
||||||
|
L["ItemCategory.shotgun.Description"] = "Great in close-quarters combat."
|
||||||
|
|
||||||
|
L["ItemCategory.utility.Name"] = "Utility"
|
||||||
|
L["ItemCategory.utility.Description"] = "Throwables and deployables."
|
||||||
|
|
||||||
-- Teams
|
-- Teams
|
||||||
L["Team.cia.Name"] = "CIA"
|
L["Team.cia.Name"] = "CIA"
|
||||||
L["Team.cia.Description"] = "CIA black ops, coverup crew"
|
L["Team.cia.Description"] = "CIA black ops, coverup crew"
|
||||||
|
|
|
@ -44,6 +44,8 @@ function GM:PlayerSpawn( ply )
|
||||||
ply:SetHealth_Blood( 1000 )
|
ply:SetHealth_Blood( 1000 )
|
||||||
ply:SetHealth_Stamina( 1000 )
|
ply:SetHealth_Stamina( 1000 )
|
||||||
|
|
||||||
|
ply:SetupInventory()
|
||||||
|
|
||||||
ply:MakeCharacter()
|
ply:MakeCharacter()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -189,7 +191,36 @@ function PT:HandlerCheck()
|
||||||
return ( wep:IsValid() and wep:GetClass() == "itemhandler" and wep.GetActiveR ) and wep or false
|
return ( wep:IsValid() and wep:GetClass() == "itemhandler" and wep.GetActiveR ) and wep or false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Temporary
|
BGESTURE_ITEM1_RIGHT = GESTURE_SLOT_ATTACK_AND_RELOAD -- 0
|
||||||
|
BGESTURE_ITEM1_LEFT = GESTURE_SLOT_GRENADE -- 1
|
||||||
|
BGESTURE_ITEM2_RIGHT = GESTURE_SLOT_JUMP -- 2
|
||||||
|
BGESTURE_ITEM2_LEFT = GESTURE_SLOT_SWIM -- 3
|
||||||
|
BGESTURE_ACTION_RIGHT = GESTURE_SLOT_FLINCH -- 4
|
||||||
|
BGESTURE_ACTION_LEFT = GESTURE_SLOT_VCD -- 5
|
||||||
|
BGESTURE_JUMP = GESTURE_SLOT_CUSTOM -- 6
|
||||||
|
|
||||||
|
-- PLAYERANIMEVENT_ATTACK_PRIMARY = 0 -- Primary attack
|
||||||
|
-- PLAYERANIMEVENT_ATTACK_SECONDARY = 1 -- Secondary attack
|
||||||
|
-- PLAYERANIMEVENT_ATTACK_GRENADE = 2 -- Grenade throw
|
||||||
|
-- PLAYERANIMEVENT_RELOAD = 3 -- Reload
|
||||||
|
-- PLAYERANIMEVENT_RELOAD_LOOP = 4 -- Looping reload (single-reload shotguns)
|
||||||
|
-- PLAYERANIMEVENT_RELOAD_END = 5 -- Looping reload end
|
||||||
|
-- PLAYERANIMEVENT_JUMP = 6 -- Jump
|
||||||
|
|
||||||
|
-- breaks GESTURE_SLOT_ATTACK_AND_RELOAD, so do my own thing
|
||||||
|
-- 0 through 6 are real
|
||||||
|
hook.Add("DoAnimationEvent", "Benny_DoAnimationEvent_FixAnimations", function( p, event, data )
|
||||||
|
-- 23, PLAYERANIMEVENT_CANCEL_RELOAD, is annoying and breaks animations
|
||||||
|
if event >= 0 and event <= 6 then
|
||||||
|
if data == 0 then
|
||||||
|
-- print("[DoAnimationEvent] Called " .. event .. " with data 0." )
|
||||||
|
return ACT_INVALID
|
||||||
|
end
|
||||||
|
-- print("running?", event, data )
|
||||||
|
p:AddVCDSequenceToGestureSlot( event, math.floor(data), 0, true )
|
||||||
|
end
|
||||||
|
return ACT_INVALID
|
||||||
|
end)
|
||||||
|
|
||||||
function GM:UpdateAnimation( ply, vel, maxseqgroundspeed )
|
function GM:UpdateAnimation( ply, vel, maxseqgroundspeed )
|
||||||
ply:SetPlaybackRate( 1 )
|
ply:SetPlaybackRate( 1 )
|
||||||
|
@ -208,8 +239,8 @@ function GM:UpdateAnimation( ply, vel, maxseqgroundspeed )
|
||||||
normal.x = normal.x * needer
|
normal.x = normal.x * needer
|
||||||
normal.y = normal.y * needer
|
normal.y = normal.y * needer
|
||||||
|
|
||||||
local diveend = ply:GetLayerSequence( GESTURE_SLOT_JUMP ) == ply:LookupSequence("dive_end_handgun")
|
local diveend = ply:GetLayerSequence( BGESTURE_JUMP ) == ply:LookupSequence("dive_end_handgun")
|
||||||
local divestart = ply:GetLayerSequence( GESTURE_SLOT_JUMP ) == ply:LookupSequence("dive_start_handgun")
|
local divestart = ply:GetLayerSequence( BGESTURE_JUMP ) == ply:LookupSequence("dive_start_handgun")
|
||||||
|
|
||||||
if ply:GetInDive() or diveend then speed = 1 end
|
if ply:GetInDive() or diveend then speed = 1 end
|
||||||
|
|
||||||
|
@ -230,7 +261,10 @@ function GM:UpdateAnimation( ply, vel, maxseqgroundspeed )
|
||||||
|
|
||||||
magic = magic * 0.75
|
magic = magic * 0.75
|
||||||
|
|
||||||
ply:SetPoseParameter( "aim_p", -ply:EyeAngles().p/90 )
|
local ea = ply:EyeAngles()
|
||||||
|
ea:Normalize()
|
||||||
|
|
||||||
|
ply:SetPoseParameter( "aim_p", -ea.p/90 )
|
||||||
ply:SetPoseParameter( "aim_y", 0 )--magic/90 )
|
ply:SetPoseParameter( "aim_y", 0 )--magic/90 )
|
||||||
|
|
||||||
|
|
||||||
|
@ -239,17 +273,17 @@ function GM:UpdateAnimation( ply, vel, maxseqgroundspeed )
|
||||||
ply:SetRenderAngles( Angle( 0, ply:EyeAngles().y, 0 ) )
|
ply:SetRenderAngles( Angle( 0, ply:EyeAngles().y, 0 ) )
|
||||||
|
|
||||||
if diveend then
|
if diveend then
|
||||||
local magicnumber = ply:GetLayerCycle( GESTURE_SLOT_JUMP )
|
local magicnumber = ply:GetLayerCycle( BGESTURE_JUMP )
|
||||||
magicnumber = math.Remap( magicnumber, 0.5, 0.75, 1, 0 )
|
magicnumber = math.Remap( magicnumber, 0.5, 0.75, 1, 0 )
|
||||||
magicnumber = math.Clamp( magicnumber, 0, 1 )
|
magicnumber = math.Clamp( magicnumber, 0, 1 )
|
||||||
ply:AnimSetGestureWeight( GESTURE_SLOT_JUMP, magicnumber )
|
ply:AnimSetGestureWeight( BGESTURE_JUMP, magicnumber )
|
||||||
elseif divestart then
|
elseif divestart then
|
||||||
local magicnumber = ply:GetLayerCycle( GESTURE_SLOT_JUMP )
|
local magicnumber = ply:GetLayerCycle( BGESTURE_JUMP )
|
||||||
magicnumber = math.Remap( magicnumber, 0.1, 0.6, 1, 0 )
|
magicnumber = math.Remap( magicnumber, 0.1, 0.6, 1, 0 )
|
||||||
magicnumber = math.Clamp( magicnumber, 0, 1 )
|
magicnumber = math.Clamp( magicnumber, 0, 1 )
|
||||||
ply:AnimSetGestureWeight( GESTURE_SLOT_JUMP, magicnumber )
|
ply:AnimSetGestureWeight( BGESTURE_JUMP, magicnumber )
|
||||||
else
|
else
|
||||||
ply:AnimSetGestureWeight( GESTURE_SLOT_JUMP, 1 )
|
ply:AnimSetGestureWeight( BGESTURE_JUMP, 1 )
|
||||||
end
|
end
|
||||||
|
|
||||||
--local dir = ply:GetVelocity():GetNormalized()
|
--local dir = ply:GetVelocity():GetNormalized()
|
||||||
|
@ -287,10 +321,8 @@ function GM:CalcMainActivity( ply, velocity )
|
||||||
|
|
||||||
local w = ply:HandlerCheck()
|
local w = ply:HandlerCheck()
|
||||||
local wpntype = "none"
|
local wpntype = "none"
|
||||||
if w then
|
if w and w:ItemR() then
|
||||||
if w:ItemR() and w:ItemR().Class.HoldType then
|
wpntype = w:ItemR().HoldType
|
||||||
wpntype = w:ItemR().Class.HoldType
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
plyTable.CalcSeqOverride = ply:LookupSequence( Animations["idle"][wpntype] )
|
plyTable.CalcSeqOverride = ply:LookupSequence( Animations["idle"][wpntype] )
|
||||||
|
|
||||||
|
@ -384,35 +416,19 @@ hook.Add("Move", "Benny_Move", function( ply, mv )
|
||||||
ply:SetInDive( true )
|
ply:SetInDive( true )
|
||||||
ply:SetDivedAt( CurTime() )
|
ply:SetDivedAt( CurTime() )
|
||||||
if SERVER or CLIENT and IsFirstTimePredicted() then
|
if SERVER or CLIENT and IsFirstTimePredicted() then
|
||||||
ply:AddVCDSequenceToGestureSlot( GESTURE_SLOT_JUMP, ply:LookupSequence( "dive_start_handgun" ), 0, true )
|
ply:HandlerCheck():EmitSound( "weapons/slam/throw.wav", 70, 100, .25 )
|
||||||
end
|
ply:DoCustomAnimEvent( BGESTURE_JUMP, ply:LookupSequence( "dive_start_handgun" ) )
|
||||||
if (SERVER) or (CLIENT and IsFirstTimePredicted()) then
|
|
||||||
local rfil = nil
|
|
||||||
if SERVER then
|
|
||||||
rfil = RecipientFilter()
|
|
||||||
rfil:AddPAS(ply:GetPos())
|
|
||||||
rfil:RemovePlayer( ply )
|
|
||||||
end
|
|
||||||
ply:EmitSound("weapons/slam/throw.wav", 70, 100, .25, nil, nil, nil, rfil)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if ply:OnGround() and ply:GetInDive() then
|
if ply:OnGround() and ply:GetInDive() then
|
||||||
if (SERVER) or (CLIENT and IsFirstTimePredicted()) then
|
|
||||||
local rfil = nil
|
|
||||||
if SERVER then
|
|
||||||
rfil = RecipientFilter()
|
|
||||||
rfil:AddPAS(ply:GetPos())
|
|
||||||
rfil:RemovePlayer( ply )
|
|
||||||
end
|
|
||||||
ply:EmitSound("npc/combine_soldier/gear1.wav", 70, 100, .25, nil, nil, nil, rfil)
|
|
||||||
end
|
|
||||||
ply:SetInDive(false)
|
ply:SetInDive(false)
|
||||||
ply:SetDivedAt( CurTime() )
|
ply:SetDivedAt( CurTime() )
|
||||||
if SERVER or CLIENT and IsFirstTimePredicted() then
|
|
||||||
ply:AddVCDSequenceToGestureSlot( GESTURE_SLOT_JUMP, ply:LookupSequence( "dive_end_handgun" ), 0, true )
|
|
||||||
end
|
|
||||||
mv:SetVelocity( mv:GetVelocity() + Vector( 0, 0, 120 ) )
|
mv:SetVelocity( mv:GetVelocity() + Vector( 0, 0, 120 ) )
|
||||||
ply:SetGroundEntity( NULL )
|
ply:SetGroundEntity( NULL )
|
||||||
|
if SERVER or CLIENT and IsFirstTimePredicted() then
|
||||||
|
ply:HandlerCheck():EmitSound( "npc/combine_soldier/gear1.wav", 70, 100, .25 )
|
||||||
|
ply:DoCustomAnimEvent( BGESTURE_JUMP, ply:LookupSequence( "dive_end_handgun" ) )
|
||||||
|
end
|
||||||
end
|
end
|
||||||
--if !ply:OnGround() and ply:GetInDive() then
|
--if !ply:OnGround() and ply:GetInDive() then
|
||||||
-- local da = ply:GetDivedAt()
|
-- local da = ply:GetDivedAt()
|
||||||
|
|
|
@ -47,6 +47,7 @@ function PLAYER:SetupDataTables()
|
||||||
self.Player:NetworkVar( "Float", "DivedAt" )
|
self.Player:NetworkVar( "Float", "DivedAt" )
|
||||||
self.Player:NetworkVar( "Float", "TouchedObjectiveTime" )
|
self.Player:NetworkVar( "Float", "TouchedObjectiveTime" )
|
||||||
|
|
||||||
|
self.Player:NetworkVar( "Entity", "Inventory" )
|
||||||
self.Player:NetworkVar( "Entity", "TouchedObjective" )
|
self.Player:NetworkVar( "Entity", "TouchedObjective" )
|
||||||
|
|
||||||
self.Player:NetworkVar( "Vector", "VaultPos1")
|
self.Player:NetworkVar( "Vector", "VaultPos1")
|
||||||
|
|
|
@ -42,6 +42,18 @@ function TSelShared( tbl, seed )
|
||||||
return tbl[math.Round( util.SharedRandom( seed, 1, #tbl ) )]
|
return tbl[math.Round( util.SharedRandom( seed, 1, #tbl ) )]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function bModel( input )
|
||||||
|
local str = "models/benny/" .. input .. ".mdl"
|
||||||
|
util.PrecacheModel( str )
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
|
||||||
|
function bSound( input )
|
||||||
|
local str = "benny/" .. input
|
||||||
|
util.PrecacheSound( str )
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
|
||||||
-- Language might want to be loaded first
|
-- Language might want to be loaded first
|
||||||
-- Otherwise things will fail to call 'l8'
|
-- Otherwise things will fail to call 'l8'
|
||||||
AC("language.lua")
|
AC("language.lua")
|
||||||
|
|
Loading…
Reference in New Issue