I've amassed quite a lot of text here... just skip below for instructions to recreate the problem.
I noticing something similar happening when I was testing something earlier.
I have noticed for a while now that servers which enforce client builds (for example, my b21 server has mostly default settings, and rejects my b19 client) will fail to eject users at random.
Here's a test I just tried:
1) Start b21 server
2) Try to connect my b19 client a lot of times. Didn't work. On a hunch, I connected 3 build21 clients to the game, then tried to b19 client again -- it worked! (a random guess would be that there's an overflow of data somewhere?)
3) The b19 client was downloading some files my server requires. During this time, they were marked as a BOT.
4) The b19 client finally enters the game and then becomes normal again.
Here's a screenshot of that (the b19 client is newbie -- there are 3 build21 clients and some real bots in the game):
I decided to test it again. The b19 client got into the server again with no problem (although, it keeps getting
unknown command "svextensions" as it connects). I did do the thing where I connected 3 other clients first. At part 3 up there where it was downloading files and marked as a bot, I kicked it. It stayed in the game as sort of a zombie -- here's the server log:
[18:30:34] newbie connected
I enter "sv players"[18:30:34] 0 (5000)] * ironfist
[18:30:34] 1 ] * person2
[18:30:34] 2 ] * person3
[18:30:34] 3 (bot)] * newbie
[18:30:34] 4 (bot)] * ACEBot_4
[18:30:34] 5 (bot)] * ACEBot_3
[18:30:34] 6 (bot)] * ACEBot_2
[18:30:34] 7 (bot)] * ACEBot_1
[18:30:40] 14:00 left in match.
I enter "kick 3"[18:30:42] newbie was kicked
[18:30:45] *Purple's person2 revived!
I enter "sv players"[18:30:45] 0 (5000)] * ironfist
[18:30:45] 1 ] * person2
[18:30:45] 2 ] * person3
[18:30:45] 3 (bot)] * newbie
[18:30:45] 4 (bot)] * ACEBot_4
[18:30:45] 5 (bot)] * ACEBot_3
[18:30:45] 6 (bot)] * ACEBot_2
[18:30:45] 7 (bot)] * ACEBot_1
edit3:In the screenshot, the build is 0. I just want to point out that the client is still reporting its build number in userinfo just fine and that the game library is not changing it either (both of these strings are from *after* the game library had a chance with them):
[18:48:00] newbie connected [127.0.0.1:11271]
Client sends userinfo "\spectator\0\build\19\hand\0\name\newbie\skin\male/pb2b\rate\25000\msg\0\fov\90\gender\male\ip\127.0.0.1:11271" in ClientConnect()Client sends userinfo change "\spectator\0\build\19\hand\0\name\newbie\skin\male/pb2b\rate\25000\msg\0\fov\90\gender\male\ip\127.0.0.1:11271" in ClientUserinfoChanged()And again, "sv players" as the client waits to enter the game (it's downloading stuff)[18:48:00] 0 (5000)] * ironfist
[18:48:00] 1 ] * person2
[18:48:00] 2 ] * person3
[18:48:00] 3 (bot)] * newbie
[18:48:00] 4 (bot)] * ACEBot_4
[18:48:00] 5 (bot)] * ACEBot_3
[18:48:00] 6 (bot)] * ACEBot_2
[18:48:00] 7 (bot)] * ACEBot_1
edit4:I did some other messing around, and this seems to be the easiest way to recreate it:
1) Set maxclients to 8 (I don't think it is important, but I do think that the value of maxclients affects the following)
2) Add 6 bots
3) Connect one build 21 client
4) A build 19 client can now join the game without being rejected (ClientConnect lets them in and no "rejmsg" is specified in the userinfo), but they will be marked as a bot until they enter the game (edit: looks like they magically take a bot slot). You may want to run a map it doesn't have or something.
I tried to do it with 7 bots and no other real clients in the game, but it failed. There's something special about having at least one real client it seems. I am also pretty sure that the b19 client must be connecting when only one more slot is left.
Also, it might be worth note that the client is actually taking the client slot for one of the bots. With 7 of 8 players in the game (2 real clients, 5 bots), the b19 client took the place of one of the bots while it was in the phase between connection and entering the game.