Files
VnUtest/garrysmod/addons/fixguns/lua/autorun/client/cl_dwep.lua
2026-03-31 10:27:04 +03:00

503 lines
16 KiB
Lua

--leak by matveicher
--vk group - https://vk.com/gmodffdev
--steam - https://steamcommunity.com/profiles/76561198968457747/
--ds server - https://discord.gg/V329W7Ce8g
--ds - matveicher
include("autorun/sh_dwep_config.lua")
local scrw = ScrW()
local scrh = ScrH()
local colors = DWEP.Config.Colors
local background = colors["background"]
local foreground = colors["foreground"]
local inactiveClr = colors["inactiveClr"]
local theme = colors["theme"]
local highlight = Color(theme.r, theme.g, theme.b, 10)
surface.CreateFont( "dwep_24", { font = "Roboto", size = 24, weight = 600, bold = true, strikeout = false, outline = false, shadow = false, outline = false,})
surface.CreateFont( "dwep_22", { font = "Roboto", size = 22, weight = 600, bold = true, strikeout = false, outline = false, shadow = false, outline = false,})
surface.CreateFont( "dwep_20", { font = "Roboto", size = 20, weight = 600, bold = true, strikeout = false, outline = false, shadow = false, outline = false,})
surface.CreateFont( "dwep_18", { font = "Roboto", size = 18, weight = 600, bold = true, strikeout = false, outline = false, shadow = false, outline = false,})
surface.CreateFont( "dwep_16", { font = "Roboto", size = 16, weight = 600, bold = true, strikeout = false, outline = false, shadow = false, outline = false,})
DWEP.SearchData = DWEP.SearchData or {
["search"] = "",
["results"] = DWEP.Sweps,
["searchTime"] = 0,
["searchComplete"] = 0,
}
hook.Add("InitPostEntity", "LoadDWEPData", function()
net.Start("dwep_load_weapon")
net.SendToServer()
end)
net.Receive("dwep_load_weapon", function()
local updateData = net.ReadTable()
local class = net.ReadString()
for k,v in pairs(updateData) do
DWEP.AdjustValue(class, k, v)
end
end)
local function generateSearch()
if not DWEP.Menu then return end
local searchResults = DWEP.SearchData["results"]
local searchScroll = DWEP.Menu.SearchPanel.ScrollPanel
searchScroll.ypos = 0
local highlight = Color(theme.r, theme.g, theme.b, 10)
for k,v in pairs(searchResults) do
local id = #DWEP.Menu.SearchPanel.Results + 1 or 1
DWEP.Menu.SearchPanel.Results[id] = vgui.Create("DButton", searchScroll)
local resultPanel = DWEP.Menu.SearchPanel.Results[id]
resultPanel.value = v
resultPanel:SetPos(0,searchScroll.ypos)
resultPanel:SetSize(searchScroll:GetWide(), 29)
resultPanel:SetText("")
local name = weapons.GetStored(v).PrintName or "Missing PrintName"
local barClr = k % 2 == 0 and foreground or Color(foreground.r, foreground.g, foreground.b, 150)
resultPanel.Paint = function(me,w,h)
surface.SetDrawColor(barClr)
surface.DrawRect(0,0,w,h)
draw.SimpleText(string.upper(v .. " - " .. name), "dwep_20", w * .05, h / 2, string.find(v, DWEP.SearchData["search"]) and color_white or inactiveClr, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
if me:IsHovered() then
surface.SetDrawColor(highlight)
surface.DrawRect(0,0,w,h)
end
end
resultPanel.DoClick = function()
OpenDWEPWeapon(v)
end
searchScroll.ypos = searchScroll.ypos + 29 * 1.05
end
end
local oldResults = {}
local function refreshResults()
if IsValid(DWEP.Menu) and IsValid(DWEP.Menu.SearchPanel) then
if DWEP.SearchData["results"] != oldResults then
DWEP.SearchData["searchTime"] = nil
local total = #DWEP.Menu.SearchPanel.Results
for k,v in pairs(DWEP.Menu.SearchPanel.Results) do
v:Remove()
end
generateSearch()
end
end
end
local function updateSearch(searchText, forward)
local searchData = DWEP.SearchData
local results = searchData["results"]
searchData["search"] = searchText
local searchTable = DWEP.Sweps
if #results <= 0 or not forward then
searchTable = DWEP.Sweps
elseif #results >= 0 and forward then
searchTable = results
end
results = {}
local searchTotal = #searchTable
timer.Create("dwep_searchtime", .5, 1, function()
searchData["searchTime"] = CurTime()
end)
for i = 1 , searchTotal do
local v = searchTable[i]
if string.find(v, searchText) and not table.HasValue(results, v) then
results[#results + 1 or 1] = v
if i >= searchTotal then
searchData["results"] = results
end
else
searchTotal = searchTotal - 1
end
end
end
local barClr = Color(foreground.r, foreground.g, foreground.b, 150)
local function paintSbar(sbar)
local bar = sbar:GetVBar()
local buttH = 0
function bar.btnUp:Paint( w, h )
buttH = h
end
function bar:Paint( w, h )
draw.RoundedBox( 8, w / 2 - w / 2, buttH, w / 2, h - buttH * 2, barClr )
end
function bar.btnDown:Paint( w, h )
end
function bar.btnGrip:Paint( w, h )
draw.RoundedBox( 8, w / 2 - w / 2, 0, w / 2, h , theme )
end
end
function OpenDWEP(refresh)
if not DWEP.CanDWEP(LocalPlayer()) then return end
DWEP.Menu = vgui.Create("DFrame")
local dmenu = DWEP.Menu
if not refresh then
dmenu:SetPos(scrw / 2 - scrw * .25, scrh * 2)
dmenu:MoveTo(scrw / 2 - scrw * .25, scrh / 2 - scrh * .3, .5)
else
dmenu:SetPos(scrw / 2 - scrw * .25, scrh / 2 - scrh * .3)
end
dmenu:SetSize(scrw * .5, scrh * .6)
dmenu:SetTitle("")
dmenu:MakePopup()
dmenu.Paint = function(me,w,h)
surface.SetDrawColor(background)
surface.DrawRect(0,0,w,h)
surface.SetDrawColor(foreground)
surface.DrawRect(0,0,w,h * .05)
draw.SimpleText("DWeapon Editor", "dwep_22", w / 2, h * .025, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
local frameW, frameH = dmenu:GetWide(), dmenu:GetTall()
DWEP.Menu.SearchPanel = vgui.Create("DPanel", dmenu)
DWEP.Menu.SearchPanel.Results = DWEP.Menu.SearchPanel.Results or {}
local searchPanel = DWEP.Menu.SearchPanel
searchPanel:SetPos(0, frameH * .05)
searchPanel:SetSize(frameW, frameH * .95)
local searchData = DWEP.SearchData
searchPanel.Paint = function(me,w,h)
--draw.SimpleText("Weapons: ", "dwep_22", frameW * .05, frameH * .025, color_white, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
draw.RoundedBox(8, w / 2 - w * .25, h * .108, w * .5, h * .025, foreground)
if searchData["searchTime"] then
local searchTime = searchData["searchTime"] * 100
local waitTime = .35 * 100
draw.RoundedBox(8, w / 2 - w * .25, h * .108, (w * .5) * ( math.Clamp(math.ceil(searchTime - CurTime() * 100) * -1, 0, waitTime) / waitTime), h * .025, theme)
end
--if searchData["results"] then
draw.SimpleText(#searchData["results"] .. " Results", "dwep_20", w / 2, h * .97, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
--end
end
local oldstring = DWEP.SearchData["search"]
local searchBar = vgui.Create("DTextEntry", searchPanel)
searchBar:SetFont("dwep_20")
searchBar:SetPos(frameW * .05, frameH * .05)
searchBar:SetSize(frameW * .9, frameH * .045)
searchBar:SetUpdateOnType(true)
searchBar.Paint = function(me,w,h)
surface.SetDrawColor(foreground)
surface.DrawRect(0,0,w,h)
me:DrawTextEntryText(color_white, theme, theme)
if string.len(me:GetText()) <= 0 then
draw.SimpleText("Search Weapons..", "dwep_20", 5, h / 2, Color(80, 80, 80, 255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
end
searchBar:SetValue(DWEP.SearchData["search"] or "")
function searchBar:OnValueChange(value)
oldstring = DWEP.SearchData["search"]
local forward = false
if #value > #oldstring then
forward = true
end
updateSearch(value, forward)
end
DWEP.Menu.SearchPanel.ScrollPanel = vgui.Create("DScrollPanel", searchPanel)
local searchScroll = DWEP.Menu.SearchPanel.ScrollPanel
searchScroll:SetPos(frameW * .05, frameH * .135)
searchScroll:SetSize(frameW * .9, frameH * .75)
paintSbar(searchScroll)
generateSearch()
end
hook.Add("Think", "DWEP_SearchUpdate", function()
if DWEP.SearchData["searchTime"] and DWEP.SearchData["searchTime"] + .35 < CurTime() then
refreshResults()
DWEP.SearchData["searchTime"] = nil
end
end)
local checked = Material("dconfig/checked.png")
local function formatWeapon(weaponData)
local updateData = {}
local function formatWeaponData(tbl, parent)
for k, v in pairs(tbl) do
if type(v) != "function" then
if type(v) == "table" then
formatWeaponData(v, parent .. " | " .. k)
else
updateData[parent .. " | " .. k] = v
end
end
end
end
for k,v in pairs(weaponData) do
local valType = type(v)
if valType == "table" then
formatWeaponData(v, k)
elseif valType != "Vector" and valType != "function" then
updateData[k] = v
end
end
return updateData
end
local function UpdateWeapon(class, data)
for k,v in pairs(data) do
DWEP.AdjustValue(class, k, v)
end
net.Start("dwep_update_weapon")
net.WriteTable(data)
net.WriteString(class)
net.SendToServer()
end
local optionButtons = {
["Delete Data"] = {color = theme, callback = function(class, data)
local weapon = weapons.GetStored(class)
weapon = DWEP.DefaultSweps[class]
net.Start("dwep_reset_weapon")
net.WriteString(class)
net.SendToServer()
DWEP.Menu:Remove()
OpenDWEP(true)
LocalPlayer():ChatPrint("Deleting data requires a server reset for values to return to default.")
LocalPlayer():ChatPrint(class .. " data has been deleted.")
end},
["Save"] = {color = theme, callback = function(class, data) UpdateWeapon(class, data) end},
["Close"] = {color = foreground, callback = function() DWEP.Menu:Remove() OpenDWEP(true) end},
}
local function __genOrderedIndex( t )
local orderedIndex = {}
for key in pairs(t) do
table.insert( orderedIndex, key )
end
table.sort( orderedIndex )
return orderedIndex
end
local function orderedNext(t, state)
-- Equivalent of the next function, but returns the keys in the alphabetic
-- order. We use a temporary ordered key table that is stored in the
-- table being iterated.
local key = nil
--print("orderedNext: state = "..tostring(state) )
if state == nil then
-- the first time, generate the index
t.__orderedIndex = __genOrderedIndex( t )
key = t.__orderedIndex[1]
else
-- fetch the next value
for i = 1,table.getn(t.__orderedIndex) do
if t.__orderedIndex[i] == state then
key = t.__orderedIndex[i+1]
end
end
end
if key then
return key, t[key]
end
-- no more value to return, cleanup
t.__orderedIndex = nil
return
end
local function orderedPairs(t)
-- Equivalent of the pairs() function on tables. Allows to iterate
-- in order
return orderedNext, t, nil
end
function OpenDWEPWeapon(class)
local parent = DWEP.Menu
local weapon = weapons.GetStored(class) or nil
local updateData = {}
if weapon and IsValid(parent) then
local drawData = {
["name"] = weapon.PrintName or "Missing Printname",
}
local searchPanel = DWEP.Menu.SearchPanel
searchPanel:Remove()
DWEP.Menu.WeaponEditor = vgui.Create("DPanel", parent)
local weaponEditor = DWEP.Menu.WeaponEditor
weaponEditor:SetPos(0,parent:GetTall() * .05)
weaponEditor:SetSize(parent:GetWide(), parent:GetTall())
weaponEditor.Paint = function(me,w,h)
end
local frameW,frameH = weaponEditor:GetWide(), weaponEditor:GetTall()
local offset = frameW / 2 - frameW * .4
local count = -1
for k,v in pairs(optionButtons) do
count = count + 1
local optionButton = vgui.Create("DButton", weaponEditor)
optionButton:SetPos(offset + frameW * .2 + (count * weaponEditor:GetWide() * .2) + 10, weaponEditor:GetTall() * .15)
optionButton:SetSize(weaponEditor:GetWide() * .2 , weaponEditor:GetTall() * .05)
optionButton:SetText("")
optionButton.Paint = function(me,w,h)
surface.SetDrawColor(foreground)
surface.DrawRect(0,0,w,h)
draw.SimpleText(k, "dwep_20", w / 2, h /2, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if me:IsHovered() then
surface.SetDrawColor(highlight)
surface.DrawRect(0,0,w,h)
end
end
optionButton.DoClick = function()
v.callback(class, updateData)
end
end
local weaponModel = vgui.Create("DModelPanel", weaponEditor)
local model = weapon.WorldModel
if not model or #model <= 0 then
model = "models/weapons/w_crowbar.mdl"
end
local previewSize = frameW * .4
weaponModel:SetPos(offset, frameH * .05 )
weaponModel:SetSize(previewSize * .5, frameH * .15)
weaponModel:SetModel(model)
function weaponModel:LayoutEntity( Entity ) return end
local CamPos = Vector( 15, -6, 60 )
local LookAt = Vector( 0, 0, 60 )
weaponModel.Entity:SetPos( weaponModel.Entity:GetPos() + Vector(0,0,-2))
weaponModel:SetFOV(50)
weaponModel:SetCamPos( CamPos )
weaponModel:SetLookAt( LookAt )
local num = .7
local min, max = weaponModel.Entity:GetRenderBounds()
weaponModel:SetCamPos(min:Distance(max) * Vector(num, num, num))
weaponModel:SetLookAt((max + min) / 2)
local oldPaint = weaponModel.Paint
weaponModel.Paint = function(me,w,h)
surface.SetDrawColor(foreground)
surface.DrawRect(0,0,w,h)
oldPaint(me,w,h)
draw.SimpleText(string.upper(drawData["name"]), "dwep_18", w / 2, h * .1, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
draw.SimpleText(string.upper(class), "dwep_18", w / 2, h * .9, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
local weaponScroll = vgui.Create("DScrollPanel", weaponEditor)
weaponScroll:SetPos(0, frameH * .22)
weaponScroll:SetSize(frameW, frameH - frameH * .29)
paintSbar(weaponScroll)
local ypos = 0
local inputSize = offset * 4
local inputColor = Color(foreground.r, foreground.g, foreground.b, 150)
local parents = {}
local parentLayer = nil
local weaponData = formatWeapon(weapon)
for k,v in orderedPairs(weaponData) do
local defaultValue = ""
if type(v) == "Vector" or type(v) == "Angle" then continue end
--if type(v) == "table" then updateData[parentLayer][k] = {value = v, changed = true, parent = parentLayer} targetUpdate = updateData[parentLayer][k] end
local configOption = vgui.Create("DPanel", weaponScroll)
configOption:SetPos(offset, ypos)
configOption:SetSize(weaponScroll:GetWide() - offset * 2, 29)
configOption.Paint = function(me,w,h)
surface.SetDrawColor(foreground)
surface.DrawRect(0,0,w - inputSize - 2,h)
me:DrawTextEntryText(color_white, theme, theme)
draw.SimpleText(k .. ":", "dwep_16", 5, h / 2, color_white, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
if type(v) == "string" or type(v) == "number" then
local configInput = vgui.Create("DTextEntry", weaponScroll)
configInput:SetPos(weaponScroll:GetWide() - offset - inputSize, ypos)
configInput:SetSize(inputSize, 29)
configInput:SetFont("dwep_16")
configInput:SetUpdateOnType(true)
configInput.Paint = function(me,w,h)
surface.SetDrawColor(inputColor)
surface.DrawRect(0,0,w,h)
me:DrawTextEntryText(color_white, theme, theme)
if string.len(me:GetText()) <= 0 and type(defaultValue) == "string" and string.len(defaultValue) > 0 then
draw.SimpleText("Default: " .. defaultValue, "hub_20", 5, h / 2, Color(80, 80, 80, 255), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
end
if type(v) == "number" then
configInput:SetNumeric(true)
end
configInput:SetValue(v)
function configInput:OnValueChange(value)
if type(v) == "string" then
value = tostring(value)
else
value = tonumber(value)
end
updateData[k] = value
end
end
if type(v) == "boolean" then
local configInput = vgui.Create("DCheckBox", weaponScroll)
configInput:SetPos(weaponScroll:GetWide() - offset - inputSize, ypos)
configInput:SetSize(29, 29)
configInput.Paint = function(me,w,h)
surface.SetDrawColor(foreground)
surface.DrawRect(0,0,w,h)
if me:GetChecked() then
surface.SetDrawColor(theme)
surface.SetMaterial(checked)
surface.DrawTexturedRect(0,0,w,h)
elseif me:IsHovered() then
surface.SetDrawColor(highlight)
surface.SetMaterial(checked)
surface.DrawTexturedRect(0,0,w,h)
end
end
function configInput:OnChange(value)
updateData[k] = value
end
configInput:SetChecked(v)
end
ypos = ypos + 29 * 1.1
end
end
end
concommand.Add("dwep", OpenDWEP)
--leak by matveicher
--vk group - https://vk.com/gmodffdev
--steam - https://steamcommunity.com/profiles/76561198968457747/
--ds server - https://discord.gg/V329W7Ce8g
--ds - matveicher