Files
wnsrc/lua/imagetool/cl_image.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

293 lines
9.0 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
| 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/
--]]
--[[
© AsterionStaff 2022.
This script was created from the developers of the AsterionTeam.
You can get more information from one of the links below:
Site - https://asterion.games
Discord - https://discord.gg/CtfS8r5W3M
developer(s):
Selenter - https://steamcommunity.com/id/selenter
——— Chop your own wood and it will warm you twice.
]]--
-- Создаем файл с конфигом, если его нету
if !file.Exists(ImageTool.path .. "/" .. ImageTool.history, "DATA") then
file.Write(ImageTool.path .. "/" .. ImageTool.history, "[]")
end
-- Получаем историю
function ImageTool:GetHistory()
local data = {}
if file.Exists(ImageTool.path .. "/" .. ImageTool.history, "DATA") then
local info = file.Read(ImageTool.path .. "/" .. ImageTool.history)
data = util.JSONToTable(info)
end
return data
end
-- Сохраняем историю
function ImageTool:SaveHistory(data)
data = util.TableToJSON(data)
file.Write(ImageTool.path .. "/" .. ImageTool.history, data)
end
-- Если картинка находится в кеше, то возвращаем его
function ImageTool:FindInCache(data)
if self.cacheMaterials[data] then
return self.cacheMaterials[data]
end
end
-- Получаем картинку по uniqueID
function ImageTool:GetImage(data)
local path = Format("%s/%s", self.path, game.GetMap())
local filename = data .. ".png"
local cache = self:FindInCache(data)
if cache then
return cache
end
return Material("data/" .. path .. "/" .. filename)
end
-- Скачиваем картинку
function ImageTool:DownloadImage(path, data)
if !self.requestList[data] or CurTime() >= self.requestList[data] then
if self:IsUsesTool(LocalPlayer()) then
LocalPlayer():ChatPrint(self.prefix .. " Download the picture: " .. data)
end
-- Запрос на сайт
http.Fetch(data, function(body, size, headers)
local extension = self:CheckExtensionImage(body, headers)
if !extension then return end
file.Write(path, body)
end)
self.requestList[data] = CurTime() + 10
end
end
-- Грузим картинку из URL
function ImageTool:LoadingURL(data)
local uniqueID = util.CRC(data) -- Уникальный ID картинки
-- Если картинка уже закешированна, то возвращаем ее
if self:FindInCache(uniqueID) then
return self:FindInCache(uniqueID)
end
local path = Format("%s/%s", self.path, game.GetMap())
local filename = uniqueID .. ".png"
-- Пытаемся найти картинку в дате
if file.Exists(path .. "/" .. filename, "DATA") then
local mat = self:GetImage(uniqueID)
if mat and !mat:IsError() then
if self:IsUsesTool(LocalPlayer()) then
LocalPlayer():ChatPrint(self.prefix .. " Image has been uploaded successfully: " .. data)
end
self.cacheMaterials[uniqueID] = mat -- Сохраняем картинку в Кеше
return mat
end
if !self.notifyErr[data] or CurTime() >= self.notifyErr[data] then
if self:IsUsesTool(LocalPlayer()) then
LocalPlayer():ChatPrint(self.prefix .. " It is not possible to upload a picture: " .. data .. ". Repeated request in 5 seconds!")
end
self.notifyErr[data] = CurTime() + 5
-- Прерываем функцию и качаем картинку
return self:DownloadImage(path .. "/" .. filename, data)
end
end
-- Если не нашли картинку, то качаем ее
self:DownloadImage(path .. "/" .. filename, data)
end
-- Рисуем выбранную картинку в TOOL-е
function ImageTool:DrawImageTool()
local client = LocalPlayer()
-- Если у нас в руках не ТулГан, то прерываем функцию
local data = self:GetToolData(client)
if !data then return end
self:Start3D2D(data)
end
local function clear()
if IsValid(ImageTool.historyPanel.List) then
ImageTool.historyPanel.List:Remove()
end
local historylist = ImageTool.historyPanel:GetChildren()[1]
for k, v in ipairs(historylist:GetChildren()) do
if v.image then
v:Remove()
end
end
end
local scale = 0.2
local function set_size(panel1, panel2, mat)
if panel1.setsize then return end
local w, h = mat:Width() * scale, mat:Height() * scale
panel1:SetSize(w, h)
panel2:SetSize(w, h)
panel1.setsize = true
end
local function drawing(url, w, h, panel1, panel2)
local imageMaterial = ImageTool:LoadingURL(url)
if type(imageMaterial) == "IMaterial" and !imageMaterial:IsError() then
set_size(panel1, panel2, imageMaterial)
surface.SetDrawColor(255, 255, 255)
surface.SetMaterial(imageMaterial)
surface.DrawTexturedRect(5, 5, w - 10, h - 10)
else
local alpha, dotStr = ImageTool:Anim()
surface.SetDrawColor(255, alpha, 255)
surface.DrawRect(0, 0, w, h)
draw.DrawText("Loading" .. dotStr, "Default", w / 2, h / 2 - 10, Color(alpha, 0, 0), TEXT_ALIGN_CENTER)
end
end
local function derma_menu(image, id, url)
local menu = DermaMenu()
menu:AddOption("Replace URL", function()
local l = "imagetool_"
RunConsoleCommand(l .. "url", url)
end):SetIcon("icon16/disconnect.png")
menu:AddOption("Copy URL", function()
SetClipboardText(url)
end):SetIcon("icon16/disk.png")
menu:AddOption("Remove", function()
local history = ImageTool:GetHistory() or {}
table.remove(history, id)
ImageTool:SaveHistory(history)
if IsValid(image) then
image:Remove()
end
end):SetIcon("icon16/delete.png")
menu:Open()
end
-- Грузим историю
function ImageTool:LoadingHistory()
local panel = ImageTool.historyPanel
if !IsValid(panel) then return end
clear()
local history = ImageTool:GetHistory() or {}
for id, url in SortedPairs(history, true) do
local image = panel:Add("Panel")
image.image = true
image:SetTall(100)
image:Dock(TOP)
image:DockMargin(2, 2, 2, 2)
local button = image:Add("DButton")
button:SetText("")
button:SetSize(100, 100)
button:Dock(LEFT)
button.alpha = 0
button.Paint = function(this, w, h)
this.alpha = Lerp(FrameTime() * 10, this.alpha, this:IsHovered() and 200 or 0)
surface.SetDrawColor(255, 61, 96, this.alpha)
surface.DrawRect(0, 0, w, h)
drawing(url, w, h, image, this)
surface.SetDrawColor(255, 61, 96, 150)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
button.DoClick = function()
derma_menu(image, id, url)
end
end
panel.List = ListImage
panel:Rebuild()
end
-- Чото типо анимации)
function ImageTool:Anim()
local systime = SysTime()
local alpha = math.sin(systime * 2) * 255
local dotA = math.sin(systime * 1) * 255
local dot = math.floor(math.abs(dotA) * 0.015)
local dotStr = string.rep(".", dot + 1)
return alpha, dotStr
end
-- Запускаем cam3d2d для отрисовки картинки
function ImageTool:Start3D2D(data)
if !data then return end
local alpha = tonumber(data.alpha) or 255
local scale = (tonumber(data.scale) or 40) / 100
local brightness = tonumber(data.brightness) or 255
local imageMaterial = self:LoadingURL(data.url)
local w, h = tonumber(data.width), tonumber(data.height)
if !isnumber(w) or !isnumber(h) then return end -- number expected, got string
-- Рисуем
cam.Start3D2D(data.position, data.angles, scale)
render.PushFilterMin(TEXFILTER.ANISOTROPIC)
render.PushFilterMag(TEXFILTER.ANISOTROPIC)
if type(imageMaterial) == "IMaterial" and !imageMaterial:IsError() then -- Проверяем загрузилась ли картинка
surface.SetDrawColor(brightness, brightness, brightness, alpha)
surface.SetMaterial(imageMaterial)
surface.DrawTexturedRect(0, 0, w, h)
else
local alphaStr, dotStr = ImageTool:Anim()
surface.SetDrawColor(255, alphaStr, 255)
surface.DrawRect(0, 0, w, h)
draw.DrawText("Loading" .. dotStr, "Default", w / 2, h / 2 - 10, Color(alphaStr, 0, 0), TEXT_ALIGN_CENTER)
end
render.PopFilterMag()
render.PopFilterMin()
cam.End3D2D()
end