Flatline
This project is no longer under development. |
|
The Flatline Project was the second fan-made attempt at Multiplayer for Oni. It combined the knowledge gleaned from projects such as OniPlayer and Neo's engine hacking with new techniques of controlling AI characters to create the first working Multiplayer since the early days of Oni's development.
Status: Development is halted.
Packets
For now, all packets are UDP, though some of the less time essential packets (messages, commands, etc...) will probably be moved to TCP.
Structure
typedef struct { char id; int packet_index; char data[1080]; } flatline_packet;
- id is an identifier the specific type of packet being sent (message, character sync, initial connection, etc...)
- packet_index is used to protect against duplicate packets. Each packet gets a unique indentifier, if a duplicate is found, the packet is ignored.
- data contains the actual data for the packet, and is typically cast to another struct. The largest struct needed so far is 1080 bytes. In theory, we can go up to 1400 bytes.
Connecting
- Client sends a packet asking to connect to a server
- Server sends a packet back, saying if the client can connect or not, including a string to display if the connection was rejected
- Client either recieves said packet or times out after 15 seconds if no packet is recieved back (sending a new connection request packet every so often before that).
- Server sends basic game info to client, including a packet containing a mock BINACHAR for each player currently connected to the server.
- Client sends packets containing keystrokes and other commands
- Server sends back xyz\animation\whatever data
Maps
Probably done through level plugins that use levels 64-127. This has the advantage of being hidden on the level list. These maps would have specialized CHAR\PART\whatever tailored to MP gameplay. Of course a console map change command would need to be implemented. (win\lose level, and change current level number, through hex overwriting)
Lag Compensation
Quick and dirty lag compensation might come from "fast-forwarding" a frame for every 17 ms of lag or so. ( 17ms = 1 frame...damn that's short :( ) Compensating for rotation\movement differences will be a bit harder, and require a bit more calculation.