144 lines
3.4 KiB
Lua
144 lines
3.4 KiB
Lua
AddCSLuaFile()
|
|
|
|
ENT.Type = "anim"
|
|
ENT.Base = "base_anim"
|
|
ENT.PrintName = "Scrap Box"
|
|
ENT.Category = "Other"
|
|
|
|
ENT.Spawnable = true
|
|
ENT.AdminOnly = false
|
|
ENT.DoNotDuplicate = false
|
|
ENT.AlreadyUsed = false
|
|
|
|
function ENT:SetupDataTables()
|
|
self:NetworkVar( "Int", 0, "Scrap" )
|
|
end
|
|
|
|
function ENT:SpawnFunction(ply, tr, cls)
|
|
|
|
if (!tr.Hit) then return end
|
|
|
|
local SpawnPos = tr.HitPos + tr.HitNormal * 20
|
|
local SpawnAng = ply:EyeAngles()
|
|
|
|
local ent = ents.Create(cls)
|
|
|
|
ent:SetPos(SpawnPos)
|
|
ent:SetAngles(SpawnAng)
|
|
ent:Spawn()
|
|
ent:Activate()
|
|
|
|
return ent
|
|
end
|
|
|
|
function ENT:Initialize()
|
|
if CLIENT then return end
|
|
self:SetModel("models/static/nmrih_tool_box_01.mdl")
|
|
self:PhysicsInit(SOLID_VPHYSICS)
|
|
self:SetMoveType(MOVETYPE_VPHYSICS)
|
|
self:SetSolid(SOLID_VPHYSICS)
|
|
self:DrawShadow(true)
|
|
|
|
self:SetTrigger(true)
|
|
self:UseTriggerBounds(true,14)
|
|
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
|
self:SetUseType(SIMPLE_USE)
|
|
|
|
local phys = self:GetPhysicsObject()
|
|
if IsValid(phys) then
|
|
phys:Wake()
|
|
phys:SetMass(35)
|
|
phys:SetMaterial( "metal" )
|
|
end
|
|
|
|
self:SetScrap( 0 )
|
|
--SafeRemoveEntityDelayed( self, 30 )
|
|
end
|
|
|
|
function ENT:OnTakeDamage( damage )
|
|
self:TakePhysicsDamage(damage)
|
|
end
|
|
|
|
function ENT:PhysicsCollide(data, phys)
|
|
if data.DeltaTime > 0.2 then
|
|
self:EmitSound(data.Speed > 250 and "Metal_Box.ImpactHard" or "Metal_Box.ImpactSoft")
|
|
end
|
|
end
|
|
function ENT:StartTouch( activator )
|
|
if activator:IsPlayer() then self:Use( activator ) end
|
|
end
|
|
function ENT:Use(activator, caller)
|
|
if self.AlreadyUsed then return end
|
|
if activator:IsPlayer() then
|
|
activator:SetNWInt("Scrap",activator:GetNWInt("Scrap")+self:GetScrap())
|
|
self:EmitSound("ui/item_metal_scrap_pickup.wav")
|
|
self:EmitSound("misc/scrap_sound/scrap_rebel.wav",75,math.random(95,105))
|
|
self:Remove()
|
|
|
|
net.Start("DisplayScrap")
|
|
net.WriteInt(1000,11)
|
|
net.Send(activator)
|
|
self.AlreadyUsed = true
|
|
end
|
|
end
|
|
|
|
if CLIENT then
|
|
|
|
function ENT:OnRemove()
|
|
local ed = EffectData()
|
|
ed:SetOrigin(self:GetPos())
|
|
ed:SetEntity(self)
|
|
util.Effect( "entity_remove", ed, true, true )
|
|
end
|
|
|
|
function ENT:BeingLookedAtByLocalPlayer()
|
|
local lp = LocalPlayer()
|
|
local trace = util.TraceHull( {
|
|
start = lp:GetShootPos(),
|
|
endpos = lp:GetShootPos() + lp:GetAimVector() * 200,
|
|
filter = lp,
|
|
mins = Vector( -3, -3, -3 ),
|
|
maxs = Vector( 3, 3, 3 ),
|
|
mask = MASK_SHOT,
|
|
} )
|
|
|
|
if trace.Entity ~= self then return false end
|
|
if trace.HitPos:Distance(LocalPlayer():GetShootPos()) > 200 then return false end
|
|
|
|
return true
|
|
end
|
|
|
|
local halos = {}
|
|
local halos_inv = {}
|
|
|
|
function ENT:DrawEntityOutline()
|
|
if halos_inv[self] then return end
|
|
halos[#halos+1] = self
|
|
halos_inv[self] = true
|
|
end
|
|
|
|
local Mat = Material( "sprites/light_ignorez" )
|
|
|
|
function ENT:Draw()
|
|
self:DrawModel()
|
|
|
|
if self:BeingLookedAtByLocalPlayer() then
|
|
if self.RenderGroup == RENDERGROUP_OPAQUE then
|
|
self.OldRenderGroup = self.RenderGroup
|
|
self.RenderGroup = RENDERGROUP_TRANSLUCENT
|
|
end
|
|
self:DrawEntityOutline()
|
|
self:DrawModel()
|
|
AddWorldTip( self:EntIndex(), "Scraps: "..self:GetScrap(), nil, self:WorldSpaceCenter(), nil )
|
|
else
|
|
if self.OldRenderGroup then
|
|
self.RenderGroup = self.OldRenderGroup
|
|
self.OldRenderGroup = nil
|
|
end
|
|
self:DrawModel()
|
|
render.SetMaterial( Mat ) render.DrawSprite( self:WorldSpaceCenter(), 32 +math.sin( SysTime()*2 )*4, 32 +math.sin( SysTime()*2 )*4, Color( 255, 64, 92, 192 ) )
|
|
render.DrawSprite( self:WorldSpaceCenter(), 8 +math.cos( SysTime()*2 )*2, 64 +math.cos( SysTime()*2 )*4, Color( 255, 64, 92, 192 ) )
|
|
end
|
|
end
|
|
end
|