Unable to cast value to object when firing event

im tryna send the hungerlvl from serverscript to local script
server

game.Players.PlayerAdded:Connect(function(player)
	player.CharacterAdded:Connect(function()
		local hungerlvl = 100
		local thirstlvl = 100
		local stomachcapacity = 100
		local ispuking = false

		local loosingHunger = true
		local loosingThirst = true


		while loosingHunger == true do
			wait(5)
			hungerlvl = hungerlvl - 1
			print(hungerlvl)
			game.ReplicatedStorage.GuiUpdater:FireClient(hungerlvl)

		end
		
		
	end)
end)

local

game.ReplicatedStorage.GuiUpdater.OnClientEvent:Connect(function(hungerlvl)
	script.Parent.Text = hungerlvl
end)

First of all, let’s restructure that first script:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")

local RemoteEvent = ReplicatedStorage:WaitForChild("GuiUpdater")

Players.PlayerAdded:Connect(function(Player)
    Player.CharacterAdded:Connect(function()
        -- Your variables here
        local Hunger: number = 100
        local isLoosingHunger: boolean = true

        -- This is the important part

        if isLoosingHunger then
            -- This will run every 5 seconds
            local Connection = RunService.Heartbeat:Connect(function()
                Hunger -= 1
                RemoteEvent:FireClient(Player, Hunger)
            end)

            -- This will run when the player dies
            Player.CharacterAdded:Connect(function()
                Connection:Disconnect()
            end)
        end
    end)
end)

And this client script:

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local RemoteEvent = ReplicatedStorage:WaitForChild("GuiUpdater")

RemoteEvent.OnClientEvent:Connect(function(Player: Player, HungerLevel: number)
    script.Parent.text = "Hunger: " .. HungerLevel
end)

And with regards to your client script, you’d need to tostring() the hungerlvl as hungerlvl is a number, so to cast it to a TextLabel, you need to convert it into a string.

1 Like

local

local players = game:GetService("Players")
local replicatedStorage = game:GetService("ReplicatedStorage")

local player = players.LocalPlayer
local event = replicatedStorage.GuiUpdater
local textLabel = script.Parent

event.OnClientEvent:Connect(function(hungerlvl)
	textLabel.Text = hungerlvl
end)

server

local players = game:GetService("Players")
local replicatedStorage = game:GetService("ReplicatedStorage")

local event = replicatedStorage.GuiUpdater

players.PlayerAdded:Connect(function(player)
	player.CharacterAppearanceLoaded:Connect(function(character)
		local hungerlvl = 100
		local thirstlvl = 100
		local stomachcapacity = 100
		local ispuking = false
		--
		local loosingHunger = true
		local loosingThirst = true
		--
		task.spawn(function()
			while loosingHunger == true do
				wait(0.5)
				hungerlvl -= 1
				print(hungerlvl)
				event:FireClient(player, hungerlvl)
				if hungerlvl == 50 then
					break
				end
			end
		end)
	end)
end)
1 Like

Remember, wait() is deprecated. Use task.wait()!

1 Like

image
where is 5 seconds being decided? thats not the final wait time its just for testing purposes right now while i figure everything out.I want to be able to change in future.

It won’t run every 5 seconds… Don’t know what I was thinking putting that there. Sorry, I’m a bit fired right now! Heartbeat will fire every rendered frame on the client. It’s dependant on the player’s local machine.

If you’d prefer it this way though that’s also fine:

if isLoosingHunger then
	repeat
		task.wait() -- Insert how long you want to wait here.
		Hunger -= 1
		RemoteEvent:FireClient(Player, Hunger)
	until Hunger <= 0
end
1 Like

when it puts the hunger into text it comes up as nil.
heres what i got after messing with it
image

server

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")

local RemoteEvent = ReplicatedStorage:WaitForChild("GuiUpdater")

Players.PlayerAdded:Connect(function(Player)
    Player.CharacterAdded:Connect(function()
	
		local StomachCap: number = 100
		local Thirst: number = 100
        local Hunger: number = 100
		local isLoosingHunger: boolean = true
		local isLoosingThirst: boolean = true
		local ispuking: boolean = false

        -- This is the important part

        if isLoosingHunger then
			repeat
				task.wait(4) 
				Hunger = Hunger - 1
				print(Hunger)
				RemoteEvent:FireClient(Player, Hunger)
			until Hunger <= 0
        end
    end)
end)

local

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local RemoteEvent = ReplicatedStorage:WaitForChild("GuiUpdater")

RemoteEvent.OnClientEvent:Connect(function(Player: Player, Hunger: number)
	print(tostring(Hunger) .. "HELLLPPPP")
	script.Parent.Text = tostring(Hunger)
end)

Do:

RemoteEvent.OnClientEvent:Connect(function(Player: Player, Hunger: number)
    local HungerString: string =  tostring(Hunger)

	print(HungerString)
	script.Parent.Text = tostring(Hunger)
end)