Commit Graph

36 Commits

Author SHA1 Message Date
Regalis
152a92e600 Server removes events if no clients are playing. Otherwise the server would keep creating new events indefinitely and midround-joining clients would instantly get kicked out because they're missing very old events.
+ fixed server not sending midroung sync messages if the list of new (non-unique) events is empty
2017-05-05 00:14:30 +03:00
Regalis
d1c633385b Unique event IDs start from 1 (otherwise the server/clients will think event #0 has been already received) 2017-05-02 22:21:58 +03:00
Regalis
d0b52d92fe Event ID wraparound fixes 2017-05-02 22:18:36 +03:00
Regalis
90f354f6d7 Clients notify the server when they "give in" (i.e. kill their character when unconscious) 2017-04-26 23:39:41 +03:00
Regalis
e94a50a29a The server keeps track of which ID a client is going to switch to when midround syncing is done, and switches the ID immediately when the client is in sync (instead of waiting for the client to report the new ID).
Fixes clients occasionally getting kicked out the moment they're in sync, because their latest received ID is still set to the ID of the last unique event and the server thinks they're requesting some old event that doesn't necessarily exist anymore.

+ added a debug command that creates a ton of entity events
2017-04-08 20:10:15 +03:00
juanjp600
4ad373294c Update client.UnreceivedEntityEventCount on every event write
I noticed that if the main event IDs went over 10000 and there were more than 450 unique events, the server would sometimes skip the next event the client needed. Sometimes the client would also not realize that the last event it received was the final init event, so it would reject all further events because of a huge ID discrepancy. The init events will likely need to be reworked, but updating UnreceivedEntityEventCount seems to help somewhat.
2017-04-06 12:37:38 -03:00
Regalis
dfd24045f8 EntityEventManagers send an empty event if the entity doesn't exist anymore when writing the message (may happen, for example, when a client is still waiting for some message about the item when it's destroyed in a deconstructor).
Not sending the events at all would be a better solution, but then we'd need to shift the IDs of all the consecutive events and make sure it doesn't mess anything up with any of the clients. Not necessarily worth the effort, considering how rare these "empty events" are.
2017-03-24 19:12:09 +02:00
Regalis
8d8620047d Fixed clients who leave a server and re-join becoming desynced and not being kicked by the server.
The clients didn't reset their ChatMessage.LastID, which caused an exception to be thrown when clamping the chatmsg ID server-side, preventing the server from updating the lastRecvEntityEventID of the client later in the method. The server wouldn't kick the client, because ServerEntityEventManager wouldn't handle cases where a client is waiting for an event that doesn't exist anymore.
2017-03-14 22:43:15 +02:00
Regalis
8c659e2a08 Server checks if midround syncing is needed when a client is in the game (i.e. loaded the sub, etc), not when the client requests the start message. Some clients take longer to start the round than others, and they may miss unique messages even if they were in the lobby when the round started.
Clients also get extra 10 seconds to receive newly created events after the midround syncing is done
2017-03-13 21:50:01 +02:00
Regalis
9e3d51edf4 ServerEntityEventManager doesn't prevent creating a duplicate event if the previous one has already been sent to someone, handling exceptions in WriteEvent 2017-03-11 15:39:11 +02:00
Regalis
c851770386 Fixed "trying to read past the buffer size" errors caused by item updates sent by clients, midround syncing timeout period is calculated based on the number of events the client needs to receive 2017-03-11 12:49:08 +02:00
Regalis
6a31d56175 Fixed mid-round joining clients automatically getting kicked out because they're missing old events
Now they're kicked out if they're not in sync within 10 seconds of joining, TODO: calculate a reasonable timeout based on the amount of events and/or give the client more time if they keep receiving events
2017-03-09 21:40:58 +02:00
Regalis
c956e7aa7f Fixed one missed UInt32 -> Uint16 conversion in ServerEntityEventManager 2017-03-09 21:35:02 +02:00
juanjp600
11b7903d4a Fixed some ServerEntityEventManager ID comparisons
I'm probably still missing some comparisons.
2017-03-06 16:31:51 -03:00
juanjp600
29d06bbfc8 Fix build errors 2017-03-06 16:26:52 -03:00
juanjp600
ecb7500df9 Converted UInt32 ID's to UInt16
TODO: test everything, make sure nothing broke
2017-03-06 16:25:12 -03:00
juanjp600
7935ecce46 - fixed crash in UpdateVoteStatus
- fixed clients reconnecting automatically after being kicked for desync
2017-03-01 17:04:51 -03:00
juanjp600
983ab9c05b Fixed potential null exception 2017-03-01 16:42:12 -03:00
juanjp600
e681a2d29a Clients that are waiting for very old events are kicked 2017-03-01 16:40:07 -03:00
Regalis
502211c6a7 Resetting entity event IDs (lastSentToAll & client-specific IDs) when a round ends 2017-02-20 20:26:12 +02:00
Regalis
6c8f5b8999 The server maintains a list of unique EntityEvents created during the round and sends them to clients who join mid-round 2017-02-18 15:09:13 +02:00
Regalis
0e66f2a69c Fixed exceptions in ServerEntityEventManager if there are no clients on the server, clients who are in the lobby can't prevent outdated EntityEvents from being removed 2017-02-18 13:18:48 +02:00
juanjp600
c46856167c Stopped server events that hadn't been sent to everyone from being removed 2017-02-16 20:34:29 -03:00
juanjp600
ae67be1775 Removing "sent" duplicates when a new event is added 2017-02-15 13:48:13 -03:00
Regalis
52bf73722f ServerEntityEventManager doesn't process received events until the character inputs of the client for the corresponding frame have been processed (fixes character movement lagging behind EntityEvents at the servers side)
+ split character networking logic into a separate file, characters drop items at the position of their collider instead of hands
2017-02-09 23:09:42 +02:00
Regalis
9b03b2bcc1 Server ignores UPDATE_INGAME messages if the game isn't running, server doesn't set any of the clients' lastRecvIDs above the ID of the latest chatMsg/event/etc (clients can't have received something the server hasn't sent yet) 2017-01-13 18:07:00 +02:00
Regalis
1eea373117 NetEntityEvent fixes:
- comparing event data equality with Object.Equals instead of == because == returns false for boxed value types
- fixed old unacked messages not being resent if there are newer unacked messages that have been resent less than 1.5 * RTT ago
2017-01-03 20:10:03 +02:00
Regalis
1f454d593e Inventory syncing, objHeader is passed to the ClientRead/ServerRead methods so they can determine how to read the msg (is it an inventory update, position, input, etc) 2016-12-10 16:39:58 +02:00
Regalis
9192dad6ea EntityEventManagers wait for 1.5*roundtriptime before resending messages (less unnecessary resends), skipping to the next event in a packet if an exception is thrown while reading an event 2016-12-09 20:00:41 +02:00
Regalis
bea523187b The host can send chat messages, fixed client not being passed to ServerRead methods 2016-12-09 16:45:08 +02:00
Regalis
e4744e8385 Resetting EventManager IDs when ending the round, NaN/INF check when setting camera position 2016-11-24 20:48:20 +02:00
Regalis
0c9a55e9e0 - server doesn't create a new EntityEvent if there's a duplicate event waiting to be sent
- hull, radar, steering & pump syncing
2016-11-14 16:58:21 +02:00
Regalis
3d234aef73 Sending NetEntityEvents from client to server, ItemComponent class doesn't implement the INetSerializable interfaces (only the derived classes do), reactor syncing 2016-11-13 19:34:23 +02:00
Regalis
724172fe7c Server doesn't attempt to resend unacked EntityEvents until Connection.AverageRoundTripTime has passed 2016-11-13 14:45:00 +02:00
Regalis
498c72c64a Server sends ServerEntityEvents to clients, NetEntityEvents can contain an object array which will be passed to the serializable entity (now only used for ItemComponent indices) 2016-11-13 13:56:48 +02:00
Regalis
c314b37029 Some classes for syncing entity state changes. Similar to the NetworkEvents in the old netcode, but the logic is split into separate classes which prevent the server from reading updates for entities that aren't IClientSerializable.
todo: add NetEntityEventManagers to server & client, some logic to prevent sending events that don't need to be sent (e.g. duplicate event state updates)
2016-11-12 20:56:06 +02:00