mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2025-07-02 15:55:30 +00:00
Disconnect handler + role sync
This commit is contained in:
parent
ce7abdc960
commit
a85da1e05e
@ -15,7 +15,7 @@ void Respond(const std::string& MSG, ENetPeer*peer){
|
|||||||
}
|
}
|
||||||
|
|
||||||
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::cout << "Sending Code " << Data.at(0) << " length:" << Data.length() << " to all with the self switch : " << All << std::endl;
|
//std::cout << "Sending Code " << Data.at(0) << " length:" << Data.length() << " to all with the self switch : " << All << std::endl;
|
||||||
for (int i = 0; i < server->connectedPeers; i++) {
|
for (int i = 0; i < server->connectedPeers; i++) {
|
||||||
if (All || &server->peers[i] != peer) {
|
if (All || &server->peers[i] != peer) {
|
||||||
//reliable is 1 unreliable is 8
|
//reliable is 1 unreliable is 8
|
||||||
@ -25,6 +25,15 @@ void SendToAll(ENetHost *server, ENetPeer*peer,const std::string& Data, bool All
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnDisconnect(ENetHost *server,ENetPeer*peer){
|
||||||
|
std::string Packet = "Od:" + std::to_string(peer->serverVehicleID[0]);
|
||||||
|
SendToAll(server,peer, Packet,false,true);
|
||||||
|
Packet.clear();
|
||||||
|
peer->DID.clear();
|
||||||
|
peer->Name.clear();
|
||||||
|
peer->VehicleData.clear();
|
||||||
|
}
|
||||||
|
|
||||||
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));
|
enet_peer_send(peer, 0, enet_packet_create ("NR", 3, ENET_PACKET_FLAG_RELIABLE));
|
||||||
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?
|
||||||
|
@ -6,10 +6,12 @@
|
|||||||
#include "enet.hpp"
|
#include "enet.hpp"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <thread>
|
||||||
#include "../logger.h"
|
#include "../logger.h"
|
||||||
#include "../Settings.hpp"
|
#include "../Settings.hpp"
|
||||||
|
|
||||||
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);
|
||||||
void Respond(const std::string& MSG, ENetPeer*peer);
|
void Respond(const std::string& MSG, ENetPeer*peer);
|
||||||
|
|
||||||
void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){
|
void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){
|
||||||
@ -18,12 +20,13 @@ void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){
|
|||||||
switch(Code){ //Spawned Destroyed Switched/Moved Reset
|
switch(Code){ //Spawned Destroyed Switched/Moved Reset
|
||||||
case 's':
|
case 's':
|
||||||
if(Data.at(0) == '0'){
|
if(Data.at(0) == '0'){
|
||||||
Packet = "Os:"+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);
|
||||||
peer->VehicleData = Packet;
|
peer->VehicleData = Packet;
|
||||||
}
|
}
|
||||||
SendToAll(server,peer,Packet,true,true);
|
SendToAll(server,peer,Packet,true,true);
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
|
peer->VehicleData.clear();
|
||||||
SendToAll(server,peer,Packet,true,true);
|
SendToAll(server,peer,Packet,true,true);
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
@ -33,6 +36,7 @@ void VehicleParser(std::string Packet,ENetPeer*peer,ENetHost*server){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncVehicles(ENetHost*server,ENetPeer*peer){
|
void SyncVehicles(ENetHost*server,ENetPeer*peer){
|
||||||
ENetPeer*ENetClient;
|
ENetPeer*ENetClient;
|
||||||
for (int i = 0; i < server->connectedPeers; i++) {
|
for (int i = 0; i < server->connectedPeers; i++) {
|
||||||
@ -46,6 +50,22 @@ void SyncVehicles(ENetHost*server,ENetPeer*peer){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HTTP(ENetPeer*peer){
|
||||||
|
if(peer != nullptr && !peer->DID.empty()){
|
||||||
|
std::string a = HTTP_REQUEST("https://beamng-mp.com/entitlement?did="+peer->DID,443);
|
||||||
|
if(!a.empty()){
|
||||||
|
int pos = a.find('"');
|
||||||
|
peer->Role = a.substr(pos+1,a.find('"',pos+1)-2);
|
||||||
|
if(Debug)debug("ROLE -> " + peer->Role);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GrabRole(ENetPeer*peer){
|
||||||
|
std::thread t1(HTTP,peer);
|
||||||
|
t1.detach();
|
||||||
|
}
|
||||||
|
|
||||||
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 == "TEST")SyncVehicles(server,peer);
|
||||||
@ -56,16 +76,25 @@ void ParseData(ENetPacket*packet, ENetPeer*peer, ENetHost*server){
|
|||||||
Respond("p",peer);
|
Respond("p",peer);
|
||||||
return;
|
return;
|
||||||
case 'N':
|
case 'N':
|
||||||
if(SubCode == 'R')peer->Name = Packet.substr(2);
|
if(SubCode == 'R'){
|
||||||
|
peer->Name = Packet.substr(2,Packet.find(':')-2);
|
||||||
|
peer->DID = Packet.substr(Packet.find(':')+1);
|
||||||
|
GrabRole(peer);
|
||||||
|
}
|
||||||
std::cout << "Name : " << peer->Name << std::endl;
|
std::cout << "Name : " << peer->Name << std::endl;
|
||||||
return;
|
return;
|
||||||
case 'O':
|
case 'O':
|
||||||
std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl;
|
if(Packet.length() > 1000) {
|
||||||
|
std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl;
|
||||||
|
}
|
||||||
VehicleParser(Packet,peer,server);
|
VehicleParser(Packet,peer,server);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//V to Z
|
//V to Z
|
||||||
std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl;
|
if(Packet.length() > 1000){
|
||||||
|
std::cout << "Received data from: " << peer->Name << " Size: " << Packet.length() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
if(Code <= 90 && Code >= 86)SendToAll(server,peer,Packet,false,false);
|
if(Code <= 90 && Code >= 86)SendToAll(server,peer,Packet,false,false);
|
||||||
if(Debug)debug("Data : " + Packet);
|
if(Debug)debug("Data : " + Packet);
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
#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 OnConnect(ENetHost *server,ENetPeer*peer);
|
void OnConnect(ENetHost *server,ENetPeer*peer);
|
||||||
|
|
||||||
ENetPacket* packet;
|
ENetPacket* packet;
|
||||||
int PlayerCount = 0;
|
int PlayerCount = 0;
|
||||||
|
|
||||||
@ -59,15 +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;
|
||||||
// Reset the peer's client information.
|
OnDisconnect(server,event.peer);
|
||||||
event.peer->Name.clear();
|
|
||||||
event.peer->VehicleData.clear();
|
|
||||||
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;
|
||||||
event.peer->Name.clear();
|
OnDisconnect(server,event.peer);
|
||||||
event.peer->VehicleData.clear();
|
|
||||||
break;
|
break;
|
||||||
case ENET_EVENT_TYPE_NONE: break;
|
case ENET_EVENT_TYPE_NONE: break;
|
||||||
}
|
}
|
||||||
|
@ -637,6 +637,8 @@ typedef struct _ENetPeer {
|
|||||||
enet_uint8 incomingSessionID;
|
enet_uint8 incomingSessionID;
|
||||||
ENetAddress address; /**< Internet address of the peer */
|
ENetAddress address; /**< Internet address of the peer */
|
||||||
std::string Name; /**< Application private data, may be freely modified */
|
std::string Name; /**< Application private data, may be freely modified */
|
||||||
|
std::string DID;
|
||||||
|
std::string Role = "USER";
|
||||||
std::string VehicleData;
|
std::string VehicleData;
|
||||||
int gameVehicleID[10] = {0}; //added By Anonymous275
|
int gameVehicleID[10] = {0}; //added By Anonymous275
|
||||||
int serverVehicleID[10] = {0}; //added By Anonymous275
|
int serverVehicleID[10] = {0}; //added By Anonymous275
|
||||||
|
@ -18,7 +18,7 @@ bool Debug = false;
|
|||||||
void addToLog(basic_string<char> Data);
|
void addToLog(basic_string<char> Data);
|
||||||
void HeartbeatInit();
|
void HeartbeatInit();
|
||||||
|
|
||||||
string MapName = "levels/gridmap/level.json";
|
string MapName = "/levels/gridmap/level.json";
|
||||||
bool Private = false;
|
bool Private = false;
|
||||||
int MaxPlayers = 10;
|
int MaxPlayers = 10;
|
||||||
int UDPPort = 30814;
|
int UDPPort = 30814;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user