mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
126 lines
2.7 KiB
Lua
126 lines
2.7 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/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
AddCSLuaFile()
|
||
|
|
|
||
|
|
DEFINE_BASECLASS( "widget_base" )
|
||
|
|
|
||
|
|
local matArrow = Material( "widgets/arrow.png", "nocull alphatest smooth mips" )
|
||
|
|
local matScale = Material( "widgets/scale.png", "nocull alphatest smooth mips" )
|
||
|
|
|
||
|
|
function ENT:SetupDataTables()
|
||
|
|
|
||
|
|
BaseClass.SetupDataTables( self )
|
||
|
|
|
||
|
|
self:NetworkVar( "Bool", 2, "IsScaleArrow" )
|
||
|
|
|
||
|
|
if ( SERVER ) then
|
||
|
|
self:SetIsScaleArrow( false )
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
--
|
||
|
|
-- Set our dimensions etc
|
||
|
|
--
|
||
|
|
function ENT:Initialize()
|
||
|
|
|
||
|
|
BaseClass.Initialize( self )
|
||
|
|
|
||
|
|
if ( SERVER ) then
|
||
|
|
self:SetSize( 16 )
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:PressedShouldDraw( widget ) return widget == self end
|
||
|
|
|
||
|
|
function ENT:OverlayRender()
|
||
|
|
|
||
|
|
local fwd = self:GetAngles():Forward()
|
||
|
|
local size = self:GetSize() * 0.5
|
||
|
|
|
||
|
|
local c = self:GetColor()
|
||
|
|
|
||
|
|
if ( !self:IsHovered() && !self:IsPressed() ) then
|
||
|
|
c.r = c.r * 0.5
|
||
|
|
c.g = c.g * 0.5
|
||
|
|
c.b = c.b * 0.5
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( self:GetIsScaleArrow() ) then
|
||
|
|
render.SetMaterial( matScale )
|
||
|
|
else
|
||
|
|
render.SetMaterial( matArrow )
|
||
|
|
end
|
||
|
|
|
||
|
|
render.DepthRange( 0, 0.01 )
|
||
|
|
render.DrawBeam( self:GetPos(), self:GetPos() + fwd * size, 2, 1, 0, Color( c.r, c.g, c.b, c.a * 0.1 ) )
|
||
|
|
render.DepthRange( 0, 1 * self:GetPriority() )
|
||
|
|
render.DrawBeam( self:GetPos(), self:GetPos() + fwd * size, 2, 1, 0, Color( c.r, c.g, c.b, c.a ) )
|
||
|
|
render.DepthRange( 0, 1 )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:TestCollision( startpos, delta, isbox, extents )
|
||
|
|
|
||
|
|
if ( isbox ) then return end
|
||
|
|
if ( !widgets.Tracing ) then return end
|
||
|
|
|
||
|
|
local size = self:GetSize() * 0.5
|
||
|
|
|
||
|
|
local mins = Vector( 0, -1, -1 )
|
||
|
|
local maxs = Vector( size, 1, 1 )
|
||
|
|
|
||
|
|
local hit, norm, fraction = util.IntersectRayWithOBB( startpos, delta, self:GetPos(), self:GetAngles(), mins, maxs )
|
||
|
|
if ( !hit ) then return end
|
||
|
|
|
||
|
|
--debugoverlay.BoxAngles( self:GetPos(), mins, maxs, self:GetAngles(), 0.1, Color( 0, 0, 255, 64 ) )
|
||
|
|
|
||
|
|
return {
|
||
|
|
HitPos = hit,
|
||
|
|
Fraction = fraction * self:GetPriority()
|
||
|
|
}
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:DragThink( pl, mv, dist )
|
||
|
|
|
||
|
|
local d = dist.x * -1
|
||
|
|
|
||
|
|
self:ArrowDragged( pl, mv, d )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:ArrowDragged( pl, mv, dist )
|
||
|
|
|
||
|
|
-- MsgN( dist )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function ENT:GetGrabPos( Pos, Forward )
|
||
|
|
|
||
|
|
local fwd = Forward
|
||
|
|
local eye = Pos
|
||
|
|
local arrowdir = self:GetAngles():Forward()
|
||
|
|
|
||
|
|
local planepos = self:GetPos()
|
||
|
|
local planenrm = ( eye - planepos ):GetNormal()
|
||
|
|
|
||
|
|
local hitpos = util.IntersectRayWithPlane( eye, fwd, planepos, planenrm )
|
||
|
|
if ( !hitpos ) then return end
|
||
|
|
|
||
|
|
-- Get nearest point along the arrow where we touched it
|
||
|
|
local fdist, vpos, falong = util.DistanceToLine( planepos - arrowdir * 1024, planepos + arrowdir * 1024, hitpos )
|
||
|
|
|
||
|
|
return vpos
|
||
|
|
|
||
|
|
end
|