@@ -170,11 +170,10 @@ int Server::Ready() {
}
}
}
for ( auto & [ keyin , playin ] : m_players )
for ( auto & [ keyin , playin ] : m_players ) // Not pretty, but it works.
for ( auto & [ keyout , playout ] : m_players ) {
if ( keyin = = keyout )
continue ;
//sendPackTo<PlayerInfo>(m_sock_udp, &play, &m_buf, &sockad); // Envoyer les infos de joueur distant aux joueurs d<> j<EFBFBD> connect<63> s
continue ;
sendPackTo < PlayerInfo > ( m_sock_udp , playout - > getInfo ( ) , & m_buf , playin - > getAddr ( ) ) ; // et envoyer les infos des joueurs distants au nouveau joueur.
}
@@ -186,7 +185,7 @@ void Server::Run() {
Input in ;
sockaddr_in sockad ;
addrlen_t socklen = sizeof ( sockad ) ;
Log ( " Debut de la partie... " , false , false ) ;
int players = m_players . size ( ) ;
@@ -195,9 +194,10 @@ void Server::Run() {
m_world - > SetSeed ( m_game . seed ) ;
m_world - > GetChunks ( ) . Reset ( nullptr ) ;
m_world - > BuildWorld ( ) ;
for ( auto & [ key , conn ] : m_players ) { // Creation des instances de joueurs et premier sync.
conn - > player = std : : make_unique < Player > ( Vector3f ( .5f , CHUNK_SIZE_Y + 1.8f , .5f ) ) ;
int x = rand ( ) % ( CHUNK_SIZE_X + WORLD_SIZE_X - 1 ) , y = rand ( ) % ( CHUNK_SIZE_Y + WORLD_SIZE_Y - 1 ) ;
conn - > player = std : : make_unique < Player > ( Vector3f ( x + .5f , CHUNK_SIZE_Y + 1.8f , y + .5f ) ) ;
Sync sync ;
sync . position = conn - > player - > GetPositionAbs ( ) ;
sync . hp = conn - > player - > GetHP ( ) ;
@@ -206,65 +206,67 @@ void Server::Run() {
sync . timestamp = 0 ;
sync . timer = m_game . countdown ;
sendPackTo < Sync > ( m_sock_udp , & sync , & m_buf , conn - > getAddr ( ) ) ;
}
while ( ! endgame ) {
for ( auto & [ key , conn ] : m_players ) {
std : : vector < char * > lsPck ;
Input in ;
Sync sync ;
lsPck = recvPacks ( m_sock_udp , & m_buf ) ;
for ( auto & pck : lsPck ) {
uint32_t bsize = m_buf . len - ( pck - m_buf . ptr ) ;
switch ( netprot : : getType ( pck , 1 ) ) {
using enum netprot : : PACKET_TYPE ;
case INPUT :
if ( Deserialize ( & in , pck , & bsize ) ) {
m_players [ in . sid ] - > AddInput ( in ) ;
}
break ;
case SYNC :
if ( Deserialize ( & sync , pck , & bsize ) ) { }
break ;
default : break ;
}
int timer = m_game . countdown , sync_acc ;
std : : chrono : : high_resolution_clock : : time_point start = std : : chrono : : high_resolution_clock : : now ( ) ;
Timestamp last = 0 ;
int sync_acc = 0 ;
while ( ! endgame ) {
using namespace std : : chrono ;
Timestamp tstamp = duration_cast < milliseconds > ( high_resolution_clock : : now ( ) - start ) . count ( ) ;
if ( last = = 0 )
last = tstamp ;
sync_acc + = tstamp - last ;
if ( sync_acc > = 1000 ) {
sync_acc - = 1000 ;
- - timer ;
}
lsPck . clear ( ) ;
i f ( conn - > m_nsync ) {
conn - > Run ( m_world ) ;
conn - > sendPacks ( m_sock_udp , m_players , 0 ) ;
for ( auto & [ key , conn ] : m_players ) {
int deadplayers = 0 ;
std : : vector < char * > lsPck ;
Input in ;
Sync sync ;
lsPck = recvPacks ( m_sock_udp , & m_buf ) ;
for ( auto & pck : lsPck ) {
uint32_t bsize = m_buf . len - ( pck - m_buf . ptr ) ;
switch ( netprot : : getType ( pck , 1 ) ) {
using enum netprot : : PACKET_TYPE ;
case INPUT :
if ( Deserialize ( & in , pck , & bsize ) ) {
m_players [ in . sid ] - > AddInput ( in ) ;
}
break ;
case SYNC :
if ( Deserialize ( & sync , pck , & bsize ) ) { }
break ;
case CHAT :
// TODO: Pitcher les chats à tous le monde.
break ;
default : break ;
}
}
lsPck . clear ( ) ;
if ( conn - > m_nsync ) {
if ( conn - > player - > AmIDead ( ) ) {
+ + deadplayers ;
continue ;
}
conn - > Run ( m_world ) ;
conn - > sendPacks ( m_sock_udp , m_players , timer ) ;
}
if ( deadplayers = = players - 1 | | timer < = 0 )
endgame = true ;
}
}
// TODO: Gérer les 2-3 secondes post-game avant le billboard pour pas avoir un whiplash à la fin de la game.
}
//while (true) {
// if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) {
// Packet pck = getPack(&m_buf);
// switch (pck.type) {
// using enum netprot::PACKET_TYPE;
// case ERR: std::puts("ERROR!"); break;
// case INPUT: std::puts("INPUT!"); break;
// case OUTPUT: std::puts("OUTPUT!"); break;
// case SYNC: std::puts("SYNC!"); break;
// case TEAMINF: std::puts("TEAMINF!"); break;
// case SELFINF: std::puts("SELFINF!"); break;
// case PLAYINF: std::puts("PLAYINF!"); break;
// case LOGINF: std::puts("LOGINF!"); break;
// case CHUNKMOD: std::puts("CHUNKMOD!"); break;
// case PLAYERMOD: std::puts("PLAYERMOD!"); break;
// case PICKUPMOD: std::puts("PICKUPMOD!"); break;
// case GAMEINFO: std::puts("GAMEINFO!"); break;
// case ENDINFO: std::puts("ENDINFO!"); break;
// case CHAT: std::puts("CHAT!"); break;
// case ERRLOG: std::puts("ERRLOG!"); break;
// case LAST_PACK: [[falltrough]];
// default: std::puts("wtf?!"); break;
// }
// netprot::emptyPack(pck);
// }
//}
}
inline std : : string Server : : LogTimestamp ( ) {