Hi Miguel! When using ClientEvents, try to make each event line up with a single input from the user. So, let’s say you have a button which can be clicked by the user to move north, and one button click always equals 10 “positions” on the map. The ClientEvent in this case would just be :move_north
- and the distance moved is only a concern for the ClientEventHandler:
def Ship.Systems.ClientEventHandler do
...
@move_distance 10
defp process_one({player, :move_north}) do
y = YPosition.get(player)
YPosition.update(player, y + @move_distance)
end
end
Now, if you have a button where sometimes a press moves 10 positions, and other times a press moves 5 positions, the question is: what determines this value? If the value comes from the frontend, such as a slider in the UI where the user adjusts the speed, then we’ll attach that value as metadata with the event:
ClientEvents.add(player_entity, {:move_north, 10})
ClientEvents.add(player_entity, {:move_north, 5})
and the handler:
defp process_one({player, {:move_north, value}}) do
y = YPosition.get(player)
YPosition.update(player, y + value)
end
But if the value is based in the backend (stored as a component somewhere) then metadata should not be used. For example, if one button press equals s
positions, where s
is the SailingSpeed
of the player’s ship, simply add :move_north
and fetch the value in the handler:
defp process_one({player, :move_north}) do
y = YPosition.get(player)
value = SailingSpeed.get(player)
YPosition.update(player, y + value)
end
Hope this helps, happy to answer any other questions you might have!