|
|
|
AddCSLuaFile()
|
|
|
|
-- maybe doing it later
|
|
|
|
DEFINE_BASECLASS( "base_anim" )
|
|
|
|
ENT.Base = "base_anim"
|
|
|
|
ENT.Type = "anim"
|
|
|
|
|
|
|
|
ENT.PrintName = "Thrown Food"
|
|
|
|
ENT.Author = "catSIXe"
|
|
|
|
ENT.FoodType = "generic"
|
|
|
|
ENT.FoodSplashColor = Color(255, 255, 255)
|
|
|
|
|
|
|
|
if SERVER then
|
|
|
|
util.AddNetworkString( "Food_Explosion" )
|
|
|
|
util.AddNetworkString( "Food_DecalEx" )
|
|
|
|
end
|
|
|
|
if CLIENT then
|
|
|
|
local emitter = ParticleEmitter(Vector(0,0,0))
|
|
|
|
function food_splash_init(particle, vel, color)
|
|
|
|
particle:SetColor(color.r,color.g,color.b)
|
|
|
|
particle:SetVelocity( vel or VectorRand():GetNormalized() * 15)
|
|
|
|
particle:SetGravity( Vector(0,0,-500) )
|
|
|
|
particle:SetLifeTime(0)
|
|
|
|
particle:SetDieTime(math.Rand(5,10))
|
|
|
|
particle:SetStartSize(4)
|
|
|
|
particle:SetEndSize(0)
|
|
|
|
particle:SetStartAlpha(255)
|
|
|
|
particle:SetEndAlpha(0)
|
|
|
|
particle:SetCollide(true)
|
|
|
|
particle:SetBounce(0.3)
|
|
|
|
particle:SetRoll(math.pi*math.Rand(0,1))
|
|
|
|
particle:SetRollDelta(math.pi*math.Rand(-10,10))
|
|
|
|
end
|
|
|
|
net.Receive("Food_Explosion",function ()
|
|
|
|
if !emitter then emitter = ParticleEmitter(Vector(0,0,0)) end
|
|
|
|
--if !self or !emitter then return MsgN("No Emitter or self exist") end
|
|
|
|
local pos = net.ReadVector()
|
|
|
|
local norm = net.ReadVector()
|
|
|
|
local bucketvel = net.ReadVector()
|
|
|
|
local entid = net.ReadFloat()
|
|
|
|
local color = Color(net.ReadInt(8), net.ReadInt(8), net.ReadInt(8))
|
|
|
|
MsgN(color)
|
|
|
|
timer.Destroy("particle_timer"..entid)
|
|
|
|
|
|
|
|
for i = 1,20 do
|
|
|
|
local particle = emitter:Add( "decals/decal_paintsplatter002", pos )
|
|
|
|
if particle then
|
|
|
|
local dir = VectorRand():GetNormalized()
|
|
|
|
food_splash_init(particle, ((-norm)+dir):GetNormalized() * math.Rand(0,200) + bucketvel*0.5, color)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
net.Receive("Food_DecalEx",function ()
|
|
|
|
local material = net.ReadString()
|
|
|
|
local ent = net.ReadEntity()
|
|
|
|
local position = net.ReadVector()
|
|
|
|
local normal = net.ReadVector()
|
|
|
|
local color = Color(net.ReadInt(8), net.ReadInt(8), net.ReadInt(8))
|
|
|
|
local s = net.ReadInt(10)
|
|
|
|
--local entid = net.ReadFloat()
|
|
|
|
util.DecalEx(Material(material), ent, position, normal, color, s, s)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
function ENT:SetupFoodType(foodType)
|
|
|
|
self:SetNWString("foodType", foodType)
|
|
|
|
self.FoodType = foodType
|
|
|
|
end
|
|
|
|
function ENT:SetupColor(color)
|
|
|
|
self:SetNWInt("color_R", color.r)
|
|
|
|
self:SetNWInt("color_G", color.g)
|
|
|
|
self:SetNWInt("color_B", color.b)
|
|
|
|
self.FoodSplashColor = color
|
|
|
|
end
|
|
|
|
function ENT:Initialize()
|
|
|
|
self:SetModel( "models/props_phx/misc/potato.mdl" )
|
|
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
|
|
self:SetMoveType( MOVETYPE_VPHYSICS )
|
|
|
|
self:SetSolid( SOLID_VPHYSICS )
|
|
|
|
--self:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
|
|
|
if CLIENT then
|
|
|
|
if !emitter then emitter = ParticleEmitter(Vector(0,0,0)) end
|
|
|
|
emitter:SetPos(LocalPlayer():GetPos())
|
|
|
|
|
|
|
|
if IsValid(self) then
|
|
|
|
local kt = "particle_timer"..self:EntIndex()
|
|
|
|
timer.Create(kt, 0.01, 0, function()
|
|
|
|
if !emitter then
|
|
|
|
emitter = ParticleEmitter(LocalPlayer():GetPos())
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if !IsValid(self) then
|
|
|
|
timer.Destroy(kt)
|
|
|
|
return
|
|
|
|
end
|
|
|
|
color = Color(self:GetNWInt("color_R"), self:GetNWInt("color_G"), self:GetNWInt("color_B"))
|
|
|
|
if math.Rand(0,1) < 0.33 then
|
|
|
|
local particle = emitter:Add( "decals/decal_paintsplatter002", self:GetPos() + VectorRand():GetNormalized() * 4)
|
|
|
|
if particle then
|
|
|
|
food_splash_init(particle, Vector(0), color)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function ENT:PhysicsCollide(colData, collider)
|
|
|
|
if CLIENT then return end
|
|
|
|
--[[net.WriteVector()
|
|
|
|
net.WriteVector(colData.HitNormal)
|
|
|
|
net.WriteVector(colData.OurOldVelocity)
|
|
|
|
net.WriteFloat(entid)--]]
|
|
|
|
PrintTable(colData)
|
|
|
|
|
|
|
|
if IsValid(colData.HitEntity) then
|
|
|
|
if colData.HitEntity:IsPlayer() then
|
|
|
|
MsgN("Collision with Player")
|
|
|
|
colData.HitEntity:ViewPunch( Angle( math.Rand(-8,8), math.Rand(-8,8), 0 ) )
|
|
|
|
self:EmitSound("physics/body/body_medium_impact_hard"..math.floor(math.Rand(1,6))..".wav")
|
|
|
|
else
|
|
|
|
self:EmitSound("physics/cardboard/cardboard_box_impact_soft"..math.floor(math.Rand(1,7))..".wav")
|
|
|
|
end
|
|
|
|
--[[if not self.Paneled and colData.HitEntity:GetClass() == "mediaplayer_tv" then
|
|
|
|
self.Paneled = true
|
|
|
|
local overlayPanel = ents.Create("prop_physics")
|
|
|
|
overlayPanel:SetPos(colData.HitPos)
|
|
|
|
local a = colData.HitNormal:Angle()
|
|
|
|
a:RotateAroundAxis(a:Forward(), 90)
|
|
|
|
a:RotateAroundAxis(a:Right(), 90)
|
|
|
|
overlayPanel:SetAngles(a)
|
|
|
|
overlayPanel:SetModel("models/props_phx/construct/glass/glass_plate1x1.mdl")
|
|
|
|
overlayPanel:Spawn()
|
|
|
|
--overlayPanel:SetMoveType(MOVETYPE_NONE)
|
|
|
|
overlayPanel:SetColor(Color(255,255,255,1))
|
|
|
|
overlayPanel:Activate()
|
|
|
|
local phys = overlayPanel:GetPhysicsObject( )
|
|
|
|
if IsValid( phys ) then
|
|
|
|
phys:Wake()
|
|
|
|
phys:EnableMotion(false)
|
|
|
|
end
|
|
|
|
local p1 = colData.HitPos - (colData.HitNormal * 20)
|
|
|
|
local p2 = colData.HitPos + (colData.HitNormal * 20)
|
|
|
|
self:Splash(p1, p2)
|
|
|
|
SafeRemoveEntityDelayed(overlayPanel, 15)
|
|
|
|
SafeRemoveEntity( self )
|
|
|
|
-- return true --exit prematurely
|
|
|
|
--self.Hitted = false
|
|
|
|
end--]]
|
|
|
|
end
|
|
|
|
local p1 = colData.HitPos--colData.HitPos - (colData.HitNormal * 10)
|
|
|
|
local p2 = colData.HitNormal --HitPos + (colData.HitNormal * 10)
|
|
|
|
local entid = self:EntIndex()
|
|
|
|
net.Start("Food_Explosion")
|
|
|
|
net.WriteVector(self:GetPos())
|
|
|
|
net.WriteVector(colData.HitNormal)
|
|
|
|
net.WriteVector(colData.OurOldVelocity)
|
|
|
|
net.WriteFloat(entid)
|
|
|
|
net.WriteInt(self.FoodSplashColor.r or 255,8)
|
|
|
|
net.WriteInt(self.FoodSplashColor.g or 255,8)
|
|
|
|
net.WriteInt(self.FoodSplashColor.b or 255,8)
|
|
|
|
net.Broadcast()
|
|
|
|
if self.FoodType == "generic" then
|
|
|
|
util.Decal("YellowBlood", p1, p2)
|
|
|
|
elseif self.FoodType == "icecream" then
|
|
|
|
self:EmitSound("physics/flesh/flesh_impact_hard"..math.floor(math.Rand(1,6))..".wav")
|
|
|
|
net.Start("Food_DecalEx")
|
|
|
|
net.WriteString("decals/decal_paintsplatterblue001")
|
|
|
|
net.WriteEntity(colData.HitEntity)
|
|
|
|
net.WriteVector(colData.HitPos)
|
|
|
|
net.WriteVector(colData.HitNormal)
|
|
|
|
net.WriteInt(self.FoodSplashColor.r or 255,8)
|
|
|
|
net.WriteInt(self.FoodSplashColor.g or 255,8)
|
|
|
|
net.WriteInt(self.FoodSplashColor.b or 255,8)
|
|
|
|
net.WriteInt(1,10)
|
|
|
|
net.Broadcast()
|
|
|
|
elseif self.FoodType == "beer" then
|
|
|
|
util.Decal("BeerSplash", p1, p2)
|
|
|
|
--else if self.FoodType == "generic" then
|
|
|
|
end
|
|
|
|
timer.Create("kill_kt"..entid,0.25,2,function ()
|
|
|
|
for _,v in pairs(player.GetAll()) do
|
|
|
|
v:SendLua("timer.Destroy('particle_timer"..entid.."')")
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
SafeRemoveEntity( self )
|
|
|
|
end
|
|
|
|
function ENT:Splash(p1, p2)
|
|
|
|
end
|