I’m trying to increase the pitch of the player’s walking sound when they’re running. The only solution I’ve found so far only works on the client, but I want that effect to take place on the server as well. So, I created a server-side script inside StarterCharacterScripts. However, for some reason it doesn’t do anything. There are no errors, and it prints everything correctly except for the “ok” part, which means that GetPropertyChangedSignal is not being listened to correctly. Why?
local character = script.Parent
local Hum = character:WaitForChild("Humanoid")
local HRP = character:WaitForChild("HumanoidRootPart")
local defaultWalkSpeed = 16
local maxWalkSpeed = 25
local defaultPlaybackSpeed = 0.9
local maxPlaybackSpeed = 1.25
print("loaded")
if Hum then
print('yes1')
end
if HRP then
print('yes2')
end
Hum:GetPropertyChangedSignal("WalkSpeed"):Connect(function()
print("ok")
local walkSpeed = Hum.WalkSpeed
local playbackSpeed = defaultPlaybackSpeed + (walkSpeed - defaultWalkSpeed) / (maxWalkSpeed - defaultWalkSpeed) * (maxPlaybackSpeed - defaultPlaybackSpeed)
playbackSpeed = math.clamp(playbackSpeed, defaultPlaybackSpeed, maxPlaybackSpeed)
HRP.Running.PlaybackSpeed = playbackSpeed
end)
if you know any other alternative ways to change the walk playbackSpeed on the server when the player is running please let me know
I appreciate the reply, yeah ive been thinking about remote events and thats how i did it:
local character = script.Parent
local Hum = character:WaitForChild("Humanoid")
local HRP = character:WaitForChild("HumanoidRootPart")
local RS = game:GetService("ReplicatedStorage")
local RunSpeedChanged = RS:WaitForChild("RunSpeedChanged")
local defaultWalkSpeed = 16
local maxWalkSpeed = 25
local defaultPlaybackSpeed = 0.9
local maxPlaybackSpeed = 1.25
print("loaded")
if Hum then
print('yes1')
end
if HRP then
print('yes1')
end
RunSpeedChanged.OnServerEvent:Connect(function(player)
print("ok")
local walkSpeed = Hum.WalkSpeed
local playbackSpeed = defaultPlaybackSpeed + (walkSpeed - defaultWalkSpeed) / (maxWalkSpeed - defaultWalkSpeed) * (maxPlaybackSpeed - defaultPlaybackSpeed)
playbackSpeed = math.clamp(playbackSpeed, defaultPlaybackSpeed, maxPlaybackSpeed)
Hum.Running.PlaybackSpeed = playbackSpeed
end)
but for some reason it gave me this error: PlaybackSpeed cannot be assigned to
Then, in a similar post like this one, it is stated that it doesn’t matter if it runs on the client because it will work on the server, but that’s false? Players cannot notice the playback speed changes that are done on a client, only the client itself can hear the changes, not everyone on the server. This is a big issue, but thank you anyway for your help.
You should consider this: The server shouldn’t bother with anything related to sounds. You want this effect on the server because you want it to propagate to other clients correct? In that case you should just have the other clients’ characters hook into this behavior on your client instead of forcing the server to do this.
Create a client-sided script and listen in on when any player joins. Then listen for when their character gets added. Upon the character being added, you can wait for the humanoid to exist and hook in like you normally do.
This is typically where I’d say hook into WalkSpeed changed, but you can’t do that since you’re working with other clients as well as your own (WalkSpeed property wont change on other clients). Instead you should listen for when their HRP’s AssemblyLinearVelocity changes:
HumanoidRootPart:GetPropertyChangedSignal("AssemblyLinearVelocity"):Connect(function()
-- We multiply by the end vector so we ignore any Y changes
local velocity = HumanoidRootPart.AssemblyLinearVelocity * Vector3.new(1, 0, 1)
local walkSpeed = velocity.Magnitude
local playbackSpeed = defaultPlaybackSpeed + (walkSpeed - defaultWalkSpeed) / (maxWalkSpeed - defaultWalkSpeed) * (maxPlaybackSpeed - defaultPlaybackSpeed)
-- etc
end)
Also if you’re unsure how to hook into all characters on the client, refer to this post!
First of all - running sounds aren’t necessary to be played on the server. Secondly, this is a lot easier than you think. Instead of using the WalkSpeed property, you can use Humanoid.Running to get the characters’s current speed instantly.
local defaultPitch = Hum.Running.PlaybackSpeed
local defaultSpeed = Hum.WalkSpeed
Hum.Running:Connect(function(speed)
Hum.Running.PlaybackSpeed = (speed/defaultSpeed) * defaultPitch
--if you feel it is necessary be changed on the server, this can be run on a server script as well.
end)
I can’t change the playbackspeed from the humanoid else it will result in a error saying PlaybackSpeed is not a valid member of RBXScriptSignal
But you’re right that using the walkspeed is unnecessary, i’ve simplified the script so that it changes the playbackspeed on a specific number when running like this:
local HRP = character:WaitForChild("HumanoidRootPart")
if isRunning and isWalking then
Hum.WalkSpeed = runSpeed
HRP.Running.PlaybackSpeed = 2
--animation handling here, not necessary to mention
else
Hum.WalkSpeed = 16
HRP.Running.PlaybackSpeed = 1
--animation handling here, not necessary to mention
end
Now, the thing is that this is running on the client, not on the server. Idk why everyone is telling me that this can work fine on the client, but it doesn’t because other players can’t notice the changes. I’ve made a video here to show what I’m trying to say:
First of all that was my bad, it should’ve been HRP.Running.
About the client-server stuff - yes, changing the pitch on the client won’t replicate to the server. But Roblox development (at least from my perspective) is all about saving memory to keep performance high and minimalize server lag. If it’s not a fundamental feature that ALL players on the server MUST see, you should probably run it on the client. This way it’ll not only be a lot smoother but it’ll reduce the server’s workload for more important things.
Not a big deal, I know. There’s nothing wrong with running it on the server. But small things like the pitch of the running sound most likely wouldn’t be noticed by other players anyway.
local function CharacterAdded(char)
local HRP = char:WaitForChild("HumanoidRootPart")
--i don't know what to do here
end
local function PlayerAdded(player)
player.CharacterAdded:Connect(CharacterAdded)
local char = player.Character
if char then
CharacterAdded(char)
end
end
game.Players.PlayerAdded:Connect(PlayerAdded)
for i,v in pairs(game.Players:GetPlayers()) do
PlayerAdded(v)
end
Thank you for replying,
I’ve tried to do something here, but as explained above, the playback speed only changes when the player is RUNNING, not WALKING. We could say that I can just use events, but what if a player is spamming the shift key? This can result in bugs and things becoming asynchronous because I’ve tried it with boolean values and the server changing it, but events are not perfect at all.
Yea true. It’s not really that big of a deal, and if I can’t fix the replication to the server side, then I’ll just let it be on the client because it’s better than nothing. The Roblox engine is not that great after all.
But I appreciate your help and the time you’ve given