local pi = 3.14159265358979 local circle_cache = {} local offsetcircle_cache = {} local ClockOn = true local function _GetCircle( cx, cy, radius, seg ) local key = radius .. "/" .. seg local key2 = "(" .. cx .. "," .. cy .. ") " .. key -- did we already calculate the offset of this type of circle? if offsetcircle_cache[key2] ~= nil then return offsetcircle_cache[key2] end -- did we already calculate this type of circle? local c = nil if circle_cache[key] ~= nil then c = circle_cache[key] else c = {} -- calculate this type of circle. local radsperseg = math.rad( 360 / seg ) for i = seg, 1, -1 do local r = radsperseg * i - 1 table.insert( c, { x = math.sin( r ) * radius, y = math.cos( r ) * radius } ) end -- cache it for later circle_cache[key] = c end local co = {} -- offset the circle for i, v in ipairs( c ) do co[i] = {} co[i].x = v.x + cx co[i].y = v.y + cy end -- cache it offsetcircle_cache[key2] = co return co end local function _DrawCircle( cx, cy, r, seg ) local c = _GetCircle( cx, cy, r, seg ) surface.DrawPoly( c ) end local function _DrawCircleOutline( cx, cy, r, seg ) local c = _GetCircle( cx, cy, r, seg ) for i = 1,#c-1 do surface.DrawLine( c[i].x, c[i].y, c[i+1].x, c[i+1].y ) end surface.DrawLine( c[#c].x, c[#c].y, c[1].x, c[1].y ) end local function _DrawRadialPoints( cx, cy, ox, oy, r, num ) local c = _GetCircle( cx, cy, r, num) for i = 1, #c do draw.SimpleText( tostring(i), "ScoreboardText", c[i].x + ox, c[i].y - oy, Color(255,255,255,255), 1, 3 ) end end function ToggleClock() ClockOn = not ClockOn end concommand.Add("ToggleClock", ToggleClock) function tmrClock() if !ClockOn then return end local dblSecond, dblMinute, dblHour local strSec, strMin, strHr dblSecond = ( os.date("%S") * 6 - 90 ) * -1 dblMinute = ( ( os.date("%M") + os.date("%S") / 60)) * 6 - 90 dblHour = ( ( os.date("%H") + os.date("%M") / 60)) * 30 - 90 local lineSecondX1, lineSecondX2, lineMinuteX1, lineMinuteX2, lineHourX1, lineHourX2 local lineSecondY1, lineSecondY2, lineMinuteY1, lineMinuteY2, lineHourY1, lineHourY2 lineSecondX1, lineMinuteX1, lineHourX1 = surface.ScreenWidth() / 8, surface.ScreenWidth() / 8, surface.ScreenWidth() / 8 lineSecondY1, lineMinuteY1, lineHourY1 = surface.ScreenHeight() / 5, surface.ScreenHeight() / 5, surface.ScreenHeight() / 5 lineSecondX2 = 100 * -math.cos(dblSecond * pi / 180) + lineSecondX1 lineSecondY2 = 100 * math.sin(dblSecond * pi / 180) + lineSecondY1 lineMinuteX2 = 90 * math.cos(dblMinute * pi / 180) + lineMinuteX1 lineMinuteY2 = 90 * math.sin(dblMinute * pi / 180) + lineMinuteY1 lineHourX2 = 70 * math.cos(dblHour * pi / 180) + lineHourX1 lineHourY2 = 70 * math.sin(dblHour * pi / 180) + lineHourY1 surface.SetDrawColor( 0, 0, 0, 170 ) _DrawCircle(lineHourX1, lineHourY1, 110, 150) surface.SetDrawColor( 0, 0, 0, 170 ) --_DrawCircleOutline(lineHourX1, lineHourY1, 110, 12) _DrawRadialPoints( lineHourX1, lineHourY1, 0, 10, 110, 12 ) surface.SetDrawColor(0,0,255,255) surface.DrawLine( lineSecondX1, lineSecondY1, lineSecondX2, lineSecondY2 ) surface.SetDrawColor(0,255,0,255) surface.DrawLine( lineMinuteX1, lineMinuteY1, lineMinuteX2, lineMinuteY2 ) surface.SetDrawColor(255,0,0,255) surface.DrawLine( lineHourX1, lineHourY1, lineHourX2, lineHourY2 ) end hook.Add("HUDPaint", "lolClock", tmrClock)