Let's discuss here!
Thomas' original proposal: "It is not really an issue, it's more an idea that popped in my head. Feel free (not?) to use it.
The gameLoop maintains, for each entity, their "intentions" (eg. I want to move in this direction, I want to attack left, ...). All incoming events are processed as soon as they are received, but they don't modify the actual gameContent. Instead, they modify these intentions. And then, at each game frame, the gameLoop goes through all the entities of the gameState, get their intentions and try to apply them to the gameContent. It then send Events to the clients, so that they can update their gameContent.
I think it is simple, but enforces the game frame constraints you wanted.
To add an example, imagine that, between 2 gameFrames, the gameLoop receives 2 move events from the same entities. With this system of intentions, the second event overwrite the intention the first one set, and the next gameFrame will only consider the intention generated by the second event. Of course, the time between 2 gameFrames must be short enough not to make the game unplayable."