mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
232 lines
4.9 KiB
Lua
232 lines
4.9 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( "base_anim" )
|
|
|
|
ENT.Spawnable = false
|
|
ENT.AdminOnly = false
|
|
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
|
|
ENT.Widget = true
|
|
|
|
-- This appears to be unused in the base game, but leaving it in case someones does
|
|
ENT.Materials = {}
|
|
|
|
function ENT:SetupDataTables()
|
|
|
|
self:NetworkVar( "Float", 0, "SizeVar" ) -- Size (bounds)
|
|
self:NetworkVar( "Float", 1, "Priority" ) -- Priority above other widgets (clicks, visually)
|
|
|
|
end
|
|
|
|
--
|
|
-- Unfilled, for override. Self explanatory.
|
|
-- Called on both client and server in multiplayer
|
|
-- Only on the server in singleplayer.
|
|
--
|
|
function ENT:OnClick( ply ) end
|
|
function ENT:OnRightClick( ply ) end
|
|
function ENT:PressedThink( pl, mv ) end
|
|
function ENT:PressedShouldDraw( widget ) return true end
|
|
function ENT:PressStart( pl, mv ) end
|
|
function ENT:PressEnd( pl, mv ) end
|
|
function ENT:DragThink( pl, mv, dist ) end
|
|
|
|
--
|
|
-- Set our dimensions etc
|
|
--
|
|
function ENT:Initialize()
|
|
|
|
self:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
|
self:DrawShadow( false )
|
|
self:EnableCustomCollisions()
|
|
self.Color = Color( 0, 255, 255 )
|
|
self.Color_Hover = color_white
|
|
|
|
if ( SERVER ) then
|
|
self:SetSize( 4 )
|
|
self:SetPriority( 1 )
|
|
end
|
|
|
|
end
|
|
|
|
function ENT:GetSize()
|
|
return self:GetSizeVar()
|
|
end
|
|
|
|
function ENT:SetSize( size )
|
|
|
|
if ( self:GetSize() == size ) then return end
|
|
|
|
self:SetSizeVar( size )
|
|
self:SetSolid( SOLID_BBOX )
|
|
self:SetCollisionBounds( Vector( size, size, size ) * -0.5, Vector( size, size, size ) * 0.5 )
|
|
|
|
end
|
|
|
|
function ENT:GetGrabPos( Pos, Forward )
|
|
|
|
local fwd = Forward
|
|
local eye = Pos
|
|
|
|
local planepos = self:GetPos()
|
|
local planenrm = ( eye - planepos ):GetNormal()
|
|
|
|
return util.IntersectRayWithPlane( eye, fwd, planepos, planenrm )
|
|
|
|
end
|
|
|
|
function ENT:PressedThinkInternal( ply, mv )
|
|
|
|
--
|
|
-- TODO: We should find out why this happens instead of just preventing it!
|
|
--
|
|
if ( !istable( ply.WidgetMove ) ) then
|
|
ply.WidgetMove = {}
|
|
ply.WidgetMove.EyePos = ply:EyePos()
|
|
ply.WidgetMove.EyeVec = ply:GetAimVector()
|
|
end
|
|
|
|
local OldPos = self:GetGrabPos( ply.WidgetMove.EyePos, ply.WidgetMove.EyeVec )
|
|
local NewPos = self:GetGrabPos( ply:EyePos(), ply:GetAimVector() )
|
|
|
|
if ( NewPos && OldPos ) then
|
|
|
|
local dist = self:WorldToLocal( OldPos ) - self:WorldToLocal( NewPos )
|
|
|
|
if ( dist:Length() > 0.01 && dist:Length() < 512 ) then
|
|
self:DragThink( ply, mv, dist )
|
|
end
|
|
|
|
end
|
|
|
|
self:PressedThink( ply, mv )
|
|
|
|
-- Store the (new) old eye positions
|
|
ply.WidgetMove.EyePos = ply:EyePos()
|
|
ply.WidgetMove.EyeVec = ply:GetAimVector()
|
|
|
|
end
|
|
|
|
--
|
|
-- Called by widget's Tick hook when a mouse button was
|
|
-- pressed while hovering over this widget
|
|
--
|
|
function ENT:OnPress( ply, iButton, mv )
|
|
|
|
if ( self.Pressed ) then return end
|
|
|
|
ply:SetPressedWidget( self )
|
|
|
|
ply.WidgetMove = {}
|
|
ply.WidgetMove.EyePos = ply:EyePos()
|
|
ply.WidgetMove.EyeVec = ply:GetAimVector()
|
|
|
|
self:PressStart( ply, mv )
|
|
|
|
end
|
|
|
|
--
|
|
-- Called by widget's Tick hook when a mouse button was
|
|
-- released while this widget is pressed
|
|
--
|
|
function ENT:OnRelease( ply, iButton, mv )
|
|
|
|
ply:SetPressedWidget( NULL )
|
|
ply.WidgetMove = nil
|
|
self:PressEnd( ply, mv )
|
|
|
|
--
|
|
-- The player has to click and release on the widget
|
|
-- or we assume they clicked and changed their mind
|
|
-- so dragged off.. like people do sometimes.
|
|
--
|
|
if ( ply:GetHoveredWidget() != self ) then return end
|
|
|
|
--
|
|
-- Left Mouse
|
|
--
|
|
if ( iButton == 1 ) then
|
|
self:OnClick( ply )
|
|
end
|
|
|
|
--
|
|
-- Right Mouse
|
|
--
|
|
if ( iButton == 1 ) then
|
|
self:OnRightClick( ply )
|
|
end
|
|
|
|
end
|
|
|
|
function ENT:IsHovered()
|
|
return LocalPlayer():GetHoveredWidget() == self
|
|
end
|
|
|
|
function ENT:SomethingHovered()
|
|
return IsValid( LocalPlayer():GetHoveredWidget() )
|
|
end
|
|
|
|
function ENT:IsPressed()
|
|
return LocalPlayer():GetPressedWidget() == self
|
|
end
|
|
|
|
function ENT:Draw()
|
|
|
|
widgets.RenderMe( self )
|
|
|
|
end
|
|
|
|
function ENT:OverlayRender()
|
|
|
|
local col = Color( 0, 0, 50, 255 )
|
|
|
|
if ( self:IsHovered() ) then
|
|
col = Color( 20, 50, 100, 255 )
|
|
elseif ( self:SomethingHovered() ) then
|
|
-- less alpha
|
|
end
|
|
|
|
if ( self:IsPressed() ) then
|
|
|
|
col = Color( 180, 180, 50, 255 )
|
|
|
|
if ( LocalPlayer():GetHoveredWidget() == LocalPlayer():GetPressedWidget() ) then
|
|
col = Color( 255, 255, 100, 255 )
|
|
end
|
|
|
|
end
|
|
|
|
local vSize = Vector( self:GetSize(), self:GetSize(), self:GetSize() )
|
|
|
|
render.SetColorMaterialIgnoreZ()
|
|
render.DrawBox( self:GetPos(), self:GetAngles(), -vSize, vSize, ColorAlpha( col, 0.8 ) )
|
|
|
|
render.SetColorMaterial()
|
|
render.DrawBox( self:GetPos(), self:GetAngles(), -vSize, vSize, col )
|
|
|
|
end
|
|
|
|
function ENT:TestCollision( startpos, delta, isbox, extents )
|
|
|
|
if ( isbox ) then return end
|
|
if ( !widgets.Tracing ) then return end
|
|
|
|
-- TODO. Actually trace against our cube!
|
|
|
|
return {
|
|
HitPos = self:GetPos(),
|
|
Fraction = 0.5 * self:GetPriority()
|
|
}
|
|
|
|
end
|