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.

4 comments
Is it possible that Target is destroyed while you do wait(Animation_Forage.Timer.Value)? Or could it be a Part that is created by the client?
Are you sure Target isn't a client-sided part?
@gskw, no, the Target is not destroyed. The dropped item, which is the new Target, is actually a cloned from a Replicated Storage where all the parts are store (for replication for purposes). So item reserve from the Replicated Storage was cloned (after checking the item's values on Player's Inventory on the server and on the client), and then Parented to the Workspace.
@Kiriot22, the drop gui on the backpack of the player initiated the clone process. When clicked, it will prompt the server to check the inventory, return, then the local script within the drop gui will clone it. I think you mean to place the clone script on the server right? Not on a local script? I'll try it out!