mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2026-04-05 15:26:19 +00:00
Vehicle ghost fix, player list fix
This commit is contained in:
@@ -30,16 +30,15 @@ void Respond(Client*c, const std::string& MSG, bool Rel){
|
||||
if(C == 'O' || C == 'T' || MSG.length() > 1000)SendLarge(c,MSG);
|
||||
else TCPSend(c,MSG);
|
||||
}else UDPSend(c,MSG);
|
||||
|
||||
}
|
||||
void SendToAll(Client*c, const std::string& Data, bool Self, bool Rel){
|
||||
if (!Self) {
|
||||
Assert(c);
|
||||
}
|
||||
if (!Self)Assert(c);
|
||||
char C = Data.at(0);
|
||||
for(Client*client : CI->Clients){
|
||||
if(client != nullptr) {
|
||||
if (Self || client != c) {
|
||||
if (client->isSynced || (C == 'O' && Data.at(1) == 's')) {
|
||||
if (client->isSynced) {
|
||||
if (Rel || C == 'W' || C == 'Y' || C == 'V' || C == 'E') {
|
||||
if (C == 'O' || C == 'T' ||
|
||||
Data.length() > 1000)SendLarge(client, Data);
|
||||
|
||||
@@ -2,67 +2,84 @@
|
||||
/// Created by Anonymous275 on 8/1/2020
|
||||
///
|
||||
#include "Security/Enc.h"
|
||||
#include "UnixCompat.h"
|
||||
#include "Compressor.h"
|
||||
#include "Network.h"
|
||||
#include "Logger.h"
|
||||
#include "UnixCompat.h"
|
||||
#include <thread>
|
||||
|
||||
|
||||
void TCPSend(Client*c,const std::string&Data){
|
||||
Assert(c);
|
||||
if(c == nullptr)return;
|
||||
std::string Send = "\n" + Data.substr(0,Data.find(char(0))) + "\n";
|
||||
#ifdef WIN32
|
||||
int Sent;
|
||||
int len = static_cast<int>(Send.size());
|
||||
#else
|
||||
int64_t Sent;
|
||||
size_t len = Send.size();
|
||||
#endif // WIN32
|
||||
Sent = send(c->GetTCPSock(), Send.c_str(), len, 0);
|
||||
if (Sent == 0){
|
||||
if(c->GetStatus() > -1)c->SetStatus(-1);
|
||||
}else if (Sent < 0) {
|
||||
if(c->GetStatus() > -1)c->SetStatus(-1);
|
||||
closesocket(c->GetTCPSock());
|
||||
}
|
||||
auto Size = int32_t(Data.size());
|
||||
std::string Send(4,0);
|
||||
memcpy(&Send[0],&Size,sizeof(Size));
|
||||
Send += Data;
|
||||
Size = int32_t(Send.size());
|
||||
int32_t Sent = 0,Temp;
|
||||
|
||||
do {
|
||||
Temp = send(c->GetTCPSock(), &Send[Sent], Size - Sent, 0);
|
||||
if (Temp == 0) {
|
||||
if (c->GetStatus() > -1)c->SetStatus(-1);
|
||||
return;
|
||||
} else if (Sent < 0) {
|
||||
if (c->GetStatus() > -1)c->SetStatus(-1);
|
||||
closesocket(c->GetTCPSock());
|
||||
return;
|
||||
}
|
||||
Sent += Temp;
|
||||
}while(Sent < Size);
|
||||
}
|
||||
void TCPHandle(Client*c,const std::string& data){
|
||||
|
||||
bool CheckBytes(Client*c,int32_t BytesRcv){
|
||||
Assert(c);
|
||||
#ifdef WIN32
|
||||
__try{
|
||||
#endif // WIN32
|
||||
c->Handler.Handle(c,data);
|
||||
#ifdef WIN32
|
||||
}__except(1){
|
||||
c->Handler.clear();
|
||||
}
|
||||
#endif // WIN32
|
||||
}
|
||||
void TCPRcv(Client*c){
|
||||
Assert(c);
|
||||
if(c == nullptr || c->GetStatus() < 0)return;
|
||||
#define len 4096
|
||||
char buf[len];
|
||||
ZeroMemory(buf, len);
|
||||
int64_t BytesRcv = recv(c->GetTCPSock(), buf, len,0);
|
||||
#undef len
|
||||
if (BytesRcv == 0){
|
||||
debug(Sec("(TCP) Connection closing..."));
|
||||
if(c->GetStatus() > -1)c->SetStatus(-1);
|
||||
return;
|
||||
return false;
|
||||
}else if (BytesRcv < 0) {
|
||||
#ifdef WIN32
|
||||
debug(Sec("(TCP) recv failed with error: ") + std::to_string(WSAGetLastError()));
|
||||
#else // unix
|
||||
debug(Sec("(TCP) recv failed with error: ") + std::string(strerror(errno)));
|
||||
#endif // WIN32
|
||||
#ifdef WIN32
|
||||
debug(Sec("(TCP) recv failed with error: ") + std::to_string(WSAGetLastError()));
|
||||
#else // unix
|
||||
debug(Sec("(TCP) recv failed with error: ") + std::string(strerror(errno)));
|
||||
#endif // WIN32
|
||||
if(c->GetStatus() > -1)c->SetStatus(-1);
|
||||
closesocket(c->GetTCPSock());
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
std::string Buf(buf,(size_t(BytesRcv)));
|
||||
TCPHandle(c,Buf);
|
||||
return true;
|
||||
}
|
||||
|
||||
void TCPRcv(Client*c){
|
||||
Assert(c);
|
||||
static int32_t Header,BytesRcv,Temp;
|
||||
if(c == nullptr || c->GetStatus() < 0)return;
|
||||
#ifdef WIN32
|
||||
BytesRcv = recv(c->GetTCPSock(), reinterpret_cast<char*>(&Header), sizeof(Header),0);
|
||||
#else
|
||||
BytesRcv = recv(c->GetTCPSock(), reinterpret_cast<void*>(&Header), sizeof(Header), 0);
|
||||
#endif
|
||||
if(!CheckBytes(c,BytesRcv))return;
|
||||
char* Data = new char[Header];
|
||||
BytesRcv = 0;
|
||||
do{
|
||||
Temp = recv(c->GetTCPSock(), Data+BytesRcv, Header-BytesRcv,0);
|
||||
if(!CheckBytes(c,Temp)){
|
||||
delete[] Data;
|
||||
return;
|
||||
}
|
||||
BytesRcv += Temp;
|
||||
}while(BytesRcv < Header);
|
||||
std::string Ret = std::string(Data,Header);
|
||||
delete[] Data;
|
||||
if (Ret.substr(0, 4) == "ABG:") {
|
||||
Ret = DeComp(Ret.substr(4));
|
||||
}
|
||||
GParser(c,Ret);
|
||||
}
|
||||
|
||||
void TCPClient(Client*c){
|
||||
DebugPrintTID();
|
||||
Assert(c);
|
||||
|
||||
@@ -101,28 +101,11 @@ int SplitID() {
|
||||
void SendLarge(Client* c, std::string Data) {
|
||||
Assert(c);
|
||||
Data = Data.substr(0, Data.find(char(0)));
|
||||
int ID = PacktID();
|
||||
std::string Packet;
|
||||
if (Data.length() > 1000) {
|
||||
std::string pckt = Data;
|
||||
int S = 1, Split = int(ceil(float(pckt.length()) / 1000));
|
||||
int SID = SplitID();
|
||||
while (pckt.length() > 1000) {
|
||||
Packet = "SC|" + std::to_string(S) + "|" + std::to_string(Split) + "|" + std::to_string(ID) + "|" + std::to_string(SID) + "|" + pckt.substr(0, 1000);
|
||||
DataAcks.insert(new PacketData { ID, c, Packet, 1 });
|
||||
UDPSend(c, Packet);
|
||||
pckt = pckt.substr(1000);
|
||||
S++;
|
||||
ID = PacktID();
|
||||
}
|
||||
Packet = "SC|" + std::to_string(S) + "|" + std::to_string(Split) + "|" + std::to_string(ID) + "|" + std::to_string(SID) + "|" + pckt;
|
||||
DataAcks.insert(new PacketData { ID, c, Packet, 1 });
|
||||
UDPSend(c, Packet);
|
||||
} else {
|
||||
Packet = "BD:" + std::to_string(ID) + ":" + Data;
|
||||
DataAcks.insert(new PacketData { ID, c, Packet, 1 });
|
||||
UDPSend(c, Packet);
|
||||
if (Data.length() > 400) {
|
||||
std::string CMP(Comp(Data));
|
||||
Data = "ABG:" + CMP;
|
||||
}
|
||||
TCPSend(c,Data);
|
||||
}
|
||||
struct HandledC {
|
||||
size_t Pos = 0;
|
||||
|
||||
Reference in New Issue
Block a user