can i use this code?
If yes, im not sure how to adjust it
Using someone elses code becomes really hard later on especially if you dont understand them very well. Advanced coders use many tricks to make scripts more efficient.
Its probably best to make your own system as you would learn more from it and my system relies an a lot on other interactions with scripts
But im not sure where to find good tutorials
When you first make a system I would recommend trying to visualize by writing your idea on paper or drawing a diagram on how your system works.
do you know any good tutorials for this?
That doesnât focus on saving data?
Oh for data store let me see. Btw do you want to use DataStoreService or DataStore2
data store 2
i was going to make that inventory system but i quit because i didnât know how to use d2
But DataStore2 is nice because it does alot of stuff for you. Here is a dev forum for it
but how is that the same as saving a gui?
If you save something too big in DataStore it might time out. I would rather save the data about the playerâs gui data in something more simple like a table that holds the gui inventory items.
Pretty sure you cant even save instances in the Datastore
Ya I think so too. To make your scripts as efficient as possible, I would save datatypes that are part of Lua and not from the roblox library.
1 nil
Used to differentiate the value from having some data or no(nil) data.
2 boolean
Includes true and false as values. Generally used for condition checking.
3 number
Represents real(double precision floating point) numbers.
4 string
Represents array of characters.
5 function
Represents a method that is written in C or Lua.
6 userdata
Represents arbitrary C data.
7 thread
Represents independent threads of execution and it is used to implement coroutines.
8 table
Represent ordinary arrays, symbol tables, sets, records, graphs, trees, etc., and implements associative arrays. It can hold any value (except nil).
These are datatypes from Lua that are acceptable
Source from: Lua - Data Types
Hey Slinky can you give yoru full code because i want to try to understand it, and also because you have some things you put down that arenât variables i can see
--[[Services]]--
local ContextActionService = game:GetService("ContextActionService")
local RunService = game:GetService("RunService")
local ItemModule = require(game.ReplicatedStorage.ItemModule)
local Items = ItemModule.Items
local PlayerData = require(game.ReplicatedStorage.ClientData)
--[[Constants]]--
--Objects
local plr = game.Players.LocalPlayer
local Mouse = plr:GetMouse()
local Character = plr.Character or plr.ChildAdded:Wait()
--UI
local InventoryGui = script.Parent
local InventorySlotGui = InventoryGui.Slots
local InventorySlotGrid = InventorySlotGui.UIGridLayout
local LeftHandSlot = InventoryGui.LeftHandSlot
local RightHandSlot = InventoryGui.RightHandSlot
local HeadSlot = InventoryGui.HeadSlot
local ChestSlot = InventoryGui.ChestSlot
local LegSlot = InventoryGui.LegSlot
local BootSlot = InventoryGui.BootSlot
local GeneralGui = script.Parent.Parent.Parent.General
local HotBarGui = GeneralGui.HotBar
local HotBarFrame = HotBarGui.Frame
local UIAssets = game.ReplicatedStorage.Assets.UI
local InventorySlotModel = UIAssets.InventorySlot
local UIVariables = game.ReplicatedStorage.Variables.Player.UI
--Events
local Events = game.ReplicatedStorage.Events
local DataEvents = Events.Data
local DataUpdated = DataEvents.DataUpdated
local PlayerAction = Events.PlayerAction
--Non Objects
local StartCanvasSize = InventorySlotGui.CanvasSize
local StartGridSize = InventorySlotGui.Size
local StartGridPos = InventorySlotGui.Position
local CellSizeWeight = UIVariables.CellSizeWeight.Value
local PaddingWeight = UIVariables.PaddingWeight.Value
local CellSize = UIVariables
local InventorySize = #PlayerData.SlotData.Inventory
local RowSize = 4
local ViewSizeX = 0
local ViewSizeY = 0
local SpacingDistance = 1
local Spacing = Vector3.new(SpacingDistance, SpacingDistance, SpacingDistance)
local ItemCameraCFrame = CFrame.new(Spacing)*CFrame.lookAt(Spacing, Vector3.new(0, 0, 0))
--[[Variables]]--
local InventoryFrameSize
local InventorySlotSize
local InventorySlotPadding
local InventorySlotFrameData = {}
local HotBarSlotFrameData = {}
--[[Functions]]--
local function ScreenSizeChange()
ViewSizeX = Mouse.ViewSizeX
ViewSizeY = Mouse.ViewSizeY
--Normalizing
local c = CellSizeWeight + PaddingWeight
local CellSizeScale = CellSizeWeight/c
local PaddingScale = PaddingWeight/c
--InventoryGrid
--Acounting for a the bar
local BarThickness = InventorySlotGui.ScrollBarThickness
InventorySlotGui.Size = StartGridSize + UDim2.fromOffset(-BarThickness, 0)
InventorySlotGui.Position = StartGridPos + UDim2.fromOffset(BarThickness, 0)
InventoryFrameSize = InventorySlotGui.AbsoluteSize
local FrameX = InventoryFrameSize.X - BarThickness --To acount for both sides
InventorySlotSize = FrameX*CellSizeScale/4
InventorySlotPadding = FrameX*PaddingScale/3
--Setting the Values
local newSlotSize = UDim2.fromOffset(InventorySlotSize, InventorySlotSize)
InventorySlotGrid.CellSize = newSlotSize
InventorySlotGrid.CellPadding = UDim2.fromOffset(InventorySlotPadding, InventorySlotPadding)
local AbsoluteContentSize = InventorySlotGrid.AbsoluteContentSize
InventorySlotGui.CanvasSize = UDim2.fromOffset(AbsoluteContentSize.X, AbsoluteContentSize.Y)
--Setting the Size of the Slots in the Gui above
LeftHandSlot.Size = newSlotSize
RightHandSlot.Size = newSlotSize
HeadSlot.Size = newSlotSize
ChestSlot.Size = newSlotSize
LegSlot.Size = newSlotSize
BootSlot.Size = newSlotSize
end
local function LoadSlot(ItemSlot, SlotFrameData)
--Setting Variables
local ItemName = ItemSlot.ItemName
local IsEmpty = ItemName == ""
local SlotItemData = Items[ItemName]
local ItemFrame = SlotFrameData.Gui.ItemFrame
local OldModel = ItemFrame.VP.Camera:FindFirstChild("Model")
--Setting ViewportFrame Model
if SlotFrameData.ItemName ~= ItemName then
SlotFrameData.ItemName = ItemName
--Getting Rid of Old Model
if OldModel then
OldModel:Destroy()
end
--Creating new Model
if not IsEmpty then
local newModel = SlotItemData.Model:Clone()
newModel:SetPrimaryPartCFrame(CFrame.fromOrientation(0, 45, 0))
newModel.Parent = ItemFrame.VP.Camera
end
end
--Setting QuanitityLabel
local ItemQuantity = ItemSlot.Quantity
if not IsEmpty and SlotItemData.Stackable then
ItemFrame.Quantity.Visible = true
if SlotFrameData.Quantity ~= ItemQuantity then
ItemFrame.Quantity.Text = ItemQuantity
SlotFrameData.Quantity = ItemQuantity
end
else
ItemFrame.Quantity.Visible = false
end
end
local function UpdateInventory()
for i, v in pairs(PlayerData.SlotData.Inventory) do
LoadSlot(
PlayerData.SlotData.Inventory[i],
InventorySlotFrameData[i]
)
end
for i, v in pairs(PlayerData.SlotData.HotBar) do
LoadSlot(
PlayerData.SlotData.HotBar[i],
HotBarSlotFrameData[i]
)
end
end
local function OpenInventory(_, UserInputState)
if not UserInputState or UserInputState ~= Enum.UserInputState.Begin then return end
if InventoryGui.Parent.Enabled then
InventoryGui.Parent.Enabled = false
else
InventoryGui.Parent.Enabled = true
end
end
--[[Main]]--
InventoryGui.Parent.Enabled = false
--Setting up size variables
ScreenSizeChange()
for i, v in pairs(PlayerData.SlotData.Inventory) do
local newSlot = InventorySlotModel:Clone()
newSlot.Name = i
newSlot.Parent = InventorySlotGui
InventorySlotFrameData[i] = {
Index = i,
Gui = newSlot,
LastQuantity = 0,
LastItemName = ""
}
local RowSlot = (i-1)%4
local Row = math.floor((i-1)/4)+1
newSlot.Position = UDim2.fromOffset(
RowSlot*InventorySlotPadding + RowSlot*InventorySlotSize,--SubFromBoth(SlotSize, -1),
Row*InventorySlotPadding + Row*InventorySlotSize
)
local newSlotCam = Instance.new("Camera")
newSlotCam.Parent = newSlot.ItemFrame.VP
newSlot.ItemFrame.VP.CurrentCamera = newSlotCam
newSlotCam.CFrame = ItemCameraCFrame
--Interaction
newSlot.MouseButton2Down:Connect(function()
--Temp
PlayerAction:FireServer("SwitchPlaces", "Inventory", i, "HotBar", 1)
end)
end
for i, v in pairs(PlayerData.SlotData.HotBar) do
local newSlot = InventorySlotModel:Clone()
newSlot.Name = i
newSlot.Parent = HotBarFrame
HotBarSlotFrameData[i] = {
Index = i,
Gui = newSlot,
LastQuantity = 0,
LastItemName = ""
}
local RowSlot = i-3
newSlot.Size = UDim2.new(.15, 0, .15, 0)
newSlot.Position = UDim2.new(.5 + .2*RowSlot, 0, .5, 0)
local newSlotCam = Instance.new("Camera")
newSlotCam.Parent = newSlot.ItemFrame.VP
newSlot.ItemFrame.VP.CurrentCamera = newSlotCam
newSlotCam.CFrame = ItemCameraCFrame
end
ContextActionService:BindAction("InventoryToggle", OpenInventory, false, Enum.KeyCode.Q)
RunService:BindToRenderStep("CheckSize", 199, function()
if Mouse.ViewSizeX ~= ViewSizeX or Mouse.ViewSizeY ~= ViewSizeY then
ScreenSizeChange()
end
end)
UpdateInventory()
DataUpdated.Event:Connect(function()
UpdateInventory()
end)
just the variables if thats fine? with the loadslot function and update