Fixed timeout, added vehicle data tracker

This commit is contained in:
Anonymous275 2020-05-01 18:42:17 +03:00
parent a85da1e05e
commit 851343eedb
4 changed files with 58 additions and 12 deletions

View File

@ -24,10 +24,23 @@ void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data, bool All
} }
} }
} }
void UpdatePlayers(ENetHost *server,ENetPeer*peer){
std::string Packet = "Ss" + std::to_string(server->connectedPeers)+"/"+std::to_string(MaxPlayers) + ":";
for (int i = 0; i < server->connectedPeers; i++) {
ENetPeer*SPeer = &server->peers[i];
Packet += SPeer->Name + ",";
}
Packet = Packet.substr(0,Packet.length()-1);
SendToAll(server,peer,Packet,true,true);
}
void OnDisconnect(ENetHost *server,ENetPeer*peer){ void OnDisconnect(ENetHost *server,ENetPeer*peer,bool Timed){
std::string Packet = "Od:" + std::to_string(peer->serverVehicleID[0]); std::string Packet = "Od:" + std::to_string(peer->serverVehicleID[0]);
SendToAll(server,peer, Packet,false,true); SendToAll(server,peer, Packet,false,true);
if(Timed)Packet = "L"+peer->Name+" Timed out!";
else Packet = "L"+peer->Name+" Left the server!";
SendToAll(server,peer, Packet,false,true);
UpdatePlayers(server,peer);
Packet.clear(); Packet.clear();
peer->DID.clear(); peer->DID.clear();
peer->Name.clear(); peer->Name.clear();
@ -35,9 +48,9 @@ void OnDisconnect(ENetHost *server,ENetPeer*peer){
} }
void OnConnect(ENetHost *server,ENetPeer*peer){ void OnConnect(ENetHost *server,ENetPeer*peer){
enet_peer_send(peer, 0, enet_packet_create ("NR", 3, ENET_PACKET_FLAG_RELIABLE)); Respond("NR",peer);
peer->serverVehicleID[0] = FindID(server,peer); ///TODO: WHAT IF IT IS THE SECOND VEHICLE? peer->serverVehicleID[0] = FindID(server,peer); ///TODO: WHAT IF IT IS THE SECOND VEHICLE?
std::string ID = "P" + std::to_string(peer->serverVehicleID[0]); std::string ID = "P" + std::to_string(peer->serverVehicleID[0]);
enet_peer_send(peer, 0, enet_packet_create (ID.c_str(), ID.length()+1, ENET_PACKET_FLAG_RELIABLE)); Respond(ID,peer);
if(Debug)debug(peer->Name + " ID : " + std::to_string(peer->serverVehicleID[0])); if(Debug)debug(peer->Name + " ID : " + std::to_string(peer->serverVehicleID[0]));
} }

View File

@ -13,11 +13,25 @@
void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data,bool All, bool Reliable); void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data,bool All, bool Reliable);
std::string HTTP_REQUEST(const std::string& IP,int port); std::string HTTP_REQUEST(const std::string& IP,int port);
void Respond(const std::string& MSG, ENetPeer*peer); void Respond(const std::string& MSG, ENetPeer*peer);
void UpdatePlayers(ENetHost *server,ENetPeer*peer);
void FindAndSync(ENetPeer*peer,ENetHost*server,int VehID){
ENetPeer*ENetClient;
for (int i = 0; i < server->connectedPeers; i++) {
ENetClient = &server->peers[i];
if (ENetClient != peer){
if(ENetClient->serverVehicleID[0] == VehID){
Respond(ENetClient->VehicleData,peer);
}
}
}
}
void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){ void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){
char Code = Packet.at(1); char Code = Packet.at(1);
int ID = -1;
std::string Data = Packet.substr(3); std::string Data = Packet.substr(3);
switch(Code){ //Spawned Destroyed Switched/Moved Reset switch(Code){ //Spawned Destroyed Switched/Moved NotFound Reset
case 's': case 's':
if(Data.at(0) == '0'){ if(Data.at(0) == '0'){
Packet = "Os:"+peer->Role+":"+peer->Name+":"+std::to_string(peer->serverVehicleID[0])+Packet.substr(4); Packet = "Os:"+peer->Role+":"+peer->Name+":"+std::to_string(peer->serverVehicleID[0])+Packet.substr(4);
@ -26,11 +40,22 @@ void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){
SendToAll(server,peer,Packet,true,true); SendToAll(server,peer,Packet,true,true);
break; break;
case 'd': case 'd':
if(Packet.substr(3).find_first_not_of("0123456789") == std::string::npos){
ID = stoi(Packet.substr(3));
}
peer->VehicleData.clear(); peer->VehicleData.clear();
if(ID != -1 && ID == peer->serverVehicleID[0]){
SendToAll(server,peer,Packet,true,true); SendToAll(server,peer,Packet,true,true);
}
break; break;
case 'm': case 'm':
break; break;
case 'n':
if(Packet.substr(3).find_first_not_of("0123456789") == std::string::npos){
ID = stoi(Packet.substr(3));
}
FindAndSync(peer,server,ID);
break;
case 'r': case 'r':
SendToAll(server,peer,Packet,false,true); SendToAll(server,peer,Packet,false,true);
break; break;
@ -56,7 +81,9 @@ void HTTP(ENetPeer*peer){
if(!a.empty()){ if(!a.empty()){
int pos = a.find('"'); int pos = a.find('"');
peer->Role = a.substr(pos+1,a.find('"',pos+1)-2); peer->Role = a.substr(pos+1,a.find('"',pos+1)-2);
if(Debug)debug("ROLE -> " + peer->Role); if(Debug){
debug("ROLE -> " + peer->Role + " ID -> " + peer->DID);
}
} }
} }
} }
@ -68,7 +95,7 @@ void GrabRole(ENetPeer*peer){
void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){ void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){
std::string Packet = (char*)packet->data; std::string Packet = (char*)packet->data;
if(Packet == "TEST")SyncVehicles(server,peer); if(Packet.find("TEST")!=std::string::npos)SyncVehicles(server,peer);
char Code = Packet.at(0),SubCode = 0; char Code = Packet.at(0),SubCode = 0;
if(Packet.length() > 1)SubCode = Packet.at(1); if(Packet.length() > 1)SubCode = Packet.at(1);
switch (Code) { switch (Code) {
@ -79,6 +106,9 @@ void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){
if(SubCode == 'R'){ if(SubCode == 'R'){
peer->Name = Packet.substr(2,Packet.find(':')-2); peer->Name = Packet.substr(2,Packet.find(':')-2);
peer->DID = Packet.substr(Packet.find(':')+1); peer->DID = Packet.substr(Packet.find(':')+1);
Respond("Sn"+peer->Name,peer);
SendToAll(server,peer,"JWelcome "+peer->Name+"!",false,true);
UpdatePlayers(server,peer);
GrabRole(peer); GrabRole(peer);
} }
std::cout << "Name : " << peer->Name << std::endl; std::cout << "Name : " << peer->Name << std::endl;
@ -89,6 +119,9 @@ void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){
} }
VehicleParser(Packet,peer,server); VehicleParser(Packet,peer,server);
return; return;
case 'J':
SendToAll(server,peer,Packet,false,true);
break;
} }
//V to Z //V to Z
if(Packet.length() > 1000){ if(Packet.length() > 1000){

View File

@ -10,7 +10,7 @@
#include "../Settings.hpp" #include "../Settings.hpp"
void ParseData(ENetPacket*packet,ENetPeer*peer,ENetHost *server); //Data Parser void ParseData(ENetPacket*packet,ENetPeer*peer,ENetHost *server); //Data Parser
void OnDisconnect(ENetHost *server,ENetPeer*peer); void OnDisconnect(ENetHost *server,ENetPeer*peer,bool Timed);
void OnConnect(ENetHost *server,ENetPeer*peer); void OnConnect(ENetHost *server,ENetPeer*peer);
ENetPacket* packet; ENetPacket* packet;
int PlayerCount = 0; int PlayerCount = 0;
@ -59,12 +59,12 @@ void host_server(ENetHost *server) {
case ENET_EVENT_TYPE_DISCONNECT: case ENET_EVENT_TYPE_DISCONNECT:
std::cout << event.peer->Name << " disconnected." << std::endl; std::cout << event.peer->Name << " disconnected." << std::endl;
OnDisconnect(server,event.peer); OnDisconnect(server,event.peer,false);
break; break;
case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT: case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT:
std::cout << event.peer->Name << " timed out." << std::endl; std::cout << event.peer->Name << " timed out." << std::endl;
OnDisconnect(server,event.peer); OnDisconnect(server,event.peer,true);
break; break;
case ENET_EVENT_TYPE_NONE: break; case ENET_EVENT_TYPE_NONE: break;
} }

View File

@ -600,8 +600,8 @@ enum {
ENET_PEER_PACKET_LOSS_INTERVAL = 10000, ENET_PEER_PACKET_LOSS_INTERVAL = 10000,
ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024, ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024,
ENET_PEER_TIMEOUT_LIMIT = 32, ENET_PEER_TIMEOUT_LIMIT = 32,
ENET_PEER_TIMEOUT_MINIMUM = 5000, ENET_PEER_TIMEOUT_MINIMUM = 2000,
ENET_PEER_TIMEOUT_MAXIMUM = 30000, ENET_PEER_TIMEOUT_MAXIMUM = 5000,
ENET_PEER_PING_INTERVAL = 500, ENET_PEER_PING_INTERVAL = 500,
ENET_PEER_UNSEQUENCED_WINDOWS = 64, ENET_PEER_UNSEQUENCED_WINDOWS = 64,
ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024, ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024,