Hello everyone! So I am making a game similar to Survival 303 (dang, nostalgia feels). I have my forage tool, which forages an item that has a: ClickDetector and forageable value (boolean value). So when all criteria are met, the forage tool will then pass the parameter 'Target' (which is the name for the mouse.Target), to a server script through a remote event. The server script will then find the corresponding item from the player's inventory (server-side), which will then add 1 to its value. After that, the server will fire another remote event to change the value on the player's inventory (client-side).
Now, I also have my backpack gui. This gui, whenever an item's value (located on the player's inventory - client side) changes, the corrresponding item's gui will also change (either visible or not). Note that, before showing the item's gui, it will not only check the player's inventory in the client-side, but also the player's inventory on the server-side. This is to avoid having any discrepancy or to avoid malicious attacks (note that FilteringEnabled was already on, that's why I use remote events.).
In the same backpack gui, I also have this button called "drop button". This drop button checks if the currently active item's gui has a value in the inventory (client and server-side) more than 0. If it has, it will clone the "physical item" and be parented to the workspace (where my 'initial' item was located before foraging it.) Now, when I use the same forage tool, it still picks-up the 'dropped item', because it still meets all the criteria, but here comes the problem. Before the forage tool fires the remote event to the server, the 'Target' is still present, but when the server picks up the 'Target', it becomes nil. Can you help me out on this one?
Found below are the codes. Note that I did not put the section where I set-up my variables because it will make this post lengthy
A. FORAGE TOOL
Tool_Forage.Activated:Connect(function() local Target = Mouse.Target if Tool_Usage then Tool_Usage = false if Target then if Target:FindFirstChild("ClickDetector") and Target:FindFirstChild("Forageable") then if Humanoid.Health > 0 then local Target_Range = Target:FindFirstChild("ClickDetector").MaxActivationDistance local Humanoid_Position = Humanoid.Parent:FindFirstChild("HumanoidRootPart").Position if (Humanoid_Position - Target.Position).Magnitude <= Target_Range then Target_Range = 0 Animation_Forage_Load:Play() Humanoid.WalkSpeed = 0 Humanoid.JumpPower = 0 wait(Animation_Forage.Timer.Value) Animation_Forage_Load:Stop() toInventory_Server:FireServer(Target) Humanoid.WalkSpeed = 16 Humanoid.JumpPower = 50 Tool_Usage = true else print("Target out of range.") Tool_Usage = true end else print("Clicker dead.") Tool_Usage = true end else print("Target not forageable nor craftable.") Tool_Usage = true end else print("Target not clickable.") Tool_Usage = true end end end)
B. INVENTORY SERVER:
local function Inventory_Server_Changer(player, Target) print(Target) local Inventory_Server = ServerStorage:FindFirstChild("Inventory_" .. player.Name) local Target_Name = tostring(Target) for i, Item_Server in pairs(Inventory_Server:GetChildren()) do if Item_Server.Name == Target_Name then Item_Server.Value += 1 local Item_Server_Value = Item_Server.Value toInventory_Player:FireClient(player, Target, Item_Server_Value) Target:Destroy() print(tostring(Item_Server.Name) .. "'s value in the Inventory_Server is changed by" .. tostring(Item_Server_Value)) else print(tostring(Item_Server.Name) .. " is not the item.") end end end toInventory_Server.OnServerEvent:Connect(Inventory_Server_Changer)
Take note that in the line print(Target) of the Inventory Server is where the error occurs. It prints out nil.
Okay, Kiriot22's answer worked. It is because the tool's local script pick-ups whatever part that met the criteria - whether existing on the client or on the whole server. But, the problem lies that the server script only accepts parameters, or in the case - Target, that is present in the server. Note that, I failed to consider this because on the local player's workspace, the item is existing. With that, I thought that since workspace is server-sided, the target will also exist in the workspace's of the other players. Once again, thank!