NetChannel header
Using TCP is the worst possible mistake you can make when developing a multiplayer game.
struct Mage {
int health;
int mana;
}
void Serialize(const Mage* mage) {
SendMessage(reinterpret_cast<const char*>(mage), sizeof(Mage));
}
void Deserialize(const Mage* output) {
ReceiveMessage(reinterpret_cast<char*>(output), sizeof(Mage));
}
Health = 10, Mana = 14; Little Endian
struct Mage : public Streamable {
vector<Item*> items;
int health;
int mana;
void SaveToStream(NetWriter* writer) {
writer->WriteDWord(health);
writer->WriteDWord(mana);
writer->WriteDWord(items.size());
for(auto item : items) item->SaveToStream(writer);
}
void LoadFromStream(NetReader* reader) {
health = reader->ReadDWord();
mana = reader->ReadDWord();
int itemsCount = reader->ReadDWord();
for(int i=0; i<itemsCount; i++) {
items.push_back(new Item(reader));
}
}
}
switch(actionType) {
case OBJECT_CREATED:
int objectType = reader->ReadDWord();
auto factory = creatorManager->FindObjectFactory(objectType);
auto newInstance = factory->CreateInstance(reader); // parse parameters
objects.push_back(newInstance);
break;
case OBJECT_DELETED:
int objectId = reader->ReadDWord();
sceneManager->removeObjectById(objectId);
...
}
Server simulation Client misprediction
Wrong
Correct
It is better to be wrong on time than right but late
Swifty Invasion
A famous explorer once said, that the extraordinary is in what we do, not who we are.