Last active
November 23, 2022 04:22
-
-
Save BazZziliuS/fc79e4807127da2d76b2e16ac0fd2cff to your computer and use it in GitHub Desktop.
Работает с версией igs 221122
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
IGS.sh("utf8.lua") | |
if SERVER then | |
resource.AddWorkshop("2874026722") -- иконки | |
return | |
end | |
if not default_matex then | |
default_matex = matex.url(IGS.C.DefaultIcon) | |
end | |
utf8.len = string.utf8len | |
local function pX(a) | |
return a / 1920 * ScrW() | |
end // Главная штучка, чтобы перенести это без лишнего труда с картинки в код. | |
/* Шрифты и материалы */ | |
surface.CreateFont('NM.Tab', { | |
font = 'PT Root UI Bold', | |
size = pX(20), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.TabSmall', { | |
font = 'PT Root UI Bold', | |
size = pX(18), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.Category', { | |
font = 'PT Root UI Bold', | |
size = pX(28), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ItemPurchased', { | |
font = 'PT Root UI Bold', | |
size = pX(10), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ItemName', { | |
font = 'PT Root UI Bold', | |
size = pX(20), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ItemPrice', { | |
font = 'PT Root UI Bold', | |
size = pX(18), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ItemOldPrice', { | |
font = 'PT Root UI Bold', | |
size = pX(14), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ItemDesc', { | |
font = 'PT Root UI Medium', | |
size = pX(14), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.OpenedDesc', { | |
font = 'PT Root UI Bold', | |
size = pX(20), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.OpenedText', { | |
font = 'PT Root UI', | |
size = pX(16), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.TopPanel', { | |
font = 'PT Root UI Medium', | |
size = pX(16), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.Table', { | |
font = 'PT Root UI Bold', | |
size = pX(16), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.LastDate', { | |
font = 'PT Root UI', | |
size = pX(17), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.LastSum', { | |
font = 'PT Root UI Bold', | |
size = pX(22), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ProfileName', { | |
font = 'PT Root UI Bold', | |
size = pX(16), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ProfileSID', { | |
font = 'PT Root UI', | |
size = pX(16), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.ProfileDonate', { | |
font = 'PT Root UI Bold', | |
size = pX(14), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.Buttons', { | |
font = 'PT Root UI Medium', | |
size = pX(18), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.TYText', { | |
font = 'PT Root UI Bold', | |
size = pX(26), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.LogText', { | |
font = 'PT Root UI', | |
size = pX(18), | |
antialias = true, | |
extended = true | |
}) | |
surface.CreateFont('NM.DonateButton', { | |
font = 'PT Root UI Medium', | |
size = pX(18), | |
antialias = true, | |
extended = true | |
}) | |
local function matsmooth(mat) | |
return Material(mat, 'smooth') | |
end | |
local close_mat = matsmooth('hrp/gui/donate/close.png') | |
local shop_mat = matsmooth('hrp/gui/donate/shop.png') | |
local shop_unactive_mat = matsmooth('hrp/gui/donate/shop_unactive.png') | |
local profile_mat = matsmooth('hrp/gui/donate/profile.png') | |
local profile_unactive_mat = matsmooth('hrp/gui/donate/profile_unactive.png') | |
local go_mat = matsmooth('hrp/gui/donate/go.png') | |
local grad_mat = matsmooth('hrp/gui/donate/grad.png') | |
local buy_mat = matsmooth('hrp/gui/donate/buy.png') | |
local heart_mat = matsmooth('hrp/gui/donate/heart.png') | |
local coupon_mat = matsmooth('hrp/gui/donate/coupon.png') | |
/* Полезные функции */ | |
NM = {} | |
NM.Tabs = { | |
['shop'] = { | |
ID = 1, | |
Name = 'Услуги', | |
Mats = {shop_mat, shop_unactive_mat} | |
}, | |
['profile'] = { | |
ID = 2, | |
Name = 'Профиль', | |
Mats = {profile_mat, profile_unactive_mat} | |
} | |
} | |
// Тут понятен формат, нужно делать VGUI, с приставкой nm_ (vgui.Register) | |
if IGS.C.Inv_Enabled then | |
NM.Tabs["inventory"] = { | |
ID = 3, | |
Name = "Инвентарь", | |
Mats = {shop_mat, shop_unactive_mat} | |
} | |
end | |
NM.OpenFirstTab = "shop" | |
NM.Buttons = { | |
['profile_purchases'] = { | |
ID = 1, | |
Name = 'Покупки' | |
}, | |
['profile_donate'] = { | |
ID = 2, | |
Name = 'Пополнить баланс' | |
} | |
} // Тут так же само | |
NM.PathToRefill = { | |
[1] = 'profile', | |
[2] = 'profile_donate' | |
} // Легкий путь к пополнению счета (1 - Tab, 2 - Button) | |
function NM.CreateUI(t, f, p) | |
local parent | |
if (not isfunction(f)) and (f ~= nil) then | |
parent = f | |
elseif not isfunction(p) and (p ~= nil) then | |
parent = p | |
end | |
local v = vgui.Create(t, parent) | |
if isfunction(f) then | |
f(v, parent) | |
elseif isfunction(p) then | |
p(v, f) | |
end | |
return v | |
end // Облегчает работу | |
local tabfr | |
function NM.OpenTab(tab, frame) | |
if IsValid(tabfr) then | |
tabfr:Remove() | |
end | |
tabfr = NM.CreateUI('nm_' .. tab, function(self) | |
self:SetSize(pX(978), pX(530) - pX(54)) | |
self:SetPos(0, pX(54)) | |
end, frame) | |
end | |
local btnfr | |
function NM.OpenButton(btn, frame) | |
if IsValid(btnfr) then | |
btnfr:Remove() | |
end | |
btnfr = NM.CreateUI('nm_' .. btn, function(self) | |
self:SetSize(pX(781), pX(530) - pX(54)) | |
self:SetPos(0, 0) | |
end, frame) | |
end | |
function NM.GetItems() | |
local allcats = {} | |
for k, v in pairs(IGS.GetItems()) do | |
if k ~= 0 and v.hidden ~= true and not allcats[v.category or 'Разное'] then | |
allcats[v.category or 'Разное'] = true | |
end | |
end | |
return allcats | |
end | |
function NM.FancyTerm(item) | |
local term = IGS.TermToStr(item) | |
if term == "бесконечно" then | |
return "Навсегда" | |
elseif term == "единоразово" then | |
return "Одноразово" | |
else | |
return "На " .. term | |
end | |
end | |
/* Меню */ | |
local fr | |
function NM.Menu() | |
if IsValid(fr) then | |
fr:Close() | |
return | |
end | |
local w, h = pX(978), pX(530) | |
fr = NM.CreateUI('DFrame', function(self) | |
self.lblTitle:SetText('') | |
self:SetSize(w, h) | |
self:MakePopup() | |
self:Center() | |
self.btnMaxim:SetVisible(false) | |
self.btnMinim:SetVisible(false) | |
function self:Paint(w, h) | |
draw.RoundedBox(8, 0, 0, w, h, Color(31, 31, 31)) | |
draw.RoundedBoxEx(8, 0, self:GetTitleHeight(), pX(781), pX(476), Color(47, 47, 47), false, false, true) | |
draw.RoundedBoxEx(8, w - pX(85), self:GetTitleHeight() / 2 - pX(11), pX(22), pX(22), Color(35, 108, 0), false, true, false, true) | |
draw.SimpleText('+', 'NM.TopPanel', w - pX(74), self:GetTitleHeight() / 2, Color(255, 255, 255), 1, 1) | |
draw.RoundedBoxEx(8, w - pX(147), self:GetTitleHeight() / 2 - pX(11), pX(62), pX(22), Color(55, 55, 55), true, false, true, false) | |
draw.SimpleText(string.Comma(LocalPlayer():IGSFunds()) .. ' ₽', 'NM.TopPanel', w - pX(116), self:GetTitleHeight() / 2, Color(255, 255, 255), 1, 1) | |
draw.RoundedBox(0, 0, self:GetTitleHeight(), w, 1, Color(47, 47, 47)) | |
end | |
function self:GetTitleHeight() | |
return pX(54) | |
end | |
local cbtn = pX(17) | |
function self.btnClose:Paint(w, h) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.SetMaterial(close_mat) | |
surface.DrawTexturedRect(0, 0, cbtn, cbtn) | |
end | |
function self:PerformLayout() | |
self.btnClose:SetPos(self:GetWide() - pX(28) - cbtn, self:GetTitleHeight() / 2 - cbtn / 2) | |
self.btnClose:SetSize(cbtn, cbtn) | |
end | |
function self:SwitchTab(tab) | |
self.ActiveTab = NM.Tabs[tab] | |
self.OpenedTab = NM.OpenTab(tab, self) | |
end | |
-- local tab = next(NM.Tabs) | |
self:SwitchTab(NM.OpenFirstTab) | |
end) | |
NM.CreateUI('DButton', function(self) | |
self:SetText('') | |
self:SetSize(pX(22), pX(22)) | |
self:SetPos(w - pX(85), fr:GetTitleHeight() / 2 - pX(11)) | |
self.DoClick = function() | |
fr:SwitchTab(NM.PathToRefill[1]) | |
tabfr:SwitchButton(NM.PathToRefill[2]) | |
end | |
self.Paint = function() end | |
end, fr) | |
local textx, texty, iconx, iconwh, iconwhun = pX(54), fr:GetTitleHeight() / 2, pX(16), pX(26), pX(22) | |
for k, v in pairs(NM.Tabs) do | |
NM.CreateUI('DButton', function(self) | |
self:SetText('') | |
self:SetSize(pX(223), fr:GetTitleHeight()) | |
self:SetPos(pX(29) + pX(237 * (v.ID - 1)), 0) | |
self.Tab = k | |
self.DoClick = function(self) | |
if fr.ActiveTab == NM.Tabs[self.Tab] then return end | |
fr:SwitchTab(self.Tab) | |
end | |
function self:Paint(w, h) | |
if fr.ActiveTab == NM.Tabs[self.Tab] then | |
draw.RoundedBoxEx(8, 0, 0, w, h, Color(62, 62, 62), true, true) | |
draw.SimpleText(v.Name, 'NM.Tab', textx, texty, Color(200, 200, 200), 0, 1) | |
surface.SetDrawColor(255, 255, 255) | |
surface.SetMaterial(v.Mats[1]) | |
surface.DrawTexturedRect(iconx, texty - iconwh / 2, iconwh, iconwh) | |
else | |
draw.RoundedBoxEx(8, 0, h * .17, w, h * .83, Color(55, 55, 55), true, true) | |
draw.SimpleText(v.Name, 'NM.TabSmall', textx - pX(4), texty + h * .085, Color(105, 105, 105), 0, 1) | |
surface.SetDrawColor(255, 255, 255) | |
surface.SetMaterial(v.Mats[2]) | |
surface.DrawTexturedRect(iconx, texty - iconwhun / 2 + h * .085, iconwhun, iconwhun) | |
end | |
end | |
end, fr) | |
end | |
end | |
/* Тут дальше VGUI */ | |
/* Для магазина */ | |
local PANEL = {} | |
function PANEL:Init() | |
self.parent = self:GetParent() | |
self.scrollButton = vgui.Create('Panel', self) | |
self.scrollButton.OnMousePressed = function(s, mb) | |
if (mb == MOUSE_LEFT and not self:GetParent().ShouldHideScrollbar) then | |
local _, my = s:CursorPos() | |
s.scrolling = true | |
s.mouseOffset = my | |
end | |
end | |
self.scrollButton.OnMouseReleased = function(s, mb) | |
if (mb == MOUSE_LEFT) then | |
s.scrolling = false | |
s.mouseOffset = nil | |
end | |
end | |
self.height = 0 | |
end | |
function PANEL:Think() | |
if (self.scrollButton.scrolling) then | |
if (not input.IsMouseDown(MOUSE_LEFT)) then | |
self.scrollButton:OnMouseReleased(MOUSE_LEFT) | |
return | |
end | |
local mx, my = self.scrollButton:CursorPos() | |
local diff = my - self.scrollButton.mouseOffset | |
local maxOffset = self.parent:GetCanvas():GetTall() - self.parent:GetTall() | |
local perc = (self.scrollButton.y + diff) / (self:GetTall() - self.height) | |
self.parent.yOffset = math.Clamp(perc * maxOffset, 0, maxOffset) | |
self.parent:InvalidateLayout() | |
end | |
end | |
function PANEL:PerformLayout() | |
local maxOffset = self.parent:GetCanvas():GetTall() - self.parent:GetTall() | |
self:SetSize(2, self.parent:GetTall()) | |
self:SetPos(self.parent:GetWide() - self:GetWide(), 0) | |
self.heightRatio = self.parent:GetTall() / self.parent:GetCanvas():GetTall() | |
self.height = math.Clamp(math.ceil(self.heightRatio * self.parent:GetTall()), 20, math.huge) | |
self.scrollButton:SetSize(self:GetWide(), self.height) | |
self.scrollButton:SetPos(0, math.Clamp((self.parent.yOffset / maxOffset), 0, 1) * (self:GetTall() - self.height)) | |
end | |
function PANEL:Paint(w, h) | |
if (self:GetParent().ShouldHideScrollbar) then return end | |
derma.SkinHook('Paint', 'UIScrollBar', self, w, h) | |
end | |
function PANEL:OnMouseWheeled(delta) | |
self.parent:OnMouseWheeled(delta) | |
end | |
vgui.Register('nm_scrollbar', PANEL, 'Panel') | |
PANEL = {} | |
function PANEL:Init() | |
self.contentContainer = vgui.Create('Panel', self) | |
self.scrollBar = vgui.Create('nm_scrollbar', self) | |
self.yOffset = 0 | |
self.ySpeed = 0 | |
self.scrollSize = 4 | |
self.SpaceTop = 0 | |
self.Padding = 0 | |
function self.contentContainer:OnChildRemoved(child) | |
self:GetParent():PerformLayout() | |
end | |
end | |
function PANEL:Reset() | |
self:GetCanvas():Clear(true) | |
self.yOffset = 0 | |
self.ySpeed = 0 | |
self.scrollSize = 1 | |
self:PerformLayout() | |
end | |
function PANEL:AddItem(child) | |
child:SetParent(self:GetCanvas()) | |
self:PerformLayout() | |
end | |
function PANEL:SetSpacing(i) | |
self.SpaceTop = i | |
end | |
function PANEL:SetPadding(i) | |
self.Padding = i | |
end | |
function PANEL:GetCanvas() | |
return self.contentContainer | |
end | |
function PANEL:SetScrollSize(int) | |
self.scrollSize = int | |
end | |
function PANEL:ScrollTo(y) | |
self.yOffset = y | |
self:InvalidateLayout() | |
end | |
function PANEL:OnMouseWheeled(delta) | |
if ((delta > 0 and self.ySpeed < 0) or (delta < 0 and self.ySpeed > 0)) then | |
self.ySpeed = 0 | |
else | |
self.ySpeed = self.ySpeed + (delta * self.scrollSize) | |
end | |
self:PerformLayout() | |
end | |
function PANEL:SetOffset(offSet) | |
local maxOffset = (self:GetCanvas():GetTall() - self:GetTall()) | |
if (maxOffset < 0) then | |
maxOffset = 0 | |
end | |
self.yOffset = math.Clamp(offSet, 0, maxOffset) | |
self:PerformLayout() | |
if (self.yOffset == 0 or self.yOffset == maxOffset) then return true end | |
end | |
function PANEL:Think() | |
if (self.ySpeed ~= 0) then | |
if (self:SetOffset(self.yOffset - self.ySpeed)) then | |
self.ySpeed = 0 | |
else | |
if (self.ySpeed < 0) then | |
self.ySpeed = math.Clamp(self.ySpeed + (FrameTime() * self.scrollSize * 4), self.ySpeed, 0) | |
else | |
self.ySpeed = math.Clamp(self.ySpeed - (FrameTime() * self.scrollSize * 4), 0, self.ySpeed) | |
end | |
end | |
end | |
end | |
function PANEL:PerformLayout() | |
local canvas = self:GetCanvas() | |
if (canvas:GetWide() ~= self:GetWide()) then | |
canvas:SetWide(self:GetWide()) | |
end | |
local y = 0 | |
local lastChild | |
for k, v in ipairs(canvas:GetChildren()) do | |
local childY = y + self.SpaceTop | |
if (v.x ~= self.Padding or v.y ~= childY) then | |
v:SetPos(math.max(0, self.Padding), y + self.SpaceTop) | |
end | |
if (v:GetWide() ~= self:GetWide() - self.Padding * 2) then | |
v:SetWide(math.min(self:GetWide(), self:GetWide() - self.Padding * 2)) | |
end | |
y = v.y + v:GetTall() + self.SpaceTop + self.Padding | |
lastChild = v | |
end | |
y = lastChild and lastChild.y + lastChild:GetTall() or y | |
if (canvas:GetTall() ~= y) then | |
canvas:SetTall(y) | |
end | |
if (canvas:GetTall() <= self:GetTall() and self.scrollBar:IsVisible()) then | |
canvas:SetTall(self:GetTall()) | |
self.scrollBar:SetVisible(false) | |
elseif (canvas:GetTall() > self:GetTall() and not self.scrollBar:IsVisible()) then | |
self.scrollBar:SetVisible(true) | |
end | |
local maxOffset = (self:GetCanvas():GetTall() - self:GetTall()) | |
if (self.yOffset > maxOffset) then | |
self.yOffset = maxOffset | |
end | |
if (self.yOffset < 0) then | |
self.yOffset = 0 | |
end | |
if (canvas.x ~= 0 or canvas.y ~= -self.yOffset) then | |
canvas:SetPos(0, -self.yOffset) | |
self.scrollBar:InvalidateLayout() | |
end | |
end | |
function PANEL:IsAtMaxOffset() | |
local maxOffset = math.Clamp(self:GetCanvas():GetTall() - self:GetTall(), 0, math.huge) | |
return self.yOffset == maxOffset | |
end | |
function PANEL:Paint(w, h) | |
end | |
function PANEL:HideScrollbar(bool) | |
self.ShouldHideScrollbar = bool | |
end | |
function PANEL:DockToFrame() | |
local p = self:GetParent() | |
local x, y = p:GetDockPos() | |
self:SetPos(x, y) | |
self:SetSize(p:GetWide() - 10, p:GetTall() - (y + 5)) | |
end | |
vgui.Register('nm_scrollpanel', PANEL, 'Panel') | |
PANEL = {} | |
function PANEL:Init() | |
self.Rows = {} | |
self.HideInvisible = true | |
self.RowHeight = 25 | |
self:SetPadding(-1) | |
self.scrollBar.Paint = function(s, w, h) | |
draw.RoundedBox(0, 0, s.scrollButton.y, w, s.height, Color(255, 255, 255)) | |
end | |
end | |
function PANEL:SetRowHeight(height) | |
self.RowHeight = height | |
end | |
function PANEL:AddCustomRow(row, disabled) | |
self:AddItem(row) | |
self.Rows[#self.Rows + 1] = row | |
return row | |
end | |
function PANEL:AddRow(value, disabled) | |
local row = NM.CreateUI('DButton', function(s) | |
s:SetText('') | |
s:SetTall(self.RowHeight) | |
if (disabled == true) then | |
s:SetDisabled(true) | |
end | |
s.Paint = function(s, w, h) | |
draw.SimpleText(tostring(value), 'NM.Category', pX(29), h / 2, Color(255, 255, 255, 255), 0, 1) | |
end | |
end) | |
self:AddItem(row) | |
self.Rows[#self.Rows + 1] = row | |
row.DoClick = function() | |
row.Active = true | |
if IsValid(self.Selected) then | |
self.Selected.Active = false | |
end | |
self.Selected = row | |
end | |
return row | |
end | |
function PANEL:AddSpacer(value) | |
return self:AddRow(value, true) | |
end | |
function PANEL:GetSelected() | |
return self.Selected | |
end | |
vgui.Register('nm_listview', PANEL, 'nm_scrollpanel') | |
PANEL = {} | |
function PANEL:Init() | |
self:SetText('') | |
self.ButtonBuy = NM.CreateUI('DButton', self) | |
self.ModelIcon = NM.CreateUI('DModelPanel', self) | |
end | |
function PANEL:PerformLayout() | |
local btnwh = pX(25) | |
self.ButtonBuy:SetPos(self:GetWide() - pX(12) - btnwh, self:GetTall() - btnwh - pX(12)) | |
self.ButtonBuy:SetSize(btnwh, btnwh) | |
self.ButtonBuy:SetText('') | |
self.ButtonBuy.Paint = function(s, w, h) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.SetMaterial(buy_mat) | |
surface.DrawTexturedRect(0, 0, w, h) | |
end | |
local iconwh = pX(80) | |
self.ModelIcon:SetPos(self:GetWide() / 2 - iconwh / 2, pX(6)) | |
self.ModelIcon:SetSize(iconwh, iconwh) | |
end | |
function PANEL:Paint(w, h) | |
draw.RoundedBox(8, 0, 0, w, h, self.MainFrame.ActiveItem == self.Item and Color(223, 223, 223) or Color(68, 68, 68)) | |
draw.RoundedBox(8, 1, 1, w - 2, h - 2, Color(55, 55, 55)) | |
local item = IGS.GetItem(self.Item) | |
local name = item.name | |
if utf8.len(name) > 16 then | |
name = utf8.sub(name, 0, 14) .. '...' | |
end | |
draw.SimpleText(name, 'NM.ItemName', pX(16), h - pX(60), Color(255, 255, 255), 0, 4) | |
local tw, th = draw.SimpleText('Открыть описание', 'NM.ItemDesc', pX(16), h - pX(45), Color(105, 105, 105), 0, 4) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.SetMaterial(go_mat) | |
surface.DrawTexturedRect(pX(16) + tw + pX(10), h - pX(45) - th / 2 - pX(1), pX(4), pX(6)) | |
if item.discounted_from then | |
tw, th = draw.SimpleText(item.discounted_from .. ' ₽', 'NM.ItemOldPrice', pX(16), h - pX(30), Color(105, 105, 105), 0, 4) | |
local liney = h - pX(34) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.DrawLine(pX(16), liney - th * .5, pX(16) + tw, liney) | |
end | |
draw.SimpleText(item.price .. ' ₽', 'NM.ItemPrice', pX(16), h - pX(16), Color(255, 255, 255), 0, 4) | |
if item.icon and not item.icon.isModel then | |
surface.SetDrawColor(255, 255, 255, 255) | |
local icons = matex.url(item.icon.icon) | |
local mater = (icons and icons.material) or (default_matex and default_matex.material) | |
surface.SetMaterial(mater or close_mat) | |
local iconwh = pX(80) | |
surface.DrawTexturedRect(w / 2 - iconwh / 2, pX(6), iconwh, iconwh) | |
surface.SetDrawColor(255, 255, 255, 180) | |
surface.SetMaterial(grad_mat) | |
surface.DrawTexturedRect(pX(1), pX(12), w - pX(2), iconwh) | |
end | |
end | |
function PANEL:SetInfo(uid, frame) | |
self.Item = uid | |
self.MainFrame = frame | |
self.DoClick = function() | |
frame:OpenItem(uid) | |
end | |
local item = IGS.GetItem(self.Item) | |
self.ButtonBuy.DoClick = function() | |
IGS.BoolRequest('Подтверждение покупки', 'Вы действительно хотите купить ' .. item.name .. '?', function(a) | |
if a then | |
frame:BuyItem(uid) | |
end | |
end) | |
end | |
self.ModelIcon.DoClick = function() | |
frame:OpenItem(uid) | |
end | |
if item.icon and not item.icon.isModel then | |
-- texture.Create(item.uid):Download(item.icon.icon) | |
local icons = matex.url(item.icon.icon) | |
self.ModelIcon:SetVisible(false) | |
elseif item.icon and item.icon.isModel then | |
self.ModelIcon:SetVisible(true) | |
self.ModelIcon:SetModel(item.icon.icon) | |
local mn, mx = self.ModelIcon.Entity:GetRenderBounds() | |
local size = 0 | |
size = math.max(size, math.abs(mn.x) + math.abs(mx.x)) | |
size = math.max(size, math.abs(mn.y) + math.abs(mx.y)) | |
size = math.max(size, math.abs(mn.z) + math.abs(mx.z)) | |
self.ModelIcon:SetFOV(30) | |
self.ModelIcon:SetCamPos(Vector(size, size, size)) | |
self.ModelIcon:SetLookAt((mn + mx) * 0.5) | |
end | |
end | |
vgui.Register('nm_shop_button', PANEL, 'DButton') | |
PANEL = {} | |
local btnwh = pX(168) | |
function PANEL:PerformLayout() | |
local c = 0 | |
local o = 0 | |
for k, v in ipairs(self:GetChildren()) do | |
v:SetPos(pX(29) + (o * (btnwh + pX(20))), c * (btnwh + pX(20))) | |
v:SetSize(btnwh, btnwh) | |
if k % 4 == 1 then | |
o = 1 | |
elseif k % 4 == 2 then | |
o = 2 | |
elseif k % 4 == 3 then | |
o = 3 | |
elseif k % 4 == 0 then | |
c = c + 1 | |
o = 0 | |
end | |
end | |
end | |
function PANEL:AddItem(uid, frame) | |
local btn = NM.CreateUI('nm_shop_button', self) | |
btn:SetInfo(uid, frame) | |
self:SetTall(math.ceil(#self:GetChildren() * (1 / 4)) * btnwh + math.ceil(#self:GetChildren() * (pX(20) / 4))) | |
end | |
vgui.Register('nm_shop_category', PANEL, 'Panel') | |
/* Магазин */ | |
PANEL = {} | |
function PANEL:Init() | |
local cat | |
self.Cats = {} | |
self.List = NM.CreateUI('nm_listview', self) | |
self.List.Paint = function() end | |
for catitem, _ in pairs(NM.GetItems()) do | |
self.List:AddSpacer(catitem):SetTall(pX(72)) | |
cat = NM.CreateUI('nm_shop_category') | |
for k, v in pairs(IGS.GetItems()) do | |
v.category = v.category or 'Разное' | |
if k ~= 0 and v.hidden ~= true and v.category == catitem then | |
cat:AddItem(k, self) | |
end | |
end | |
self.List:AddItem(cat) | |
end | |
self:OpenItem(1) | |
end | |
function PANEL:PerformLayout() | |
self.List:SetPos(0, 0) | |
self.List:SetSize(self:GetWide() - pX(197), self:GetTall()) | |
end | |
function PANEL:OpenItem(uid) | |
if self.ActiveItem == uid then return end | |
self.ActiveItem = uid | |
if IsValid(self.OpenedItem) then | |
self.OpenedItem:Remove() | |
self.OpenedItemInfo:Remove() | |
self.OpenedItemInfo.Scroll:Remove() | |
end | |
self.OpenedItem = NM.CreateUI('nm_shop_button', self) | |
self.OpenedItem:SetInfo(uid, self) | |
self.OpenedItem:SetPos(pX(978) - pX(14) - btnwh, pX(14)) | |
self.OpenedItem:SetSize(btnwh, btnwh) | |
local item = IGS.GetItem(uid) | |
self.OpenedItem.Paint = function(s, w, h) | |
draw.RoundedBox(8, 0, 0, w, h, Color(68, 68, 68)) | |
draw.RoundedBox(8, 1, 1, w - 2, h - 2, Color(55, 55, 55)) | |
local name = item.name | |
if utf8.len(name) > 16 then | |
name = utf8.sub(name, 0, 14) .. '...' | |
end | |
if s.Purchased then | |
draw.SimpleText('Куплено: ' .. s.Purchased, 'NM.ItemPurchased', w / 2, h - pX(160), Color(255, 255, 255), 1, 1) | |
end | |
draw.SimpleText(name, 'NM.ItemName', pX(16), h - pX(60), Color(255, 255, 255), 0, 4) | |
draw.SimpleText('Действует ' .. IGS.TermToStr(item:Term()), 'NM.ItemDesc', pX(16), h - pX(45), Color(105, 105, 105), 0, 4) | |
if item.discounted_from then | |
tw, th = draw.SimpleText(item.discounted_from .. ' ₽', 'NM.ItemOldPrice', pX(16), h - pX(30), Color(105, 105, 105), 0, 4) | |
local liney = h - pX(34) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.DrawLine(pX(16), liney - th * .5, pX(16) + tw, liney) | |
end | |
draw.SimpleText(item.price .. ' ₽', 'NM.ItemPrice', pX(16), h - pX(16), Color(255, 255, 255), 0, 4) | |
if item.icon and not item.icon.isModel then | |
surface.SetDrawColor(255, 255, 255, 255) | |
local icons = matex.url(item.icon.icon) | |
local mater = (icons and icons.material) or (default_matex and default_matex.material) | |
surface.SetMaterial(mater or close_mat) | |
local iconwh = pX(80) | |
surface.DrawTexturedRect(w / 2 - iconwh / 2, pX(6), iconwh, iconwh) | |
surface.SetDrawColor(255, 255, 255, 180) | |
surface.SetMaterial(grad_mat) | |
surface.DrawTexturedRect(pX(1), pX(12), w - pX(2), iconwh) | |
end | |
end | |
self.OpenedItemInfo = NM.CreateUI('DPanel', self) | |
self.OpenedItemInfo:SetText('') | |
local oifw, oifh = pX(197), pX(280) | |
self.OpenedItemInfo:SetPos(pX(978) - oifw, pX(530) - pX(54) - oifh) | |
self.OpenedItemInfo:SetSize(oifw, oifh) | |
self.OpenedItemInfo.Paint = function(s, w, h) | |
draw.RoundedBox(0, 0, 1, w, 1, Color(58, 58, 58)) | |
draw.SimpleText('Описание', 'NM.OpenedDesc', pX(14), pX(14), Color(134, 134, 134)) | |
end | |
self.OpenedItemInfo.Scroll = NM.CreateUI('nm_listview', self) | |
self.OpenedItemInfo.Scroll:SetPos(pX(978) - oifw + pX(14), pX(530) - pX(10) - oifh) | |
self.OpenedItemInfo.Scroll:SetSize(oifw - pX(28), oifh - pX(60)) | |
self.OpenedItemInfo.Scroll.Paint = function() end | |
local txt = string.Wrap('NM.OpenedText', item.description, self.OpenedItemInfo.Scroll:GetWide()) | |
for k, v in ipairs(txt) do | |
local lbl = NM.CreateUI('DLabel', function(s, p) | |
s:SetText(v) | |
s:SetFont('NM.OpenedText') | |
s:SizeToContents() | |
end) | |
self.OpenedItemInfo.Scroll:AddItem(lbl) | |
end | |
if (item.swep and LocalPlayer():HasPurchase(item:UID())) then | |
self.OpenedItemInfo.CheckBox = NM.CreateUI('DCheckBox', self.OpenedItem) | |
self.OpenedItemInfo.CheckBox:Dock(TOP) | |
self.OpenedItemInfo.CheckBox:DockMargin(0,5,0,0) | |
self.OpenedItemInfo.CheckBox:SetTall(pX(20)) | |
local should_give = LocalPlayer():GetNWBool("igs.gos." .. item:ID()) | |
self.OpenedItemInfo.CheckBox:SetValue(should_give) | |
self.OpenedItemInfo.CheckBox:SetText('') | |
self.OpenedItemInfo.CheckBox.OnChange = function(s, give) | |
net.Start("IGS.GiveOnSpawnWep") | |
net.WriteIGSItem(item) | |
net.WriteBool(give) | |
net.SendToServer() | |
end | |
end | |
end | |
local function purchase(ITEM, msg) | |
IGS.Purchase(ITEM:UID(), function(errMsg, dbID) | |
if errMsg then | |
IGS.ShowNotify(errMsg, 'Ошибка покупки') | |
surface.PlaySound('ambient/voices/citizen_beaten1.wav') | |
return | |
end | |
msg.Purchased = msg.Purchased or 0 | |
msg.Purchased = msg.Purchased + 1 | |
if not ITEM:IsStackable() then | |
if not IGS.C.Inv_Enabled then | |
IGS.ShowNotify('Спасибо за покупку. Это было просто, правда? :)', 'Успешная покупка') | |
return | |
end | |
IGS.BoolRequest('Успешная покупка', 'Спасибо за покупку. Она находится в вашем /donate инвентаре.\n\nАктивировать ее сейчас?', function(yes) | |
if not yes then return end | |
IGS.ProcessActivate(dbID) | |
end) | |
end | |
surface.PlaySound('ambient/office/coinslot1.wav') | |
end) | |
end | |
function PANEL:BuyItem(uid) | |
if self.ActiveItem ~= uid then | |
self:OpenItem(uid) | |
end | |
purchase(IGS.GetItem(uid), self.OpenedItem) | |
end | |
vgui.Register('nm_shop', PANEL, 'Panel') | |
/* Профиль */ | |
PANEL = {} | |
function PANEL:Init() | |
self.Avatar = NM.CreateUI('AvatarImage', function(s) | |
local size = pX(76) | |
s:SetSize(size, size) | |
s:SetPos(pX(844), pX(28)) | |
s:SetPlayer(LocalPlayer(), size) | |
end, self) | |
for k, v in pairs(NM.Buttons) do | |
NM.CreateUI('DButton', function(s) | |
s:SetText('') | |
s:SetSize(pX(167), pX(43)) | |
s:SetPos(pX(796), pX(215) + pX(53 * (v.ID - 1))) | |
s.Button = k | |
s.DoClick = function(s) | |
if self.ActiveButton == NM.Buttons[s.Button] then return end | |
self:SwitchButton(s.Button) | |
end | |
s.Paint = function(s, w, h) | |
if self.ActiveButton == NM.Buttons[s.Button] then | |
draw.RoundedBox(8, 0, 0, w, h, Color(255, 255, 255)) | |
draw.SimpleText(v.Name, 'NM.Buttons', w / 2, h / 2, Color(31, 31, 31), 1, 1) | |
else | |
draw.RoundedBox(8, 0, 0, w, h, Color(255, 255, 255)) | |
draw.RoundedBox(8, pX(1), pX(1), w - pX(2), h - pX(2), Color(31, 31, 31)) | |
draw.SimpleText(v.Name, 'NM.Buttons', w / 2, h / 2, Color(255, 255, 255), 1, 1) | |
end | |
end | |
end, self) | |
end | |
local tab = next(NM.Buttons) | |
self:SwitchButton(tab) | |
end | |
local box1, box2 = pX(167), pX(86) | |
function PANEL:Paint(w, h) | |
local box1pos = w - box1 - pX(15) | |
draw.RoundedBox(8, box1pos, pX(18), box1, box1, Color(47, 47, 47)) | |
draw.RoundedBox(8, box1pos + box2 / 2, pX(23), box2, box2, Color(31, 31, 31)) | |
local lp = LocalPlayer() | |
local textx, texty = w - pX(197) / 2, pX(18) + box2 | |
draw.SimpleText(lp:GetName(), 'NM.ProfileName', textx, texty + pX(10), Color(255, 255, 255), 1, 3) | |
local linew = pX(86) | |
draw.RoundedBox(0, textx - linew / 2, texty + pX(28), linew, 1, Color(58, 58, 58)) | |
draw.SimpleText(lp:SteamID(), 'NM.ProfileSID', textx, texty + pX(30), Color(131, 131, 131), 1, 3) | |
draw.RoundedBox(0, textx - linew / 2, texty + pX(48), linew, 1, Color(58, 58, 58)) | |
draw.SimpleText('Всего пополнено: ' .. string.Comma(IGS.TotalTransaction(lp)) .. ' ₽', 'NM.ProfileDonate', textx, texty + pX(56), Color(255, 255, 255), 1, 3) | |
end | |
function PANEL:SwitchButton(tab) | |
self.ActiveButton = NM.Buttons[tab] | |
self.OpenedButton = NM.OpenButton(tab, self, true) | |
end | |
vgui.Register('nm_profile', PANEL, 'Panel') | |
/* Покупки */ | |
PANEL = {} | |
function PANEL:Init() | |
self.List = NM.CreateUI('nm_listview', self) | |
self.PanelList = NM.CreateUI('DPanel', self) | |
self:GetParent().LastTransactions = {} | |
self.PanelList.Paint = function(s, w, h) | |
draw.RoundedBoxEx(8, 0, 0, pX(703), pX(34), Color(31, 31, 31), true, true) | |
draw.SimpleText('Сервер', 'NM.Table', pX(30), pX(10), Color(105, 105, 105)) | |
draw.SimpleText('Предмет', 'NM.Table', pX(193), pX(10), Color(105, 105, 105)) | |
draw.SimpleText('Куплен', 'NM.Table', pX(359), pX(10), Color(105, 105, 105)) | |
draw.SimpleText('Истечет', 'NM.Table', pX(456), pX(10), Color(105, 105, 105)) | |
draw.SimpleText('Сумма', 'NM.Table', pX(556), pX(10), Color(105, 105, 105)) | |
draw.SimpleText('Баланс', 'NM.Table', pX(638), pX(10), Color(105, 105, 105)) | |
draw.RoundedBoxEx(8, 0, h - pX(17), pX(703), pX(17), Color(31, 31, 31), false, false, true, true) | |
end | |
self.PanelList:SetMouseInputEnabled(false) | |
self.List.Paint = function(s, w, h) | |
draw.RoundedBox(8, 0, 0, w, h, Color(31, 31, 31)) | |
end | |
self.List:AddSpacer(''):SetTall(pX(37)) | |
self.List.scrollBar.Paint = function(s, w, h) | |
draw.RoundedBox(0, 0, s.scrollButton.y, 2, s.height, Color(255, 255, 255)) | |
end | |
local mybal = LocalPlayer():IGSFunds() | |
IGS.GetMyTransactions(function(dat) | |
if not IsValid(self.List) then return end | |
for i, v in ipairs(dat) do | |
v.note = v.note or '-' | |
local function name_or_uid(sUid) | |
local ITEM = IGS.GetItemByUID(sUid) | |
return ITEM.isnull and sUid or ITEM:Name() | |
end | |
if i == #dat then | |
self.List:AddSpacer(''):SetTall(pX(20)) | |
end | |
if v.note:StartWith('A: ') or v.note:StartWith('C: ') then | |
self:GetParent().LastTransactions[#self:GetParent().LastTransactions + 1] = v | |
continue | |
end | |
if not v.note:StartWith('P: ') then continue end | |
mybal = mybal - v.sum | |
local sv_name = IGS.ServerName(v.server) | |
local ITEM = IGS.GetItemByUID(name_or_uid(v.note:sub(4))) | |
local sName = ITEM.isnull and v.note:sub(4) or ITEM:Name() | |
panel = NM.CreateUI('DPanel') | |
panel:SetPos(0, pX(22) * i) | |
panel:SetSize(pX(725), pX(20)) | |
panel.Paint = function(s, w, h) | |
draw.SimpleText(sv_name, 'NM.Table', pX(52), 0, Color(255, 255, 255), 1) | |
draw.SimpleText(sName, 'NM.Table', pX(218), 0, Color(255, 255, 255), 1) | |
draw.SimpleText(IGS.TimestampToDate(v.date) or 'Никогда', 'NM.Table', pX(380), 0, Color(255, 255, 255), 1) | |
draw.SimpleText(ITEM.termin ~= 0 and IGS.TimestampToDate(v.date + ITEM.termin * 86400) or 'Никогда', 'NM.Table', pX(480), 0, Color(255, 255, 255), 1) | |
draw.SimpleText(string.Comma(v.sum) .. ' ₽', 'NM.Table', pX(576), 0, Color(255, 255, 255), 1) | |
draw.SimpleText(string.Comma(mybal) .. ' ₽', 'NM.Table', pX(660), 0, Color(255, 255, 255), 1) | |
end | |
self.List:AddItem(panel) | |
end | |
end) | |
end | |
function PANEL:PerformLayout() | |
self.List:SetSize(pX(725), pX(244)) | |
self.List:SetPos(pX(28), pX(63)) | |
self.PanelList:SetSize(pX(725), pX(244)) | |
self.PanelList:SetPos(pX(28), pX(63)) | |
end | |
function PANEL:Paint(w, h) | |
draw.SimpleText('Последние покупки', 'NM.Category', pX(29), pX(36), Color(255, 255, 255), 0, 1) | |
draw.RoundedBox(0, 0, h - pX(150), w, 1, Color(58, 58, 58)) | |
draw.SimpleText('Ваши последние пополнения', 'NM.Category', pX(29), h - pX(125), Color(255, 255, 255), 0, 1) | |
if self:GetParent().LastTransactions[1] then | |
for k = 1, #self:GetParent().LastTransactions do | |
local v = self:GetParent().LastTransactions[k] | |
local x = pX(29) + ((k - 1) * pX(188)) | |
draw.RoundedBox(8, x, h - pX(100), pX(160), pX(70), Color(31, 31, 31)) | |
draw.RoundedBox(0, x + pX(28), h - pX(64), pX(100), pX(1), Color(49, 49, 49)) | |
draw.SimpleText(os.date('%d.%m.%Y - %H:%M', v.date), 'NM.LastDate', x + pX(80), h - pX(80), Color(255, 255, 255), 1, 1) | |
draw.SimpleText(v.sum .. ' ₽', 'NM.LastSum', x + pX(80), h - pX(48), Color(255, 255, 255), 1, 1) | |
end | |
else | |
draw.SimpleText('Вы еще не пополняли счет, или делали это давно!', 'NM.Category', w / 2, h - pX(70), Color(105, 105, 105), 1, 1) | |
end | |
end | |
vgui.Register('nm_profile_purchases', PANEL, 'Panel') | |
/* Пополнение баланса */ | |
PANEL = {} | |
local function niceSum(i, iFallback) | |
return math.Truncate(tonumber(i) or iFallback, 2) | |
end | |
function PANEL:Init() | |
self.Purchase = NM.CreateUI('DButton', function(s) | |
s:SetText('') | |
s.Text = 'Пополнить баланс на ? рублей' | |
s:SetDisabled(true) | |
s:SetSize(pX(277), pX(43)) | |
s:SetPos(pX(29), pX(236)) | |
s.DoClick = function() | |
local want_money = niceSum(self.EntrySum:GetValue()) | |
if not want_money then | |
self.LogPanel:AddRecord('Указана некорректная сумма пополнения', false) | |
return | |
elseif want_money < IGS.GetMinCharge() then | |
self.LogPanel:AddRecord('Минимальная сумма пополнения ' .. PL_MONEY(IGS.GetMinCharge()), false) | |
return | |
end | |
self.LogPanel:AddRecord('Запрос цифровой подписи запроса от сервера...') | |
IGS.GetPaymentURL(want_money, function(url) | |
IGS.OpenURL(url, 'Процедура пополнения счета') | |
if not IsValid(self) then return end | |
self.LogPanel:AddRecord('Подпись получена. начинаем процесс оплаты') | |
timer.Simple(.7, function() | |
self.LogPanel:AddRecord('Счет пополнится моментально или после перезахода') | |
end) | |
end) | |
end | |
s.Paint = function(s, w, h) | |
draw.RoundedBox(4, 0, 0, w, h, s:GetDisabled() and Color(105, 105, 105) or Color(255, 255, 255)) | |
draw.SimpleText(s.Text, 'NM.DonateButton', w / 2, h / 2, Color(0, 0, 0), 1, 1) | |
end | |
end, self) | |
NM.CreateUI('DButton', function(s) | |
s:SetText('') | |
s:SetSize(pX(43), pX(43)) | |
s:SetPos(pX(318), pX(236)) | |
s.DoClick = function() | |
IGS.WIN.ActivateCoupon() | |
end | |
local matsize = pX(22) | |
s.Paint = function(s, w, h) | |
draw.RoundedBox(4, 0, 0, w, h, Color(255, 255, 255)) | |
draw.RoundedBox(4, pX(1), pX(1), w - pX(2), h - pX(2), Color(47, 47, 47)) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.SetMaterial(coupon_mat) | |
surface.DrawTexturedRect(w / 2 - matsize / 2, h / 2 - matsize / 2, matsize, matsize) | |
end | |
end, self) | |
self.EntrySum = NM.CreateUI('DTextEntry', function(s) | |
s:SetSize(pX(332), pX(43)) | |
s:SetPos(pX(29), pX(185)) | |
s:SetNumeric(true) | |
s.Paint = function(s, w, h) | |
draw.RoundedBox(4, 0, 0, w, h, Color(255, 255, 255)) | |
draw.RoundedBox(4, pX(1), pX(1), w - pX(2), h - pX(2), Color(47, 47, 47)) | |
draw.SimpleText(s:GetValue() == '' and 'Сумма доната' or s:GetValue(), 'NM.LogText', pX(20), h / 2, s:GetValue() == '' and Color(140, 140, 140) or Color(255, 255, 255), 0, 1) | |
end | |
s.Think = function(s) | |
local rub = tonumber(s:GetValue()) or '?' | |
self.Purchase.Text = 'Пополнить баланс на ' .. rub .. ' рублей' | |
self.Purchase:SetDisabled(rub == '?') | |
end | |
end, self) | |
self.LogPanel = NM.CreateUI('nm_listview', function(log) | |
log:SetSize(pX(330), pX(138)) | |
log:SetPos(pX(419), pX(170)) | |
log.Paint = function(s, w, h) end | |
function log:AddRecord(text, pay) | |
local col = (pay == true and IGS.col.LOG_SUCCESS) or (pay == false and IGS.col.LOG_ERROR) or IGS.col.LOG_NORMAL | |
text = '> ' .. os.date('%H:%M:%S', os.time()) .. '\n' .. text | |
local y = pX(2) | |
for i, line in ipairs(string.Wrap('NM.LogText', text, log:GetWide())) do | |
log:AddItem(NM.CreateUI('DLabel', function(l) | |
l:SetPos(0, y) | |
l:SetText(line) | |
l:SetFont('NM.LogText') | |
l:SizeToContents() | |
l:SetTextColor(i == 1 and IGS.col.HIGHLIGHTING or col) | |
y = y + l:GetTall() | |
end, log)) | |
end | |
log:ScrollTo(log:GetCanvas():GetTall()) | |
end | |
end, self) | |
local function log(delay, text, status) | |
timer.Simple(delay, function() | |
if not IsValid(self.LogPanel) then return end | |
self.LogPanel:AddRecord(text, status) | |
end) | |
end | |
log(0, 'Открыт диалог пополнения счета', nil) | |
log(math.random(3), 'Соединение установлено!', true) | |
log(math.random(20, 40), 'Деньги будут зачислены мгновенно и автоматически', nil) | |
end | |
function PANEL:Paint(w, h) | |
draw.RoundedBox(8, pX(29), pX(13), w - pX(58), pX(100), Color(31, 31, 31)) | |
local heartsize = pX(27) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.SetMaterial(heart_mat) | |
surface.DrawTexturedRect(pX(36), pX(24), heartsize, heartsize) | |
local txt = string.Wrap('NM.TYText', ' Все пожертвования материально помогают нам в продвижении и улучшении проекта. Пополняя баланс, вы делаете вклад в будущее наших серверов.', w - pX(58) - pX(11)) | |
for k, v in ipairs(txt) do | |
draw.SimpleText(v, 'NM.TYText', pX(58) - pX(22), pX(25) + pX(25 * (k - 1)), Color(255, 255, 255)) | |
end | |
draw.SimpleText('Пополнение баланса', 'NM.Category', pX(29), pX(145), Color(255, 255, 255), 0, 1) | |
draw.RoundedBox(0, w / 2, h / 2 - pX(90), 1, pX(160), Color(58, 58, 58)) | |
draw.SimpleText('Лог операций', 'NM.Category', pX(419), pX(145), Color(255, 255, 255), 0, 1) | |
draw.RoundedBox(0, 0, h - pX(150), w, 1, Color(58, 58, 58)) | |
draw.SimpleText('Ваши последние пополнения', 'NM.Category', pX(29), h - pX(125), Color(255, 255, 255), 0, 1) | |
if self:GetParent().LastTransactions[1] then | |
for k = 1, #self:GetParent().LastTransactions do | |
local v = self:GetParent().LastTransactions[k] | |
local x = pX(29) + ((k - 1) * pX(188)) | |
draw.RoundedBox(8, x, h - pX(100), pX(160), pX(70), Color(31, 31, 31)) | |
draw.RoundedBox(0, x + pX(28), h - pX(64), pX(100), pX(1), Color(49, 49, 49)) | |
draw.SimpleText(os.date('%d.%m.%Y - %H:%M', v.date), 'NM.LastDate', x + pX(80), h - pX(80), Color(255, 255, 255), 1, 1) | |
draw.SimpleText(v.sum .. ' ₽', 'NM.LastSum', x + pX(80), h - pX(48), Color(255, 255, 255), 1, 1) | |
end | |
else | |
draw.SimpleText('Вы еще не пополняли счет, или делали это давно!', 'NM.Category', w / 2, h - pX(70), Color(105, 105, 105), 1, 1) | |
end | |
end | |
vgui.Register('nm_profile_donate', PANEL, 'Panel') | |
--[[ Инвентарь ]] | |
PANEL = {} | |
function PANEL:Init() | |
local item = self.Item | |
local function clearframe() | |
local frame = self.MainFrame | |
if IsValid(frame.OpenedItem) then | |
frame.OpenedItem:Remove() | |
frame.OpenedItemInfo:Remove() | |
frame.OpenedItemInfo.Scroll:Remove() | |
end | |
end | |
self:SetText("") | |
self.ModelIcon = NM.CreateUI("DModelPanel", self) | |
self.ActivationButton = NM.CreateUI("DButton", self) | |
self.DropButton = NM.CreateUI("DButton", self) | |
self.ActivationButton.DoClick = function(s) | |
clearframe() | |
IGS.ProcessActivate(self.ItemInv.id, function(ok) | |
if not ok then return end | |
self:Remove() | |
end) | |
end | |
self.DropButton.DoClick = function(s) | |
clearframe() | |
IGS.DropItem(self.ItemInv.id, function() | |
self:Remove() | |
end) | |
end | |
end | |
function PANEL:PerformLayout() | |
local item = IGS.GetItem(self.Item) | |
self.ActivationButton:SetPos(pX(600), pX(15)) | |
self.ActivationButton:SetSize(pX(140), pX(40)) | |
self.ActivationButton:SetText("") | |
self.ActivationButton.Paint = function(s, w, h) | |
draw.RoundedBox(8, 0, 0, w, h, self.MainFrame.ActiveItem == self.Item and Color(223, 223, 223) or Color(68, 68, 68)) | |
draw.RoundedBox(8, 1, 1, w - 2, h - 2, Color(55, 55, 55)) | |
draw.SimpleText("Активировать", "NM.ItemName", w / 2, h / 2, color_white, 1, 1) | |
end | |
self.DropButton:SetPos(pX(600), pX(60)) | |
self.DropButton:SetSize(pX(140), pX(20)) | |
self.DropButton:SetText("") | |
self.DropButton.Paint = function(s, w, h) | |
draw.SimpleText("Бросить на пол", "NM.LastDate", w / 2, h / 2, Color(105, 105, 105), 1, 1) | |
end | |
local iconwh = pX(70) | |
self.ModelIcon:SetPos(pX(20), self:GetTall() / 2 - iconwh / 2) | |
self.ModelIcon:SetSize(iconwh, iconwh) | |
end | |
function PANEL:Paint(w, h) | |
draw.RoundedBox(8, pX(5), pX(5), w - pX(10), h - pX(10), Color(68, 68, 68)) | |
draw.RoundedBox(8, 1 + pX(5), 1 + pX(5), w - pX(10) - 2, h - pX(10) - 2, Color(55, 55, 55)) | |
draw.RoundedBox(8, pX(15), h / 2 - pX(40), pX(80), pX(80), Color(47, 47, 47)) | |
local item = IGS.GetItem(self.Item) | |
draw.SimpleText(item.name, "NM.ItemName", pX(110), pX(50), item.highlight or Color(255, 255, 255), 0, 4) | |
draw.SimpleText("Действует " .. IGS.TermToStr(item:Term()), "NM.TabSmall", pX(110), pX(70), Color(105, 105, 105), 0, 4) | |
if item.icon and not item.icon.isModel then | |
surface.SetDrawColor(255, 255, 255, 255) | |
local icons = matex.url(item.icon.icon) | |
local mater = (icons and icons.material) or (default_matex and default_matex.material) | |
surface.SetMaterial(mater or close_mat) | |
local iconwh = pX(70) | |
surface.DrawTexturedRect(pX(20), h / 2 - iconwh / 2, iconwh, iconwh) | |
end | |
end | |
function PANEL:SetInfo(inv, uid, frame) | |
self.Item = uid | |
self.ItemInv = inv | |
self.MainFrame = frame | |
self.DoClick = function() | |
frame:OpenItem(uid) | |
end | |
local item = IGS.GetItem(self.Item) | |
self.ModelIcon.DoClick = function() | |
frame:OpenItem(uid) | |
end | |
if item.icon and not item.icon.isModel then | |
-- texture.Create(item.uid):Download(item.icon.icon) | |
local icons = matex.url(item.icon.icon) | |
self.ModelIcon:SetVisible(false) | |
elseif item.icon and item.icon.isModel then | |
self.ModelIcon:SetVisible(true) | |
self.ModelIcon:SetModel(item.icon.icon) | |
local mn, mx = self.ModelIcon.Entity:GetRenderBounds() | |
local size = 0 | |
size = math.max(size, math.abs(mn.x) + math.abs(mx.x)) | |
size = math.max(size, math.abs(mn.y) + math.abs(mx.y)) | |
size = math.max(size, math.abs(mn.z) + math.abs(mx.z)) | |
self.ModelIcon:SetFOV(30) | |
self.ModelIcon:SetCamPos(Vector(size, size, size)) | |
self.ModelIcon:SetLookAt((mn + mx) * 0.5) | |
end | |
end | |
vgui.Register("nm_inventory_button", PANEL, "DButton") | |
PANEL = {} | |
function PANEL:Init() | |
self.Paint = function() | |
if not IsValid(self.OpenedItem) then | |
draw.SimpleText("Выберите предмет!", "NM.OpenedDesc", pX(877), pX(20), color_white, 1, 1) | |
end | |
end | |
local btn | |
self.Cats = {} | |
self.List = NM.CreateUI("nm_listview", self) | |
self.List.Paint = function(s, w, h) | |
if not IsValid(self.List:GetCanvas():GetChild(0)) then | |
draw.SimpleText("Инвентарь пуст!", "NM.Category", w / 2, h / 2, Color(105, 105, 105), 1, 1) | |
end | |
end | |
IGS.GetInventory(function(items) | |
for k, v in pairs(items) do | |
btn = NM.CreateUI("nm_inventory_button") | |
btn:SetSize(0, pX(100)) | |
btn:SetInfo(v, v.item.uid, self) | |
self.List:AddItem(btn) | |
end | |
end) | |
end | |
function PANEL:PerformLayout() | |
self.List:SetPos(0, 0) | |
self.List:SetSize(self:GetWide() - pX(197), self:GetTall()) | |
end | |
function PANEL:OpenItem(uid) | |
if self.ActiveItem == uid then return end | |
self.ActiveItem = uid | |
if IsValid(self.OpenedItem) then | |
self.OpenedItem:Remove() | |
self.OpenedItemInfo:Remove() | |
self.OpenedItemInfo.Scroll:Remove() | |
end | |
self.OpenedItem = NM.CreateUI("nm_shop_button", self) | |
self.OpenedItem:SetInfo(uid, self) | |
self.OpenedItem:SetPos(pX(978) - pX(14) - btnwh, pX(14)) | |
self.OpenedItem:SetSize(btnwh, btnwh) | |
self.OpenedItem.ButtonBuy:SetVisible(false) | |
local item = IGS.GetItem(uid) | |
self:SetToolTip(item.name) | |
self.OpenedItem.Paint = function(s, w, h) | |
draw.RoundedBox(8, 0, 0, w, h, Color(68, 68, 68)) | |
draw.RoundedBox(8, 1, 1, w - 2, h - 2, Color(55, 55, 55)) | |
local name = item.name | |
if utf8.len(name) > 16 then | |
name = utf8.sub(name, 0, 14) .. "..." | |
end | |
draw.SimpleText(name, "NM.ItemName", pX(16), h - pX(60), item.highlight or Color(255, 255, 255), 0, 4) | |
draw.SimpleText(NM.FancyTerm(item:Term()), "NM.ItemDesc", pX(16), h - pX(45), Color(105, 105, 105), 0, 4) | |
if item.discounted_from then | |
tw, th = draw.SimpleText(IGS.SignPrice(item.discounted_from), "NM.ItemOldPrice", pX(16), h - pX(30), Color(105, 105, 105), 0, 4) | |
local liney = h - pX(34) | |
surface.SetDrawColor(255, 255, 255, 255) | |
surface.DrawLine(pX(16), liney - th * .5, pX(16) + tw, liney) | |
end | |
draw.SimpleText(IGS.SignPrice(item.price), "NM.ItemPrice", pX(16), h - pX(16), Color(255, 255, 255), 0, 4) | |
if item.icon and not item.icon.isModel then | |
surface.SetDrawColor(255, 255, 255, 255) | |
local icons = matex.url(item.icon.icon) | |
local mater = (icons and icons.material) or (default_matex and default_matex.material) | |
surface.SetMaterial(mater or close_mat) | |
local iconwh = pX(80) | |
surface.DrawTexturedRect(w / 2 - iconwh / 2, pX(6), iconwh, iconwh) | |
surface.SetDrawColor(255, 255, 255, 180) | |
surface.SetMaterial(grad_mat) | |
surface.DrawTexturedRect(pX(1), pX(12), w - pX(2), iconwh) | |
end | |
end | |
self.OpenedItemInfo = NM.CreateUI("DPanel", self) | |
self.OpenedItemInfo:SetText("") | |
local oifw, oifh = pX(197), pX(280) | |
self.OpenedItemInfo:SetPos(pX(978) - oifw, pX(530) - pX(54) - oifh) | |
self.OpenedItemInfo:SetSize(oifw, oifh) | |
self.OpenedItemInfo.Paint = function(s, w, h) | |
draw.RoundedBox(0, 0, 1, w, 1, Color(58, 58, 58)) | |
draw.SimpleText("Описание", "NM.OpenedDesc", pX(14), pX(14), Color(134, 134, 134)) | |
end | |
self.OpenedItemInfo.Scroll = NM.CreateUI("nm_listview", self) | |
self.OpenedItemInfo.Scroll:SetPos(pX(978) - oifw + pX(14), pX(530) - pX(10) - oifh) | |
self.OpenedItemInfo.Scroll:SetSize(oifw - pX(28), oifh - pX(60)) | |
self.OpenedItemInfo.Scroll.Paint = function() end | |
local txt = string.Wrap("NM.OpenedText", item.description, self.OpenedItemInfo.Scroll:GetWide()) | |
for k, v in ipairs(txt) do | |
local lbl = NM.CreateUI("DLabel", function(s, p) | |
s:SetText(v) | |
s:SetFont("NM.OpenedText") | |
s:SizeToContents() | |
end) | |
self.OpenedItemInfo.Scroll:AddItem(lbl) | |
end | |
end | |
vgui.Register("nm_inventory", PANEL, "Panel") | |
concommand.Add('donate_menu', function() | |
NM.Menu() | |
end) | |
concommand.Add('donate_menu_old', function() | |
IGS.UI() | |
end) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment