745 lines
22 KiB
Lua
745 lines
22 KiB
Lua
|
local function ScrapLabelThink(self)
|
||
|
local scrap = MySelf:GetAmmoCount("scrap")
|
||
|
if self.m_LastScrap ~= scrap then
|
||
|
self.m_LastScrap = scrap
|
||
|
|
||
|
self:SetText("Scrap for usage: "..scrap)
|
||
|
self:SizeToContents()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function SelectedInv()
|
||
|
return GAMEMODE.InventoryMenu and GAMEMODE.InventoryMenu.SelInv
|
||
|
end
|
||
|
|
||
|
local function DismantleClick()
|
||
|
Derma_Query("Dismantle weapon? This cannot be reversed.", "Confirm Dissassembling Weapon",
|
||
|
"Dismantle", function()
|
||
|
RunConsoleCommand("zs_dismantle", SelectedInv())
|
||
|
|
||
|
GAMEMODE.RemantlerInterface:Close()
|
||
|
GAMEMODE.RemantlerInterface = nil
|
||
|
end,
|
||
|
"Cancel", function()
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
hook.Add("Think", "RemantlerMenuThink", function()
|
||
|
local pan = GAMEMODE.RemantlerInterface
|
||
|
if pan and pan:IsValid() and pan:IsVisible() then
|
||
|
local mx, my = gui.MousePos()
|
||
|
local x, y = pan:GetPos()
|
||
|
if mx < x - 16 or my < y - 16 or mx > x + pan:GetWide() + 16 or my > y + pan:GetTall() + 16 then
|
||
|
pan:SetVisible(false)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
local function RemantlerCenterMouse(self)
|
||
|
local x, y = self:GetPos()
|
||
|
local w, h = self:GetSize()
|
||
|
gui.SetMousePos(x + w / 2, y + h / 2)
|
||
|
end
|
||
|
|
||
|
-- Miniature version of the skill tree code
|
||
|
local PANEL = {}
|
||
|
local hovquality
|
||
|
local hovbranch
|
||
|
|
||
|
AccessorFunc( PANEL, "vCamPos", "CamPos" )
|
||
|
AccessorFunc( PANEL, "fFOV", "FOV" )
|
||
|
AccessorFunc( PANEL, "vLookatPos", "LookAt" )
|
||
|
AccessorFunc( PANEL, "aLookAngle", "LookAng" )
|
||
|
AccessorFunc( PANEL, "colAmbientLight", "AmbientLight" )
|
||
|
|
||
|
PANEL.CreationTime = 0
|
||
|
|
||
|
function PANEL:Init()
|
||
|
local node
|
||
|
local screenscale = BetterScreenScale()
|
||
|
|
||
|
self.DirectionalLight = {}
|
||
|
self.FarZ = 32000
|
||
|
|
||
|
self.MainMenu = GAMEMODE.RemantlerInterface
|
||
|
self.RemantleNodes = {}
|
||
|
self.RemantleNodes[0] = {}
|
||
|
|
||
|
if not SelectedInv() and self.MainMenu.m_WepClass then
|
||
|
self.GunTab = weapons.Get(self.MainMenu.m_WepClass)
|
||
|
local gtbl = self.GunTab
|
||
|
local curqua = gtbl.QualityTier
|
||
|
|
||
|
if gtbl.AllowQualityWeapons then
|
||
|
local branches = gtbl.Branches
|
||
|
|
||
|
if branches then
|
||
|
for no, _ in pairs(branches) do
|
||
|
self.RemantleNodes[no] = {}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self.OrigTab = gtbl.BaseQuality and weapons.Get(gtbl.BaseQuality) or gtbl
|
||
|
|
||
|
for i = 0, #GAMEMODE.WeaponQualities do
|
||
|
node = ClientsideModel("models/props/cs_italy/orange.mdl", RENDER_GROUP_OPAQUE_ENTITY)
|
||
|
if IsValid(node) then
|
||
|
node:SetNoDraw(true)
|
||
|
node:SetPos(Vector(0, -48 + i * 30, i > 0 and branches and 0 or -9))
|
||
|
|
||
|
node.Unlocked = i == 0 or (curqua and curqua >= i or nil)
|
||
|
if i ~= 0 and curqua and curqua >= 1 and gtbl.Branch then
|
||
|
node.Locked = true
|
||
|
end
|
||
|
self.RemantleNodes[0][i] = node
|
||
|
end
|
||
|
|
||
|
if i > 0 and branches then
|
||
|
for no, br in pairs(branches) do
|
||
|
node = ClientsideModel("models/props/cs_italy/orange.mdl", RENDER_GROUP_OPAQUE_ENTITY)
|
||
|
if IsValid(node) then
|
||
|
node:SetNoDraw(true)
|
||
|
node:SetPos(Vector(0, -48 + i * 30, 0 - (16/#branches)*no))
|
||
|
|
||
|
node.Unlocked = i == 0 or (curqua and curqua >= i or nil)
|
||
|
if curqua and curqua >= 1 and gtbl.Branch ~= no then
|
||
|
node.Locked = true
|
||
|
end
|
||
|
node.Name = br and br.NewNames and br.NewNames[i] or nil
|
||
|
self.RemantleNodes[no][i] = node
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:SetCamPos( Vector( 20000, 0, 0 ) )
|
||
|
self:SetLookAt( Vector( 0, 0, 0 ) )
|
||
|
self:SetFOV( 5 )
|
||
|
|
||
|
self:SetAmbientLight( Color( 50, 50, 50 ) )
|
||
|
|
||
|
self:SetDirectionalLight( BOX_TOP, color_white )
|
||
|
self:SetDirectionalLight( BOX_FRONT, color_white )
|
||
|
|
||
|
local top = vgui.Create("Panel", self)
|
||
|
top:SetSize(ScrW(), 256)
|
||
|
top:SetMouseInputEnabled(false)
|
||
|
|
||
|
local qualityname = vgui.Create("DLabel", top)
|
||
|
qualityname:SetFont("ZSHUDFont")
|
||
|
qualityname:SetTextColor(COLOR_WHITE)
|
||
|
qualityname:SetContentAlignment(8)
|
||
|
qualityname:Dock(TOP)
|
||
|
|
||
|
local desc = {}
|
||
|
for i=1, 5 do
|
||
|
local qualityd = vgui.Create("DLabel", top)
|
||
|
qualityd:SetFont("ZSHUDFontSmallest")
|
||
|
qualityd:SetTextColor(COLOR_GRAY)
|
||
|
qualityd:SetContentAlignment(8)
|
||
|
qualityd:Dock(TOP)
|
||
|
table.insert(desc, qualityd)
|
||
|
end
|
||
|
|
||
|
local bottom = vgui.Create("Panel", self)
|
||
|
bottom:SetSize(ScrW(), 36 * screenscale)
|
||
|
bottom:SetMouseInputEnabled(false)
|
||
|
|
||
|
local scrapcost = vgui.Create("DLabel", bottom)
|
||
|
scrapcost:SetFont("ZSHUDFontSmaller")
|
||
|
scrapcost:SetTextColor(COLOR_WHITE)
|
||
|
scrapcost:SetContentAlignment(2)
|
||
|
scrapcost:Dock(TOP)
|
||
|
|
||
|
self.Top = top
|
||
|
self.QualityName = qualityname
|
||
|
self.QualityDesc = desc
|
||
|
self.Bottom = bottom
|
||
|
self.ScrapCost = scrapcost
|
||
|
|
||
|
top:SetAlpha(0)
|
||
|
bottom:SetAlpha(0)
|
||
|
|
||
|
self:DockMargin(0, 0, 0, 0)
|
||
|
self:DockPadding(0, 0, 0, 0)
|
||
|
self:Dock(FILL)
|
||
|
self:InvalidateLayout()
|
||
|
end
|
||
|
|
||
|
function PANEL:PerformLayout()
|
||
|
local screenscale = BetterScreenScale()
|
||
|
|
||
|
self.Top:AlignTop(4)
|
||
|
self.Top:CenterHorizontal()
|
||
|
|
||
|
self.Bottom:AlignBottom(10 * screenscale)
|
||
|
self.Bottom:CenterHorizontal()
|
||
|
end
|
||
|
|
||
|
function PANEL:SetDirectionalLight(iDirection, color)
|
||
|
self.DirectionalLight[iDirection] = color
|
||
|
end
|
||
|
|
||
|
local matBeam = Material("trails/laser")
|
||
|
local matGlow = Material("sprites/glow04_noz")
|
||
|
local matWhite = Material("models/debug/debugwhite")
|
||
|
local colBeam = Color(0, 0, 0)
|
||
|
local colBeam2 = Color(255, 255, 255)
|
||
|
local colGlow = Color(0, 0, 0)
|
||
|
function PANEL:Paint(w, h)
|
||
|
local realtime = RealTime()
|
||
|
local nodepos, selected
|
||
|
local col, othernodepos
|
||
|
local add, pos_a, pos_b, sat
|
||
|
local size, ang
|
||
|
|
||
|
local campos = self.vCamPos
|
||
|
campos.x = 1600
|
||
|
campos.y = math.Clamp(campos.y, -262, 262)
|
||
|
campos.z = math.Clamp(campos.z, -262, 262)
|
||
|
|
||
|
self:SetCamPos(campos)
|
||
|
self.vLookatPos:Set(campos)
|
||
|
self.vLookatPos.x = 0
|
||
|
|
||
|
self:SetCamPos(campos)
|
||
|
|
||
|
surface.SetDrawColor(15, 20, 25, 230)
|
||
|
surface.DrawRect(0, 0, w, h)
|
||
|
|
||
|
ang = self.aLookAngle
|
||
|
if not ang then
|
||
|
ang = (self.vLookatPos - self.vCamPos):Angle()
|
||
|
end
|
||
|
local to_camera = ang:Forward() * -1
|
||
|
|
||
|
local x, y = self:LocalToScreen(0, 0)
|
||
|
|
||
|
local mx, my = gui.MousePos()
|
||
|
local aimvector = util.AimVector(ang, self.fFOV, mx - x, my - y, w, h)
|
||
|
local intersectpos = util.IntersectRayWithPlane(self.vCamPos, aimvector, self:GetLookAt(), Vector(-1, 0, 0))
|
||
|
|
||
|
cam.Start3D( self.vCamPos, ang, self.fFOV, x, y, w, h, 5, self.FarZ )
|
||
|
cam.IgnoreZ( true )
|
||
|
|
||
|
render.SuppressEngineLighting( true )
|
||
|
render.SetLightingOrigin( vector_origin )
|
||
|
render.ResetModelLighting( self.colAmbientLight.r / 255, self.colAmbientLight.g / 255, self.colAmbientLight.b / 255 )
|
||
|
|
||
|
for i=0, 6 do
|
||
|
col = self.DirectionalLight[ i ]
|
||
|
if col then
|
||
|
render.SetModelLighting( i, col.r / 255, col.g / 255, col.b / 255 )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
render.SetMaterial(matBeam)
|
||
|
for branch, nodes in pairs(self.RemantleNodes) do
|
||
|
for id, node in pairs(nodes) do
|
||
|
if IsValid(node) then
|
||
|
nodepos = node:GetPos()
|
||
|
othernodes = {}
|
||
|
|
||
|
if id > 0 then
|
||
|
othernodes[#othernodes+1] = nodes[id + 1]
|
||
|
else
|
||
|
for i = 0, #self.RemantleNodes do
|
||
|
othernodes[#othernodes+1] = self.RemantleNodes[i][1]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
for _, othernode in pairs(othernodes) do
|
||
|
if IsValid(othernode) then
|
||
|
othernodepos = othernode:GetPos()
|
||
|
|
||
|
local beamsize = 4
|
||
|
if othernode.Unlocked then
|
||
|
colBeam.r = 32
|
||
|
colBeam.g = 128
|
||
|
colBeam.b = 255
|
||
|
elseif node.Unlocked then
|
||
|
colBeam.r = 255
|
||
|
colBeam.g = 192
|
||
|
colBeam.b = 0
|
||
|
else
|
||
|
colBeam.r = 128
|
||
|
colBeam.g = 40
|
||
|
colBeam.b = 40
|
||
|
|
||
|
beamsize = 2
|
||
|
end
|
||
|
|
||
|
if hovquality and hovquality >= id - 1 and hovquality <= id + 1 and hovbranch == branch then
|
||
|
add = math.abs(math.sin(realtime * math.pi)) * 120
|
||
|
colBeam.r = math.min(colBeam.r + add, 255)
|
||
|
colBeam.g = math.min(colBeam.g + add, 255)
|
||
|
colBeam.b = math.min(colBeam.b + add, 255)
|
||
|
|
||
|
colBeam.a = 180
|
||
|
colBeam2.a = 190
|
||
|
else
|
||
|
colBeam.a = 110
|
||
|
colBeam2.a = 110
|
||
|
end
|
||
|
|
||
|
pos_a = nodepos + Vector(-16, 0, 0)
|
||
|
pos_b = othernodepos + Vector(-16, 0, 0)
|
||
|
|
||
|
render.DrawBeam(pos_a, pos_b, beamsize, 0, 1, colBeam2)
|
||
|
render.DrawBeam(pos_a, pos_b, 8, 0, 1, colBeam)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local oldquality = hovquality
|
||
|
local oldbranch = hovbranch
|
||
|
hovquality = nil
|
||
|
hovbranch = nil
|
||
|
|
||
|
local angle = (realtime * 180) % 360
|
||
|
|
||
|
for branch, nodes in pairs(self.RemantleNodes) do
|
||
|
for id, node in pairs(nodes) do
|
||
|
if IsValid(node) then
|
||
|
nodepos = node:GetPos()
|
||
|
selected = intersectpos and nodepos:DistToSqr(intersectpos) <= 36
|
||
|
|
||
|
cam.Start3D2D(node:GetPos() - to_camera * 8, Angle(0, 90, 90), 0.08)
|
||
|
surface.DisableClipping(true)
|
||
|
DisableClipping(true)
|
||
|
|
||
|
if selected then
|
||
|
hovquality = id
|
||
|
hovbranch = branch
|
||
|
|
||
|
sat = 1 - math.abs(math.sin(realtime * math.pi)) * 0.25
|
||
|
else
|
||
|
sat = 1
|
||
|
end
|
||
|
|
||
|
local prevnode = nodes[id - 1] or id == 1 and self.RemantleNodes[0][0]
|
||
|
if node.Locked then
|
||
|
render.SetColorModulation(sat / 4, sat / 4, sat / 4)
|
||
|
elseif node.Unlocked then
|
||
|
render.SetColorModulation(sat / 4, sat / 4, sat)
|
||
|
elseif prevnode.Unlocked and not node.Unlocked then
|
||
|
render.SetColorModulation(sat, sat / 2, 0)
|
||
|
else
|
||
|
render.SetColorModulation(sat / 2, 0, 0)
|
||
|
end
|
||
|
render.ModelMaterialOverride(matWhite)
|
||
|
|
||
|
node:DrawModel()
|
||
|
|
||
|
render.ModelMaterialOverride()
|
||
|
render.SetColorModulation(1, 1, 1)
|
||
|
|
||
|
local txt = "Standard"
|
||
|
local quals = GAMEMODE.WeaponQualities[id]
|
||
|
if quals then
|
||
|
txt = node.Name or branch == 0 and quals[1] or quals[3]
|
||
|
end
|
||
|
|
||
|
draw.SimpleText(txt, "ZS3D2DFont2", -x, -y, selected and color_white or COLOR_GRAY, TEXT_ALIGN_CENTER)
|
||
|
|
||
|
DisableClipping(false)
|
||
|
surface.DisableClipping(false)
|
||
|
cam.End3D2D()
|
||
|
|
||
|
if not node.Locked then
|
||
|
render.SetMaterial(matGlow)
|
||
|
colGlow.r = sat * 255 colGlow.g = sat * 255 colGlow.b = sat * 255
|
||
|
if node.Unlocked then
|
||
|
colGlow.r = colGlow.r / 4
|
||
|
colGlow.g = colGlow.g / 4
|
||
|
elseif not node.Unlocked then
|
||
|
if prevnode.Unlocked then
|
||
|
colGlow.g = colGlow.g / 1.5
|
||
|
colGlow.b = 0
|
||
|
else
|
||
|
colGlow.r = colGlow.r / 1.5
|
||
|
colGlow.g = 0
|
||
|
colGlow.b = 0
|
||
|
end
|
||
|
end
|
||
|
size = selected and 30 or 20
|
||
|
render.DrawQuadEasy(nodepos, to_camera, size, size, colGlow, angle)
|
||
|
angle = angle + 45
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if intersectpos then
|
||
|
intersectpos = intersectpos + Vector(16, 0, 0)
|
||
|
render.SetMaterial(matGlow)
|
||
|
render.DrawQuadEasy(intersectpos, to_camera, 12, 12, color_white, realtime * 90)
|
||
|
end
|
||
|
|
||
|
render.SuppressEngineLighting(false)
|
||
|
|
||
|
cam.IgnoreZ(false)
|
||
|
cam.End3D()
|
||
|
|
||
|
if oldquality ~= hovquality or oldbranch ~= hovbranch then
|
||
|
self.Top:Stop()
|
||
|
self.Bottom:Stop()
|
||
|
|
||
|
if hovquality and hovbranch then
|
||
|
local txt, scost = "Standard", ""
|
||
|
|
||
|
local quals = GAMEMODE.WeaponQualities[hovquality]
|
||
|
if quals then
|
||
|
txt = self.RemantleNodes[hovbranch][hovquality].Name or hovbranch == 0 and quals[1] or quals[3]
|
||
|
scost = GAMEMODE:GetUpgradeScrap(self.GunTab, hovquality)
|
||
|
end
|
||
|
|
||
|
self.QualityName:SetText(txt)
|
||
|
self.QualityName:SizeToContents()
|
||
|
|
||
|
self.ScrapCost:SetText(scost ~= "" and "Scrap Cost: " .. scost or "")
|
||
|
self.ScrapCost:SetTextColor(scost ~= "" and MySelf:GetAmmoCount("scrap") >= scost and COLOR_WHITE or COLOR_RED)
|
||
|
self.ScrapCost:SizeToContents()
|
||
|
|
||
|
local dtxt
|
||
|
local altdesc = self.OrigTab.RemantleDescs
|
||
|
local altdescs = altdesc and altdesc[hovbranch][hovquality]
|
||
|
|
||
|
for i=1, 5 do
|
||
|
dtxt = " "
|
||
|
if txt ~= "Standard" and altdesc and altdescs and altdescs[i] then
|
||
|
dtxt = altdescs[i]
|
||
|
end
|
||
|
|
||
|
self.QualityDesc[i]:SetTextColor(i == 1 and hovbranch ~= 0 and COLOR_WHITE or COLOR_GREEN)
|
||
|
self.QualityDesc[i]:SetText(dtxt)
|
||
|
self.QualityDesc[i]:SizeToContents()
|
||
|
end
|
||
|
|
||
|
surface.PlaySound("zombiesurvival/ui/misc1.ogg")
|
||
|
|
||
|
self.Top:SetAlpha(0)
|
||
|
self.Top:AlphaTo(195, 0.1)
|
||
|
|
||
|
self.Bottom:SetAlpha(0)
|
||
|
self.Bottom:AlphaTo(140, 0.1)
|
||
|
else
|
||
|
self.Top:AlphaTo(0, 0.1)
|
||
|
self.Bottom:AlphaTo(0, 0.1)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
net.Receive("zs_remantleconf", function()
|
||
|
if not (GAMEMODE.RemantlerInterface and GAMEMODE.RemantlerInterface:IsValid() and hovquality and hovbranch) then return end
|
||
|
|
||
|
local ri = GAMEMODE.RemantlerInterface
|
||
|
local path = ri.RemantlePath
|
||
|
|
||
|
local wepclass = ri.m_WepClass
|
||
|
local contentsqua = GAMEMODE.GunTab.QualityTier
|
||
|
local desiredqua = contentsqua and contentsqua + 1 or 1
|
||
|
local upgclass = GAMEMODE:GetWeaponClassOfQuality(not contentsqua and wepclass or GAMEMODE.GunTab.BaseQuality, desiredqua)
|
||
|
|
||
|
GAMEMODE.GunTab = weapons.Get(upgclass)
|
||
|
local gtbl = GAMEMODE.GunTab
|
||
|
local scost = GAMEMODE:GetUpgradeScrap(gtbl, desiredqua)
|
||
|
|
||
|
path.RemantleNodes[hovbranch][hovquality].Unlocked = true
|
||
|
path.ScrapCost:SetTextColor((MySelf:GetAmmoCount("scrap") - scost) >= scost and COLOR_WHITE or COLOR_RED)
|
||
|
|
||
|
ri.m_ContentsLabel:SetText(gtbl.PrintName)
|
||
|
ri.m_ContentsLabel:SizeToContents()
|
||
|
ri.m_ContentsLabel:CenterHorizontal()
|
||
|
|
||
|
local retscrap = GAMEMODE:GetDismantleScrap(gtbl)
|
||
|
local disscraptxt = gtbl.NoDismantle and "Cannot Dismantle" or "Dismantle for " .. retscrap .. " Scrap"
|
||
|
|
||
|
ri.m_Dismantle:SetText(disscraptxt)
|
||
|
ri.m_Dismantle:SizeToContents()
|
||
|
ri.m_Dismantle:CenterHorizontal()
|
||
|
|
||
|
ri.m_DisaButton:SetDisabled(gtbl.NoDismantle)
|
||
|
ri.m_DisaButton:SetTextColor(gtbl.NoDismantle and COLOR_DARKGRAY or COLOR_WHITE)
|
||
|
end)
|
||
|
|
||
|
function PANEL:OnMousePressed(mc)
|
||
|
if mc == MOUSE_LEFT and hovquality and hovbranch and hovquality ~= 0 then
|
||
|
local gtbl = self.GunTab
|
||
|
local cqua = gtbl.QualityTier or 0
|
||
|
|
||
|
local current = self.RemantleNodes[hovbranch][hovquality]
|
||
|
local prev = self.RemantleNodes[hovbranch][hovquality - 1] or hovquality == 1 and self.RemantleNodes[0][0]
|
||
|
if cqua and hovquality > cqua and prev and prev.Unlocked and not current.Locked then
|
||
|
if self.GunTab.AmmoIfHas and MySelf:GetAmmoCount(self.GunTab.Primary.Ammo) == 0 then
|
||
|
GAMEMODE:CenterNotify(COLOR_RED, "You don't have the deployable ammo type for this!")
|
||
|
surface.PlaySound("buttons/button8.wav")
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local scost = GAMEMODE:GetUpgradeScrap(self.GunTab, hovquality)
|
||
|
if MySelf:GetAmmoCount("scrap") >= scost then
|
||
|
RunConsoleCommand("zs_upgrade", hovbranch ~= 0 and hovbranch)
|
||
|
|
||
|
return
|
||
|
else
|
||
|
GAMEMODE:CenterNotify(COLOR_RED, "You need enough scrap to upgrade this weapon!")
|
||
|
surface.PlaySound("buttons/button8.wav")
|
||
|
|
||
|
return
|
||
|
end
|
||
|
else
|
||
|
GAMEMODE:CenterNotify(COLOR_RED, "You must upgrade your weapon to the correct quality first!")
|
||
|
surface.PlaySound("buttons/button8.wav")
|
||
|
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
vgui.Register("ZSRemantlePath", PANEL, "Panel")
|
||
|
|
||
|
function GM:OpenRemantlerMenu(remantler)
|
||
|
if not (remantler and remantler:IsValid()) or (self.RemantlerInterface and self.RemantlerInterface:IsVisible()) then return end
|
||
|
local mytarget = SelectedInv() or MySelf:GetActiveWeapon():GetClass()
|
||
|
|
||
|
if self.RemantlerInterface and self.RemantlerInterface:IsValid() and self.RemantlerInterface.m_WepClass == mytarget then
|
||
|
self.RemantlerInterface:SetVisible(true)
|
||
|
self.RemantlerInterface:CenterMouse()
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local screenscale = BetterScreenScale()
|
||
|
local wid, hei = math.min(ScrW(), 900) * screenscale, math.min(ScrH(), 800) * screenscale
|
||
|
local tabhei = 24 * screenscale
|
||
|
|
||
|
local frame = vgui.Create("DFrame")
|
||
|
frame:SetSize(wid, hei)
|
||
|
frame:Center()
|
||
|
frame:SetDeleteOnClose(false)
|
||
|
frame:SetTitle(" ")
|
||
|
frame:SetDraggable(false)
|
||
|
if frame.btnClose and frame.btnClose:IsValid() then frame.btnClose:SetVisible(false) end
|
||
|
if frame.btnMinim and frame.btnMinim:IsValid() then frame.btnMinim:SetVisible(false) end
|
||
|
if frame.btnMaxim and frame.btnMaxim:IsValid() then frame.btnMaxim:SetVisible(false) end
|
||
|
frame.CenterMouse = RemantlerCenterMouse
|
||
|
self.RemantlerInterface = frame
|
||
|
|
||
|
frame.m_Remantler = remantler
|
||
|
frame.m_WepClass = mytarget
|
||
|
|
||
|
if not SelectedInv() then
|
||
|
self.GunTab = weapons.Get(frame.m_WepClass)
|
||
|
else
|
||
|
self.GunTab = GAMEMODE.ZSInventoryItemData[frame.m_WepClass]
|
||
|
end
|
||
|
|
||
|
local gtbl = self.GunTab
|
||
|
if not SelectedInv() and not (gtbl.AllowQualityWeapons or gtbl.PermitDismantle) then
|
||
|
frame.m_WepClass, gtbl = nil, nil
|
||
|
elseif SelectedInv() and ((gtbl.PermitDismantle ~= nil and not gtbl.PermitDismantle) or (self:GetInventoryItemType(mytarget) ~= INVCAT_TRINKETS)) then
|
||
|
frame.m_WepClass, gtbl = nil, nil
|
||
|
end
|
||
|
|
||
|
local topspace = vgui.Create("DPanel", frame)
|
||
|
topspace:SetWide(wid - 16)
|
||
|
|
||
|
local title = EasyLabel(topspace, "Weapon Remantler", "ZSHUDFontSmall", COLOR_WHITE)
|
||
|
title:CenterHorizontal()
|
||
|
local subtitle = EasyLabel(topspace, "Dismantle weapons into scrap and use scrap to upgrade weapons!", "ZSHUDFontTiny", COLOR_WHITE)
|
||
|
subtitle:CenterHorizontal()
|
||
|
subtitle:MoveBelow(title, 4)
|
||
|
|
||
|
local _, y = subtitle:GetPos()
|
||
|
topspace:SetTall(y + subtitle:GetTall() + 4)
|
||
|
topspace:AlignTop(8)
|
||
|
topspace:CenterHorizontal()
|
||
|
|
||
|
local bottomspace = vgui.Create("DPanel", frame)
|
||
|
bottomspace:SetWide(topspace:GetWide())
|
||
|
|
||
|
local pointslabel = EasyLabel(bottomspace, "Scrap for usage: 0", "ZSHUDFontTiny", COLOR_GREEN)
|
||
|
pointslabel:AlignTop(4)
|
||
|
pointslabel:AlignLeft(8)
|
||
|
pointslabel.Think = ScrapLabelThink
|
||
|
|
||
|
local lab = EasyLabel(bottomspace, "Disassembling your weapons cannot be reversed!", "ZSHUDFontTiny")
|
||
|
lab:AlignTop(4)
|
||
|
lab:AlignRight(4)
|
||
|
frame.m_AdviceLabel = lab
|
||
|
|
||
|
_, y = lab:GetPos()
|
||
|
bottomspace:SetTall(y + lab:GetTall() + 4)
|
||
|
bottomspace:AlignBottom(8)
|
||
|
bottomspace:CenterHorizontal()
|
||
|
|
||
|
local __, topy = topspace:GetPos()
|
||
|
local ___, boty = bottomspace:GetPos()
|
||
|
|
||
|
local remprop = vgui.Create("DPropertySheet", frame)
|
||
|
remprop:SetSize(wid - 8, boty - topy - 8 - topspace:GetTall())
|
||
|
remprop:MoveBelow(topspace, 4)
|
||
|
remprop:CenterHorizontal()
|
||
|
remprop.Paint = function() end
|
||
|
remprop:SetPadding(0)
|
||
|
|
||
|
local remantleframe = vgui.Create("DPanel", remprop)
|
||
|
local sheet = remprop:AddSheet("Remantling", remantleframe, "icon16/arrow_up.png", false, false)
|
||
|
sheet.Panel:SetPos(0, tabhei + 2)
|
||
|
remantleframe.Paint = function(me, w, h) surface.SetDrawColor(31, 33, 35, 255) surface.DrawRect(0, 0, w, h) end
|
||
|
remantleframe:SetSize(wid - 8, boty - topy - 8 - topspace:GetTall())
|
||
|
|
||
|
local trinketsframe = vgui.Create("DPanel")
|
||
|
sheet = remprop:AddSheet("Trinkets", trinketsframe, GAMEMODE.ItemCategoryIcons[ITEMCAT_TRINKETS], false, false)
|
||
|
sheet.Panel:SetPos(0, tabhei + 2)
|
||
|
trinketsframe:SetSize(wid - 8, boty - topy - 8 - topspace:GetTall())
|
||
|
trinketsframe:SetPaintBackground(false)
|
||
|
frame.TrinketsFrame = trinketsframe
|
||
|
|
||
|
local ammoframe = vgui.Create("DPanel")
|
||
|
sheet = remprop:AddSheet("Ammunition", ammoframe, GAMEMODE.ItemCategoryIcons[ITEMCAT_AMMO], false, false)
|
||
|
sheet.Panel:SetPos(0, tabhei + 2)
|
||
|
ammoframe:SetSize(wid - 8, boty - topy - 8 - topspace:GetTall())
|
||
|
ammoframe:SetPaintBackground(true)
|
||
|
frame.m_AmmoFrame = ammoframe
|
||
|
|
||
|
local subpropertysheet
|
||
|
for frameindex = 0, 1 do
|
||
|
local curframe = frameindex == 0 and trinketsframe or ammoframe
|
||
|
|
||
|
if frameindex == 0 then
|
||
|
local tabpane = vgui.Create("DPanel", curframe)
|
||
|
--tabpane.Paint = function() end
|
||
|
tabpane.Grids = {}
|
||
|
tabpane.Buttons = {}
|
||
|
tabpane:SetSize(curframe:GetWide(), curframe:GetTall())
|
||
|
|
||
|
local offset = 64 * screenscale
|
||
|
local itemframe = vgui.Create("DScrollPanel", tabpane)
|
||
|
itemframe:SetSize(curframe:GetWide(), curframe:GetTall() - offset - 32)
|
||
|
itemframe:SetPos(0, offset)
|
||
|
|
||
|
local mkgrid = function()
|
||
|
local list = vgui.Create("DGrid", itemframe)
|
||
|
list:SetPos(0, 0)
|
||
|
list:SetSize(curframe:GetWide() - 312, curframe:GetTall())
|
||
|
list:SetCols(2)
|
||
|
list:SetColWide(280 * screenscale)
|
||
|
list:SetRowHeight(64 * screenscale)
|
||
|
|
||
|
return list
|
||
|
end
|
||
|
|
||
|
local subcats = GAMEMODE.ItemSubCategories
|
||
|
local tbn
|
||
|
for j = 1, #subcats do
|
||
|
local ispacer = ((j-1) % 3)+1
|
||
|
|
||
|
tbn = EasyButton(tabpane, subcats[j], 8, 4)
|
||
|
tbn:SetFont("ZSHUDFontSmallest")
|
||
|
tbn:SetAlpha(j == 1 and 255 or 70)
|
||
|
tbn:AlignRight(800 * screenscale - (ispacer - 1) * 190 * screenscale)
|
||
|
tbn:AlignTop(j <= 3 and 0 or 28)
|
||
|
tbn:SizeToContents()
|
||
|
tbn.DoClick = function(me)
|
||
|
for k, v in pairs(tabpane.Grids) do
|
||
|
v:SetVisible(k == j)
|
||
|
tabpane.Buttons[k]:SetAlpha(k == j and 255 or 70)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
tabpane.Grids[j] = mkgrid()
|
||
|
tabpane.Grids[j]:SetVisible(j == 1)
|
||
|
tabpane.Buttons[j] = tbn
|
||
|
end
|
||
|
|
||
|
for j, tab in ipairs(GAMEMODE.Items) do
|
||
|
if tab.PointShop and tab.Category == ITEMCAT_TRINKETS then
|
||
|
self:AddShopItem(tabpane.Grids[tab.SubCategory], j, tab, false, true)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
local list = vgui.Create("DGrid", curframe)
|
||
|
list:SetPos(0, 0)
|
||
|
list:SetSize(curframe:GetWide() - 312, curframe:GetTall())
|
||
|
list:SetCols(3)
|
||
|
list:SetColWide(290 * screenscale)
|
||
|
list:SetRowHeight(100 * screenscale)
|
||
|
|
||
|
list:SetPos(8, 16)
|
||
|
list:SetWide(ammoframe:GetWide() - 16)
|
||
|
list:SetTall(ammoframe:GetTall() - 32)
|
||
|
|
||
|
for j, tab in ipairs(GAMEMODE.Items) do
|
||
|
if tab.PointShop and tab.Category == ITEMCAT_AMMO or tab.CanMakeFromScrap then
|
||
|
self:AddShopItem(list, j, tab, false, true)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
frame.m_SubProp = subpropertysheet
|
||
|
|
||
|
self:CreateItemInfoViewer(trinketsframe, frame, topspace, bottomspace, MENU_REMANTLER)
|
||
|
|
||
|
local scroller = remprop:GetChildren()[1]
|
||
|
local dragbase = scroller:GetChildren()[1]
|
||
|
local tabs = dragbase:GetChildren()
|
||
|
|
||
|
self:ConfigureMenuTabs(tabs, tabhei)
|
||
|
|
||
|
local contents = EasyLabel(remantleframe, gtbl and gtbl.PrintName or "EMPTY", "ZSHUDFontSmall", COLOR_WHITE)
|
||
|
contents:AlignTop(16 * screenscale)
|
||
|
contents:CenterHorizontal()
|
||
|
frame.m_ContentsLabel = contents
|
||
|
|
||
|
local upgpathf = vgui.Create("DPanel", remantleframe)
|
||
|
upgpathf:SetSize(wid - 16, remantleframe:GetTall() / 1.75)
|
||
|
upgpathf:MoveBelow(contents, 24 * screenscale)
|
||
|
upgpathf:CenterHorizontal()
|
||
|
|
||
|
frame.RemantlePath = vgui.Create("ZSRemantlePath", upgpathf)
|
||
|
|
||
|
local disabtn = EasyButton(remantleframe, "Dismantle Weapon", 8, 4)
|
||
|
disabtn:SetFont("ZSHUDFont")
|
||
|
disabtn:SizeToContents()
|
||
|
disabtn:MoveBelow(upgpathf, 32 * screenscale)
|
||
|
disabtn:CenterHorizontal()
|
||
|
disabtn.DoClick = DismantleClick
|
||
|
if not gtbl then
|
||
|
disabtn:SetDisabled(true)
|
||
|
else
|
||
|
disabtn:SetDisabled(gtbl.NoDismantle)
|
||
|
end
|
||
|
disabtn:SetTextColor(gtbl and gtbl.NoDismantle and COLOR_DARKGRAY or gtbl and COLOR_WHITE or COLOR_DARKGRAY)
|
||
|
frame.m_DisaButton = disabtn
|
||
|
|
||
|
local disscraptxt = ""
|
||
|
if gtbl then
|
||
|
local retscrap = self:GetDismantleScrap(gtbl, SelectedInv())
|
||
|
disscraptxt = gtbl.NoDismantle and "Cannot Dismantle" or "Dismantle for " .. retscrap .. " Scrap"
|
||
|
end
|
||
|
|
||
|
local disscrap = EasyLabel(remantleframe, disscraptxt, "ZSHUDFontSmaller", COLOR_WHITE)
|
||
|
disscrap:MoveBelow(disabtn, 4 * screenscale)
|
||
|
disscrap:CenterHorizontal()
|
||
|
frame.m_Dismantle = disscrap
|
||
|
|
||
|
local breakdowns = self.Breakdowns[frame.m_WepClass]
|
||
|
local compdistxt = breakdowns and self.ZSInventoryItemData[breakdowns.Result].PrintName or ""
|
||
|
|
||
|
local compdisl = EasyLabel(remantleframe, compdistxt, "ZSHUDFontSmaller", COLOR_WHITE)
|
||
|
compdisl:MoveBelow(disscrap, 4 * screenscale)
|
||
|
compdisl:CenterHorizontal()
|
||
|
frame.m_ComponentDis = compdisl
|
||
|
|
||
|
frame:MakePopup()
|
||
|
frame:CenterMouse()
|
||
|
end
|