wiremod-svn-archive/wire/lua/entities/gmod_wire_panel/cl_init.lua
2008-06-14 00:55:20 +00:00

237 lines
6.2 KiB
Lua

include('shared.lua')
CreateClientConVar( "wire_panel_chan", 1, true, true ) --client variable to server goodness
ENT.Spawnable = false
ENT.AdminSpawnable = false
ENT.RenderGroup = RENDERGROUP_BOTH
function ENT:Initialize()
self.menu = nil
self.click = 0
self.chan = 1
self.disp1 = 0
//Edit the menu here. Maximum of 10 lines.
self.menus = {"","", //Do not use these. The menus start at 3.
"Ch. 1|Channel 1",
"Ch. 2|Channel 2",
"Ch. 3|Channel 3",
"Ch. 4|Channel 4",
"Ch. 5|Channel 5",
"Ch. 6|Channel 6",
"Ch. 7|Channel 7",
"Ch. 8|Channel 8"
}
surface.CreateFont( "coolvetica", 80, 400, false, false, "panel_font" )
end
function ENT:Draw()
self.Entity:DrawModel()
local OF = 0
local OU = 0
local OR = 0
local Res = 0.1
local RatioX = 1
if self.Entity:GetModel() == "models/props_lab/monitor01b.mdl" then
OF = 6.53
OU = 0
OR = 0
Res = 0.05
elseif self.Entity:GetModel() == "models/kobilica/wiremonitorsmall.mdl" then
OF = 0.2
OU = 4.5
OR = -0.85
Res = 0.045
elseif self.Entity:GetModel() == "models/kobilica/wiremonitorbig.mdl" then
OF = 0.3
OU = 11.8
OR = -2.35
Res = 0.12
elseif self.Entity:GetModel() == "models/props/cs_office/computer_monitor.mdl" then
OF = 3.25
OU = 15.85
OR = -2.2
Res = 0.085
RatioX = 0.75
elseif self.Entity:GetModel() == "models/props/cs_office/TV_plasma.mdl" then
OF = 6.1
OU = 17.05
OR = -5.99
Res = 0.175
RatioX = 0.57
end
local ang = self.Entity:GetAngles()
local rot = Vector(-90,90,0)
ang:RotateAroundAxis(ang:Right(), rot.x)
ang:RotateAroundAxis(ang:Up(), rot.y)
ang:RotateAroundAxis(ang:Forward(), rot.z)
local pos = self.Entity:GetPos() + (self.Entity:GetForward() * OF) + (self.Entity:GetUp() * OU) + (self.Entity:GetRight() * OR)
cam.Start3D2D(pos,ang,Res)
local clicker = LocalPlayer():GetNetworkedInt(self.Entity:EntIndex().."click")
local click = false
if clicker >= 8 and self.click ~= 0 then
self.click = 0
click = true
elseif clicker < 8 then
if clicker > self.click then
self.click = clicker
click = true
end
end
local x = -112
local y = -104
local w = 296
local h = 292
local x1 = -5.535
local x2 = 3.5
local y1 = 5.091
local y2 = -4.1
local ox = 5
local oy = 5
local pos
local cx
local cy
local onscreen = false
local trace = {}
trace.start = LocalPlayer():GetShootPos()
trace.endpos = LocalPlayer():GetAimVector() * 64 + trace.start
trace.filter = LocalPlayer()
local trace = util.TraceLine(trace)
local control = LocalPlayer():GetNetworkedBool(self.Entity:EntIndex().."control")
if control then
surface.SetDrawColor(0,0,0,255)
surface.DrawRect(x/RatioX,y,(x+w)/RatioX,y+h)
pos = self.Entity:WorldToLocal(trace.HitPos)
-- pos = self.Entity:GetPos() + (self.Entity:GetForward() * OF) + (self.Entity:GetUp() * OU) + (self.Entity:GetRight() * OR)
local posfix_x
local posfix_y
if (OR == 0) then
posfix_x = 1
else
posfix_x = math.abs(OR)
end
if (OU == 0) then
posfix_y = 1
else
posfix_y = math.abs(OU)
end
-- cx = (pos.y - x1) / (math.abs(x1) + math.abs(x2))
cx = (((pos.y + OR)/math.abs(posfix_x)) - x1) / (math.abs(x1) + math.abs(x2))
-- cy = 1 - ((pos.z + y1) / (math.abs(y1) + math.abs(y2)))
-- cy = 1 - (((pos.z + (OU / 2)) + (y1 - OU)) / (math.abs(y1 - OU) + math.abs(y2 - OU)))
cy = 1 - (((pos.z - OU) + y1)) / (math.abs(y1) + math.abs(y2))
if trace.Entity == self.Entity and cx >= 0 and cy >= 0 and cx <= 1 and cy <= 1 then
onscreen = true
end
else
self.menu = nil
surface.SetDrawColor(0,0,0,255)
surface.DrawRect(x/RatioX,y,(x+w)/RatioX,y+h)
surface.SetDrawColor(255,255,255,255)
surface.SetTexture(surface.GetTextureID("gui/info"))
surface.DrawTexturedRect((x+(w*.4*.621))/RatioX,y + h*.4*.621,w*.2*.621,w*.2*.621)
end
if control then
surface.SetDrawColor(100,100,100,255)
surface.DrawRect((x+(w*0*.621))/RatioX,y+(h*0*.621),w*.3*.621,h*1*.621)
if self.menu then
if ((self.menu-2) == self.chan) then
surface.SetDrawColor(0,100,0,255)
else
surface.SetDrawColor(100,0,0,255)
end
surface.DrawRect((x+(w*.3*.621))/RatioX,y+(h*.5*.621),w*.7*.621,h*.5*.621)
draw.DrawText("SET","panel_font",(x+(w*.32*.621))/RatioX,(y+(h*.55*.621)),Color(255,255,255,255),0)
end
end
if control and onscreen then
if (math.abs(pos.x - OF) < 1.0) then
if cx <= .3 then
for i = 3,10 do
if cy >= .1*i-.1 and cy < .1*i then
surface.SetDrawColor(30,144,255,100)
surface.DrawRect((x+(w*0*.621))/RatioX,y+(h*(.1*i-.1)*.621),w*.3*.621,h*.1*.621)
if click then
self.menu = i
end
end
end
else
if cy >= 0.5 then
if self.menu then
if ((self.menu-2) == self.chan) then
surface.SetDrawColor(0,150,0,255)
else
surface.SetDrawColor(150,0,0,255)
end
surface.DrawRect((x+(w*.3*.621))/RatioX,y+(h*.5*.621),w*.7*.621,h*.5*.621)
draw.DrawText("SET","panel_font",(x+(w*.32*.621))/RatioX,(y+(h*.55*.621)),Color(255,255,255,255),0)
if click then
self.chan = self.menu-2
LocalPlayer():ConCommand("wire_panel_chan "..self.chan.."\n")
end
end
end
end
end
end
if control then
local out = "Channel\nIndex\n"
for i = 3, 10 do
local disp = self.menus[i]
local loc = string.find(disp,"|")
if loc then
out = out..string.sub(disp,1,loc-1).."\n"
else
out = out.."\n"
end
end
draw.DrawText(out,"Trebuchet18",(x+2)/RatioX,y,Color(255,255,255,255))
if self.menu then
local ChannelValue = self:GetChannelValue( self.menu-2 )
local disp = self.menus[self.menu].."\n\n"..string.format("%.2f", ChannelValue)
local loc = string.find(disp,"|")
if loc then
local disp = string.sub(disp,loc+1)
draw.DrawText(disp,"Trebuchet18",(x+2+(w*.3*.621))/RatioX,y,Color(255,255,255,255))
end
end
end
if control and onscreen then
if (math.abs(pos.x - OF) < 1.0) then
surface.SetDrawColor(255,255,255,255)
surface.SetTexture(surface.GetTextureID("gui/arrow"))
surface.DrawTexturedRectRotated((x+(w*cx*.621)+ox)/RatioX,y+(h*cy*.621)+oy,16,16,45)
end
else
end
cam.End3D2D()
Wire_Render(self.Entity)
end
function ENT:IsTranslucent()
return true
end