When a player has lost his connection to the server ( or crashed probably ) but he wasn't dropped yet, quite a few weird things happen when he is killed :
- his dead body will stay around much longer than usual. It'll show on radar and block spawn/eggs
- game cannot end with a victory for the opposing team until the server drops him
I assume english isn't your native language but which part of "his DEAD body will stay around much longer than usual. It'll show on radar
and block spawn/eggs" didn't you understand ?
Although I have to admit such laggers don't seem they've been causing as much problems as before. Maybe it was a server config or the new server versions.
(In reply to comment #2)
> I assume english isn't your native language but which part of "his DEAD body
> will stay around much longer than usual. It'll show on radar
> and block spawn/eggs" didn't you understand ?
the server seems to think they are NOT dead if they block anything, thats why I said "just kill them", I meant player state
The easy fix would be just letting the lagger die when he's been killed. Here's some interesting info:
- When the lagger dies, player_die() from game/g_combat.c is called and it sets death animation.
- When death animation finishes, SpawnCorpse() from game/g_client.c should be called but it isn't. The lagger hangs in the last frame of death animation until he's dropped.
The problem is between those two function calls. SpawnCorpse() is called from game/g_client.c:respawn(), which is called from game/g_active.c:ClientThink_real(). The question is, what state is the lagger in? There's a million of return statements that won't let ClientThink_real() finish the lagger's death and even more before ClientThink_real() is actually called.
I've made some more call tracing and found out that the server executable calls ClientThink() when new packet is received through server/sv_client.c:SV_UserMove(), server/sv_client.c:SV_ClientThink() and game/g_main.c:vmMain(). No packet means no ClientThink() and that means undead corpse. It also explains why even low latency players may warp.
Created attachment 1422[details]
think every server frame
G_RunClient() is called every server frame. It calls ClientThink_real() if g_synchronousClients is false. I tested this patch on my server and didn't notice any problems with it, and it does prevent the issues mentioned in comment #1.
Comment on attachment 1422 [details] think every server frame Ignore that.