Bug 2717 - Players who lose connection to the server cause problems
Status: RESOLVED FIXED
Alias: None
Product: Tremulous
Classification: Unclassified
Component: Platform
Version: unspecified
Hardware: All All
: P2 normal
Assignee: Tremulous Bugs
QA Contact:
URL:
: 2833 2906
Depends on:
Blocks:
 
Reported: 2006-05-23 04:40 EDT by Christophe Cavalaria
Modified: 2007-09-23 12:22:48 EDT
3 users (show)

See Also:


Attachments
think every server frame (371 bytes, patch)
2007-06-26 00:43 EDT, M. Kristall

Description Christophe Cavalaria 2006-05-23 04:40:06 EDT
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
Comment 1 rasz 2006-07-20 07:29:52 EDT
just kill them, I mean if someone is timed out for longer than 2-3 seconds automatically kill him, no egg blocking, no weird ghost ppl hanging midair
Comment 2 Christophe Cavalaria 2006-07-20 16:50:45 EDT
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.
Comment 3 rasz 2006-09-04 10:30:13 EDT
(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

Comment 4 Martin Doucha 2006-09-04 15:35:56 EDT
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.
Comment 5 Martin Doucha 2006-09-05 08:36:30 EDT
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.
Comment 6 Tony J. White 2006-12-29 15:53:13 EST
*** Bug 2906 has been marked as a duplicate of this bug. ***
Comment 7 Tim Angus 2006-12-29 18:26:30 EST
*** Bug 2833 has been marked as a duplicate of this bug. ***
Comment 8 M. Kristall 2007-06-26 00:43:05 EDT
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 9 M. Kristall 2007-06-28 06:44:46 EDT
Comment on attachment 1422 [details]
think every server frame

Ignore that.
Comment 10 Tim Angus 2007-09-23 12:22:48 EDT
Fixed in r1006.