Sounds like a perfect job for the handshake hook which still isn't implemented yet! XD
The cProtocol::ParseHandshake() kicks the player when the server is full, but it should also call a hook.
Then you can create a plugin for this.
Return true when you want to override default behaviour. Returning true will not kick the player and allow the player to join.
If you want to override default behaviour and still kick the player (for whatever reason you have, banned player perhaps) you should manually kick the player in the plugin.
Return false for default behaviour, which means let the player join when there's enough room, and otherwise kick the player
The cProtocol::ParseHandshake() kicks the player when the server is full, but it should also call a hook.
Then you can create a plugin for this.
Return true when you want to override default behaviour. Returning true will not kick the player and allow the player to join.
If you want to override default behaviour and still kick the player (for whatever reason you have, banned player perhaps) you should manually kick the player in the plugin.
Return false for default behaviour, which means let the player join when there's enough room, and otherwise kick the player