From 9adcb3c73a8d0e7ecfe66b30da630c6c2e67f03a Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Sat, 27 Aug 2016 17:08:46 -0400 Subject: Moved prayers to their own system --- gamemode/client/cl_inventory.lua | 233 +++++++++++++++++++-------------------- 1 file changed, 115 insertions(+), 118 deletions(-) (limited to 'gamemode/client/cl_inventory.lua') diff --git a/gamemode/client/cl_inventory.lua b/gamemode/client/cl_inventory.lua index 837f7a1..b806846 100644 --- a/gamemode/client/cl_inventory.lua +++ b/gamemode/client/cl_inventory.lua @@ -3,11 +3,19 @@ ]] print("Hello from cl_inventory.lua") --debug.Trace() -local invfuncs -invfuncs = ART.invfuncs ---invfuncs = include("../gamemodes/artery/gamemode/shared/inventory_common.lua") ---invfuncs = include("../shared/inventory_common.lua") -assert(invfuncs ~= nil, "Dependency failed") + +ART.PrayerEquiped = ART.PrayerEquiped or { + false,false,false,false +} + +local lastpanel = lastpanel or 1 + +local inventorysheets = {} +ART.RegisterInventorySheet = function(func) + inventorysheets[#inventorysheets + 1] = func +end + + local plyisininventory = false --Displays a dropdown of options under the players mouse, if the option is clicked, does the function @@ -15,7 +23,7 @@ local plyisininventory = false --Be careful not to make this a recursive table. local function createMenuFor(menu, tbl) for k,v in pairs(tbl) do - if(isfunction(v)) then --This is a dead-end, add the menu + if isfunction(v) then --This is a dead-end, add the menu local thisoption = menu:AddOption(k,v) else --Otherwise it should be a table, recursively call to create local submenu = menu:AddSubMenu(k) @@ -24,102 +32,23 @@ local function createMenuFor(menu, tbl) end end -local function DrawBackpackOnDPanel(dp, backpack, backpacknum, tent) - local width = ScrW() - local height = ScrH() - local slotsize = math.Round(width / 32) - local backgrid = vgui.Create( "DGrid", dp ) - backgrid:SetPos( 10, 30 ) - backgrid:SetCols( backpack[2][1] ) - backgrid:SetColWide( backpack[2][2] ) - backgrid:Dock(FILL) - for i = 1,#(backpack[1]) do - for j = 1,#(backpack[1][i]) do - local item = backpack[1][j][i] - if type(backpack[1][j][i]) == "table" then - local itemwidth = 0 - for _,l in pairs(item.Shape) do - itemwidth = math.Max(itemwidth,#l) - end - local itemheight = #item.Shape - local invicon = vgui.Create( "DImageButton", dp ) - invicon:SetSize(slotsize * itemwidth, slotsize * itemheight) - invicon:SetPos(slotsize * (i - 1), slotsize * (j - 1)) - invicon:SetText(item.Name) - if item.Tooltip then - invicon:SetTooltip(item.Tooltip) - end - if item.Paint then - invicon.Paint = item.Paint - end - if item.DoOnPanel then - item.DoOnPanel(invicon) - end - --invicon.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(0,100,0)) end - invicon.DoClick = function() - if not item.GetOptions then return end - local menu = vgui.Create("DMenu") - createMenuFor(menu,item:GetOptions()) - menu:Open() - end - invicon.Item = item - invicon.invpos = {j,i} - invicon.ent = tent - invicon.backpacknum = backpacknum - invicon:Droppable("Inventory") - elseif not backpack[1][j][i] then - local emptyslot = vgui.Create("DPanel", dp) - emptyslot:SetSize(slotsize,slotsize) - emptyslot:SetPos(slotsize * (i - 1), slotsize * (j - 1)) - --emptyslot.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(0,0,100)) end - emptyslot:Receiver( "Inventory", function( receiver, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY ) - if not isDropped then return end - local icon = tableOfDroppedPanels[1] - local item = icon.Item - local curpos = icon.invpos - --Set the shape it was at to false - if not icon.wasequiped and icon.ent == tent then - assert(curpos ~= nil, "print curpos was nil when not equiped") - for k = 1,#item.Shape do - for l = 1,#(item.Shape[k]) do - if k == 1 and l == 1 then continue end - backpack[1][curpos[1] + k - 1][curpos[2] + l - 1] = false - end - end - backpack[1][curpos[1]][curpos[2]] = false - end - if invfuncs.CanFitInBackpack(backpack,j,i,item) then - local fromtbl = icon.invpos - local wasequiped = icon.wasequiped - if wasequiped then - net.Start("unequipitem") - net.WriteString(wasequiped) - net.WriteUInt(backpacknum,16) - net.WriteUInt(i,16) - net.WriteUInt(j,16) - net.SendToServer() - else - net.Start("moveitem") - net.WriteEntity(icon.ent) -- from ent - net.WriteEntity(tent) -- to ent - net.WriteUInt(icon.backpacknum,16) -- from backpack number - net.WriteUInt(backpacknum,16) -- to backpack number - net.WriteUInt(fromtbl[1],16) -- From position - net.WriteUInt(fromtbl[2],16) - net.WriteUInt(j,16) -- To position - net.WriteUInt(i,16) - net.SendToServer() - if item.onEquip ~= nil then - item:onEquip(LocalPlayer()) - end - end - end - end, {} ) - end +function ART.RefreshDisplays() + local discopy = LocalPlayer().invdisplays + LocalPlayer().invdisplays = {} + for k,ptbl in pairs(discopy) do + if not ptbl.panel:IsValid() then continue end + if ptbl.panel.Close ~= nil then + ptbl.panel:Close() + else + print(ptbl.panel) + error("panel has no close method") + ptbl.panel:Remove() end + ptbl.redraw() end end +local sheet function ShowInventory(ply,cmd,args) if plyisininventory then return end LocalPlayer().invdisplays = LocalPlayer().invdisplays or {} @@ -140,28 +69,83 @@ function ShowInventory(ply,cmd,args) plyisininventory = false end - local sheet = vgui.Create( "DPropertySheet", invpanel ) + sheet = vgui.Create( "DPropertySheet", invpanel ) sheet:Dock( FILL ) - local invsheet = vgui.Create( "DPanel", sheet ) - invsheet.Paint = function( self, w, h ) draw.RoundedBox( 4, 0, 0, w, h, Color( 157, 160, 167 ) ) end - sheet:AddSheet( "Inventory", invsheet, "icon16/cross.png" ) + for k,v in pairs(inventorysheets) do + local name,tsheet,image = v() + sheet:AddSheet(name,tsheet,image) + tsheet.sheetnum = name + end + sheet:SwitchToName(lastpanel) + + --[[ + + local prayersheet = vgui.Create( "DListLayout", sheet) + sheet:AddSheet( "Prayers", prayersheet, "icon16/coins.png") + + --Prayers + local prayergridscroll = vgui.Create("DScrollPanel") + prayergridscroll:SetSize( (width / 4) - 20, height / 3 ) + prayergridscroll:SetPos( 5, 5 ) + prayersheet:Add(prayergridscroll) + local prayergrid = vgui.Create( "DGrid", prayergridscroll ) + prayergrid:SetPos( 5 , 5 ) + prayergrid:Dock(FILL) - local skillsheet = vgui.Create( "DPanel", sheet ) - skillsheet.Paint = function( self, w, h ) draw.RoundedBox( 4, 0, 0, w, h, Color( 157, 160, 167 ) ) end - sheet:AddSheet( "Skills", skillsheet, "icon16/tick.png" ) + prayergrid:SetCols( (width / 4) / 64 ) + prayergrid:SetColWide( 64 ) + prayergrid:SetRowHeight(64) + prayergridscroll:AddItem(prayergrid) - local questsheet = vgui.Create( "DPanel", sheet) - questsheet.Paint = function(self,w,h) draw.RoundedBox(4,0,0,w,h,Color(157,160,167)) end - sheet:AddSheet( "Quests", questsheet, "icon16/house.png") + for k,v in pairs(ART.Prayer) do + local but = vgui.Create( "DButton", prayergrid ) + but:SetText( v.Name ) + but:SetSize( 64, 64 ) + but:SetWrap(true) + prayergrid:AddItem( but ) + but.PrayerName = v.Name + but:Droppable("PrayerBind") + end + + local prayerbindgrid = vgui.Create("DGrid") + prayerbindgrid:SetPos(height * (2 / 3),5) + prayerbindgrid:SetSize((width / 4) - 20, height / 3) + prayerbindgrid:SetColWide(64) + prayerbindgrid:SetRowHeight(64) + function prayerbindgrid:Paint(w,h) + draw.RoundedBox( 8, 0, 0, w, h, Color( 0, 255, 0 ) ) + end + local n = 0 + for k,v in pairs(ART.PrayerEquiped) do + n = n + 1 + local but = vgui.Create( "DPanel", prayerbindgrid ) + but:SetSize(64, 64) + if v ~= false then + local prayerbut = vgui.Create( "DLabel", but ) + prayerbut:SetText( v.Name ) + prayerbut:SetSize( 64, 64 ) + prayerbut:SetWrap(true) + else + local blabel = vgui.Create( "DLabel", but ) + blabel:SetText( "F" .. k ) + blabel:SetDark(true) + but:Receiver( "PrayerBind", function( self, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY ) + if not isDropped then return end + ART.PrayerEquiped[k] = tableOfDroppedPanels.PrayerName + print("Prayer bound to " .. k) + end) + end + prayerbindgrid:AddItem(but) + end + prayersheet:Add(prayerbindgrid) --Display quests local questselector = vgui.Create( "DScrollPanel", questsheet ) questselector:SetSize((width / 4) - 20, (height / 2) - 40) questselector:SetPos(0,0) local questinfo = vgui.Create("DScrollPanel", questsheet) - questinfo:SetSize(width / 4, (height / 2)) - --questinfo.Paint = function(self,w,h) draw.RoundedBox(4,0,0,w,h,Color(0,160,167)) end + questinfo:SetSize(width / 4, height / 2) questinfo:SetPos(0,height / 2) for k,v in pairs(LocalPlayer().Quests or {}) do print("Displaying quest:" .. k) @@ -223,8 +207,6 @@ function ShowInventory(ply,cmd,args) if v.DoOnEqupPanel then v.DoOnEqupPanel(eqslot) end - --eqslot:SetImage( "overviews/de_inferno", "vgui/avatar_default" ) - --eqslot.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(100,0,0)) end eqslot:Droppable("Inventory") eqslot.Item = v eqslot.wasequiped = k @@ -245,36 +227,51 @@ function ShowInventory(ply,cmd,args) DrawBackpackOnDPanel(tbacksheet,v,k,LocalPlayer()) end + ]] + end + + hook.Add("OnSpawnMenuOpen","ArteryOpenInventory",ShowInventory) hook.Add("OnSpawnMenuClose","ArteryCloseInventory",function() + lastpanel = sheet:GetActiveTab():GetPanel().sheetnum for k,v in pairs(LocalPlayer().invdisplays) do if not v.panel:IsValid() then continue end - PrintTable(v) + --PrintTable(v) v.panel:Close() LocalPlayer().invdisplays[k] = nil end - --if LocalPlayer().invpanel == nil then return end - --LocalPlayer().invpanel:Remove() plyisininventory = false end) concommand.Add("showinventory",ShowInventory) local viewdistance = 100 local rotatespeed = 65 +local bone = nil +local previousheadscale = Vector(1,1,1) hook.Add("CalcView","ArteryInventoryView",function(ply,pos,ang,fov,nearz,farz) + if bone == nil then + bone = LocalPlayer():LookupBone("ValveBiped.Bip01_Head1") + end local view = {} + --view.origin = LocalPlayer():GetBonePosition(bone) + LocalPlayer():GetUp() * 2 view.origin = pos if plyisininventory then - local xoff = viewdistance * math.sin(math.rad(CurTime() * rotatespeed)) - local yoff = viewdistance * math.cos(math.rad(CurTime() * rotatespeed)) - view.origin = view.origin + ( Vector(xoff,yoff,10) ) + local trot = math.rad(CurTime() * rotatespeed) + local xoff = viewdistance * math.sin(trot) + local yoff = viewdistance * math.cos(trot) + view.origin = view.origin + Vector(xoff,yoff,10) ang.pitch = 20 ang.yaw = (-CurTime() * rotatespeed) - 90 end view.angles = ang view.fov = fov + if not plyisininventory then + LocalPlayer():ManipulateBoneScale(bone,Vector(0,0,0)) + else + LocalPlayer():ManipulateBoneScale(bone,previousheadscale) + end view.drawviewer = plyisininventory return view -- cgit v1.2.3-70-g09d2