diff --git a/CMakeLists.txt b/CMakeLists.txt index cb40b5c..6ecfbdb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ include_directories(${PROJECT_SOURCE_DIR}/curl) set(CMAKE_CXX_STANDARD 14) add_executable(BeamMP-Server src/main.cpp src/http.cpp src/logger.cpp src/config.cpp src/Network/Server.cpp - src/Network/enet.h src/Network/DataParser.cpp src/heartbeat.cpp + src/Network/enet.hpp src/Network/DataParser.cpp src/heartbeat.cpp src/Network/ClientHandler.cpp src/Network/functions.cpp src/Settings.hpp src/Resources.cpp src/Network/TCPClientHandler.cpp) target_link_libraries(BeamMP-Server winmm ws2_32 libcurl_a) \ No newline at end of file diff --git a/src/Network/ClientHandler.cpp b/src/Network/ClientHandler.cpp index f5ba4c9..e9ab4bd 100644 --- a/src/Network/ClientHandler.cpp +++ b/src/Network/ClientHandler.cpp @@ -2,39 +2,29 @@ /// Created by Anonymous275 on 2/4/2020. /// -#include "enet.h" #include +#include "enet.hpp" #include #include +#include "../logger.h" +#include "../Settings.hpp" -void NameRequest(ENetPeer*peer){ - ENetPacket* packet = enet_packet_create ("NameRequest", //Send A Name Request to the Client - strlen ("NameRequest") + 1, - ENET_PACKET_FLAG_RELIABLE); //Create A reliable packet using the data - enet_peer_send(peer, 0, packet); -} void Respond(const std::string& MSG, ENetPeer*peer){ enet_peer_send(peer, 0, enet_packet_create(MSG.c_str(), MSG.length() + 1, ENET_PACKET_FLAG_RELIABLE)); } -void SendToAll(ENetHost *server,ENetEvent event){ - ENetPacket* packet; +void SendToAll(ENetHost *server, ENetPeer*peer, const std::string& Data, bool All){ for (int i = 0; i < server->connectedPeers; i++) { - //if (&server->peers[i] != event.peer) { if you don't want to send it to the person ho just connected - char Data[500]; - sprintf(Data,"There is %zu Players Connected!",server->connectedPeers); - printf("test %d\n",server->peers[i].serverVehicleID); - - packet = enet_packet_create(Data, strlen(Data)+1, 0); - - enet_peer_send(&server->peers[i], 0, packet); + if (All || &server->peers[i] != peer) { + enet_peer_send(&server->peers[i], 0, enet_packet_create(Data.c_str(),Data.length()+1, ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT)); enet_host_flush(server); - //} + } } } void OnConnect(ENetPeer*peer){ - ENetPacket* packet = enet_packet_create ("NR", 3,ENET_PACKET_FLAG_RELIABLE); //Create A reliable packet using the data - enet_peer_send(peer, 0, packet); - std::cout << "ID : " << peer->serverVehicleID << std::endl; + enet_peer_send(peer, 0, enet_packet_create ("NR", 3, ENET_PACKET_FLAG_RELIABLE)); + //std::string ID = "P" + std::to_string(peer->serverVehicleID); /////HOLDUP + //enet_peer_send(peer, 0, enet_packet_create (ID.c_str(), ID.length()+1, ENET_PACKET_FLAG_RELIABLE)); + //if(Debug)debug("ID : " + std::to_string(peer->serverVehicleID)); } diff --git a/src/Network/DataParser.cpp b/src/Network/DataParser.cpp index f861e35..e058b96 100644 --- a/src/Network/DataParser.cpp +++ b/src/Network/DataParser.cpp @@ -2,14 +2,45 @@ /// Created by Anonymous275 on 4/2/2020 /// -#include "enet.h" -#include #include +#include "enet.hpp" #include +#include #include "../logger.h" +#include "../Settings.hpp" +std::vector Split(const std::string& String,const std::string& delimiter); +void SendToAll(ENetHost *server, ENetPeer*peer, const std::string& Data,bool All); void Respond(const std::string& MSG, ENetPeer*peer); -void ParseData(ENetPacket*packet, ENetPeer*peer){ +int FindID(ENetHost *server,ENetPeer*peer); + +void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){ + char Code = Packet.at(1); + std::string Data = Packet.substr(3); + std::vector vector = Split(Packet,":"); + switch(Code){ //Spawned Destroyed Switched/Moved Reset + case 's': + if(!stoi(vector.at(0))){ + peer->serverVehicleID[0] = FindID(server,peer); ///TODO: WHAT IF IT IS THE SECOND VEHICLE?! + vector.at(1) = std::to_string(peer->serverVehicleID[0]); + Packet.clear(); + for(const std::string&a : vector)Packet += a + ":"; + Packet = Packet.substr(0,Packet.length()-1); + } + SendToAll(server,peer,Packet,true); + break; + case 'd': + SendToAll(server,peer,Packet,true); + break; + case 'm': + break; + case 'r': + SendToAll(server,peer,Packet,true); + break; + } +} + +void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){ std::string Packet = (char*)packet->data; char Code = Packet.at(0),SubCode = 0; if(Packet.length() > 1)SubCode = Packet.at(1); @@ -18,9 +49,16 @@ void ParseData(ENetPacket*packet, ENetPeer*peer){ Respond("p",peer); return; case 'N': - if(SubCode == 'R')peer->Name = (void *)Packet.substr(2).c_str(); - std::cout << "Name : " << (char *)peer->Name << std::endl; + if(SubCode == 'R')peer->Name = Packet.substr(2); + std::cout << "Name : " << peer->Name << std::endl; + return; + case 'O': + std::cout << peer->Name << " : " << Packet << std::endl; + VehicleParser(Packet,peer,server); return; } - std::cout << "Data : " << Packet << std::endl; + //V to Z + std::cout << peer->Name << " : " << Packet << std::endl; + if(Code <= 90 && Code >= 86)SendToAll(server,peer,Packet,false); + if(Debug)debug("Data : " + Packet); } diff --git a/src/Network/Server.cpp b/src/Network/Server.cpp index 010537b..2546055 100644 --- a/src/Network/Server.cpp +++ b/src/Network/Server.cpp @@ -3,29 +3,31 @@ /// #define ENET_IMPLEMENTATION -#include "enet.h" #include +#include "enet.hpp" #include #include "../logger.h" #include "../Settings.hpp" -void ParseData(ENetPacket*packet,ENetPeer*peer); //Data Parser +void ParseData(ENetPacket*packet,ENetPeer*peer,ENetHost *server); //Data Parser void OnConnect(ENetPeer*peer); ENetPacket* packet; int PlayerCount = 0; int FindID(ENetHost *server,ENetPeer*peer){ - int OpenID = 1; + int OpenID = 1, *p; bool Found; do { Found = true; for (int i = 0; i < server->connectedPeers; i++) { if (&server->peers[i] != peer) { - if(server->peers[i].serverVehicleID == OpenID){ - Found = false; - OpenID++; - break; + for(p=server->peers[i].serverVehicleID; p<(&server->peers[i].serverVehicleID)[1]; p++){ + if(*p == OpenID) { + Found = false; + OpenID++; + break; + } } } } @@ -42,31 +44,29 @@ void host_server(ENetHost *server) { case ENET_EVENT_TYPE_CONNECT: printf("A new client connected from %x:%u.\n", event.peer->address.host, event.peer->address.port); //the data should be the client info could be name for now it's Client information - event.peer->Name = (void *)"Client information"; - event.peer->gameVehicleID[0] = 0; - event.peer->serverVehicleID = FindID(server, event.peer); + event.peer->Name = "Client information"; + /*event.peer->gameVehicleID[0] = 0; + event.peer->serverVehicleID[0] = FindID(server, event.peer);*/ OnConnect(event.peer); break; case ENET_EVENT_TYPE_RECEIVE: - - ParseData(event.packet,event.peer); + ParseData(event.packet,event.peer,server); /*->dataLength,event.packet->data, (char *)event.peer->data, event.channelID*/ //We grab and Parse the Data /* Clean up the packet now that we're done using it. */ enet_packet_destroy (event.packet); break; case ENET_EVENT_TYPE_DISCONNECT: - printf ("%s disconnected.\n", (char *)event.peer->Name); + std::cout << event.peer->Name << " disconnected." << std::endl; // Reset the peer's client information. - event.peer->Name = nullptr; + event.peer->Name.clear(); break; case ENET_EVENT_TYPE_DISCONNECT_TIMEOUT: - printf ("%s timed out.\n", (char *)event.peer->Name); - event.peer->Name = nullptr; + std::cout << event.peer->Name << " timed out." << std::endl; + event.peer->Name.clear(); break; - case ENET_EVENT_TYPE_NONE: break; } } diff --git a/src/Network/enet.h b/src/Network/enet.hpp similarity index 99% rename from src/Network/enet.h rename to src/Network/enet.hpp index 452146d..36c4344 100644 --- a/src/Network/enet.h +++ b/src/Network/enet.hpp @@ -92,7 +92,6 @@ #include #include #include - #include #if defined(_WIN32) && defined(_MSC_VER) @@ -637,9 +636,9 @@ typedef struct _ENetPeer { enet_uint8 outgoingSessionID; enet_uint8 incomingSessionID; ENetAddress address; /**< Internet address of the peer */ - void * Name; /**< Application private data, may be freely modified */ - int gameVehicleID[50]; //added By Anonymous275 - int serverVehicleID; //added By Anonymous275 + std::string Name; /**< Application private data, may be freely modified */ + int gameVehicleID[10] = {0}; //added By Anonymous275 + int serverVehicleID[10] = {0}; //added By Anonymous275 ENetPeerState state; ENetChannel * channels; size_t channelCount; /**< Number of channels allocated for communication with peer */ @@ -3441,11 +3440,11 @@ extern "C" { } void * enet_peer_get_data(ENetPeer *peer) { - return (void *) peer->Name; + return (void *) peer->Name.c_str(); } void enet_peer_set_data(ENetPeer *peer, const void *Name) { - peer->Name = (enet_uint32 *) Name; + peer->Name = (char *) Name; } void * enet_packet_get_data(ENetPacket *packet) { @@ -4421,7 +4420,7 @@ extern "C" { currentPeer->host = host; currentPeer->incomingPeerID = currentPeer - host->peers; currentPeer->outgoingSessionID = currentPeer->incomingSessionID = 0xFF; - currentPeer->Name = NULL; + currentPeer->Name.clear(); enet_list_clear(¤tPeer->acknowledgements); enet_list_clear(¤tPeer->sentReliableCommands); diff --git a/src/Settings.hpp b/src/Settings.hpp index 783f028..4052c9e 100644 --- a/src/Settings.hpp +++ b/src/Settings.hpp @@ -3,6 +3,7 @@ /// extern bool Private; +extern bool Debug; extern int MaxPlayers; extern int UDPPort; extern int TCPPort; diff --git a/src/logger.h b/src/logger.h index dde6d54..7118a7f 100644 --- a/src/logger.h +++ b/src/logger.h @@ -1,6 +1,6 @@ -// -// Created by Anonymous275 on 4/2/2020. -// +/// +/// Created by Anonymous275 on 4/2/2020. +/// #include #include