GerstnerWave(Vector3 SamplePosition, Float Wavelength, Vector2 Direction, Float Steepness, Float Gravity, Float SampleTick)
SamplePosition is the position at which you are checking the wave displacement (E.G. the world position of a given bone in a water mesh)
Wavelength, Direction, Steepness, and Gravity are all pretty self-explanatory, but it does take some tinkering to find numbers that look nice.
SampleTick is the time you are sampling the wave at, should be something that you can sync between clients if possible. Waves sampled at the same SampleTick with the same arguments will always return the same results (deterministic).
Here are some example arguments that I’ve found look pretty nice:
local Wave1 = GerstnerWave(SamplePosition,80,Vector2.new(1,0),.05,1.5,SampleTick)
local Wave2 = GerstnerWave(SamplePosition,90,Vector2.new(0,.3),.07,1.5,SampleTick)
local Wave3 = GerstnerWave(SamplePosition,100,Vector2.new(1,1),.05,1.5,SampleTick)
local TotalDisplacement = Wave1+Wave2+Wave3 -- This is your final wave displacement