mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 13:23:46 +03:00
162 lines
4.4 KiB
Lua
162 lines
4.4 KiB
Lua
--[[
|
|
| 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/
|
|
--]]
|
|
|
|
|
|
TOOL.Category = "Render"
|
|
TOOL.Name = "#tool.paint.name"
|
|
|
|
TOOL.LeftClickAutomatic = true
|
|
TOOL.RightClickAutomatic = true
|
|
TOOL.RequiresTraceHit = true
|
|
|
|
TOOL.ClientConVar[ "decal" ] = "Blood"
|
|
|
|
TOOL.Information = {
|
|
{ name = "left" },
|
|
{ name = "right" },
|
|
{ name = "reload" }
|
|
}
|
|
|
|
local function PlaceDecal( ply, ent, data )
|
|
|
|
if ( !IsValid( ent ) && !ent:IsWorld() ) then return end
|
|
|
|
local bone = ent:GetPhysicsObjectNum( data.bone or 0 )
|
|
if ( !IsValid( bone ) ) then bone = ent end
|
|
|
|
if ( SERVER ) then
|
|
util.Decal( data.decal, bone:LocalToWorld( data.Pos1 ), bone:LocalToWorld( data.Pos2 ), ply )
|
|
|
|
local i = ent.DecalCount or 0
|
|
i = i + 1
|
|
duplicator.StoreEntityModifier( ent, "decal" .. i, data )
|
|
ent.DecalCount = i
|
|
end
|
|
|
|
end
|
|
|
|
--
|
|
-- Register decal duplicator
|
|
--
|
|
for i = 1, 32 do
|
|
|
|
duplicator.RegisterEntityModifier( "decal" .. i, function( ply, ent, data )
|
|
timer.Simple( i * 0.05, function() PlaceDecal( ply, ent, data ) end )
|
|
end )
|
|
|
|
end
|
|
|
|
function TOOL:Reload( trace )
|
|
if ( !IsValid( trace.Entity ) ) then return false end
|
|
|
|
trace.Entity:RemoveAllDecals()
|
|
|
|
if ( SERVER ) then
|
|
for i = 1, 32 do
|
|
duplicator.ClearEntityModifier( trace.Entity, "decal" .. i )
|
|
end
|
|
trace.Entity.DecalCount = nil
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function TOOL:LeftClick( trace )
|
|
|
|
return self:RightClick( trace, true )
|
|
|
|
end
|
|
|
|
function TOOL:RightClick( trace, bNoDelay )
|
|
|
|
local decal = self:GetClientInfo( "decal" )
|
|
|
|
local Pos1 = trace.HitPos + trace.HitNormal
|
|
local Pos2 = trace.HitPos - trace.HitNormal
|
|
|
|
local Bone = trace.Entity:GetPhysicsObjectNum( trace.PhysicsBone or 0 )
|
|
if ( !IsValid( Bone ) ) then Bone = trace.Entity end
|
|
|
|
Pos1 = Bone:WorldToLocal( Pos1 )
|
|
Pos2 = Bone:WorldToLocal( Pos2 )
|
|
|
|
PlaceDecal( self:GetOwner(), trace.Entity, { Pos1 = Pos1, Pos2 = Pos2, bone = trace.PhysicsBone, decal = decal } )
|
|
|
|
if ( bNoDelay ) then
|
|
self:GetWeapon():SetNextPrimaryFire( CurTime() + 0.05 )
|
|
self:GetWeapon():SetNextSecondaryFire( CurTime() + 0.05 )
|
|
else
|
|
self:GetWeapon():SetNextPrimaryFire( CurTime() + 0.2 )
|
|
self:GetWeapon():SetNextSecondaryFire( CurTime() + 0.2 )
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
game.AddDecal( "Eye", "decals/eye" )
|
|
game.AddDecal( "Dark", "decals/dark" )
|
|
game.AddDecal( "Smile", "decals/smile" )
|
|
game.AddDecal( "Light", "decals/light" )
|
|
game.AddDecal( "Cross", "decals/cross" )
|
|
game.AddDecal( "Nought", "decals/nought" )
|
|
game.AddDecal( "Noughtsncrosses", "decals/noughtsncrosses" )
|
|
|
|
list.Add( "PaintMaterials", "Eye" )
|
|
list.Add( "PaintMaterials", "Smile" )
|
|
list.Add( "PaintMaterials", "Light" )
|
|
list.Add( "PaintMaterials", "Dark" )
|
|
list.Add( "PaintMaterials", "Blood" )
|
|
list.Add( "PaintMaterials", "YellowBlood" )
|
|
list.Add( "PaintMaterials", "Impact.Metal" )
|
|
list.Add( "PaintMaterials", "Scorch" )
|
|
list.Add( "PaintMaterials", "BeerSplash" )
|
|
list.Add( "PaintMaterials", "ExplosiveGunshot" )
|
|
list.Add( "PaintMaterials", "BirdPoop" )
|
|
list.Add( "PaintMaterials", "PaintSplatPink" )
|
|
list.Add( "PaintMaterials", "PaintSplatGreen" )
|
|
list.Add( "PaintMaterials", "PaintSplatBlue" )
|
|
list.Add( "PaintMaterials", "ManhackCut" )
|
|
list.Add( "PaintMaterials", "FadingScorch" )
|
|
list.Add( "PaintMaterials", "Antlion.Splat" )
|
|
list.Add( "PaintMaterials", "Splash.Large" )
|
|
list.Add( "PaintMaterials", "BulletProof" )
|
|
list.Add( "PaintMaterials", "GlassBreak" )
|
|
list.Add( "PaintMaterials", "Impact.Sand" )
|
|
list.Add( "PaintMaterials", "Impact.BloodyFlesh" )
|
|
list.Add( "PaintMaterials", "Impact.Antlion" )
|
|
list.Add( "PaintMaterials", "Impact.Glass" )
|
|
list.Add( "PaintMaterials", "Impact.Wood" )
|
|
list.Add( "PaintMaterials", "Impact.Concrete" )
|
|
list.Add( "PaintMaterials", "Noughtsncrosses" )
|
|
list.Add( "PaintMaterials", "Nought" )
|
|
list.Add( "PaintMaterials", "Cross" )
|
|
|
|
function TOOL.BuildCPanel( CPanel )
|
|
|
|
-- Remove duplicates.
|
|
local Options = {}
|
|
for id, str in pairs( list.Get( "PaintMaterials" ) ) do
|
|
if ( !table.HasValue( Options, str ) ) then
|
|
table.insert( Options, str )
|
|
end
|
|
end
|
|
|
|
table.sort( Options )
|
|
|
|
local listbox = CPanel:AddControl( "ListBox", { Label = "#tool.paint.texture", Height = 17 + table.Count( Options ) * 17 } )
|
|
for k, decal in pairs( Options ) do
|
|
local line = listbox:AddLine( decal )
|
|
line.data = { paint_decal = decal }
|
|
|
|
if ( GetConVarString( "paint_decal" ) == tostring( decal ) ) then line:SetSelected( true ) end
|
|
end
|
|
|
|
end |