SQC-15_online #1
| @@ -17,9 +17,9 @@ Server::~Server() { | |||||||
| 	if (m_sock_udp) | 	if (m_sock_udp) | ||||||
| 		closesocket(m_sock_udp); | 		closesocket(m_sock_udp); | ||||||
| 	if (m_sock_tcp) | 	if (m_sock_tcp) | ||||||
| 		closesocket(m_sock_tcp);	 | 		closesocket(m_sock_tcp); | ||||||
| 	for (const auto& [key, player] : m_players) | 	for (const auto& [key, player] : m_players) | ||||||
| 			closesocket(player->getSock()); | 		closesocket(player->getSock()); | ||||||
| 	m_players.clear(); | 	m_players.clear(); | ||||||
| 	delete m_world; | 	delete m_world; | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
| @@ -69,15 +69,16 @@ int Server::Init() { | |||||||
| } | } | ||||||
|  |  | ||||||
| int Server::Ready() { | int Server::Ready() { | ||||||
| 	int nbrjoueurs = 0,  | 	int nbrjoueurs = 0, | ||||||
| 		nbrconn = 0; | 		nbrconn = 0; | ||||||
| 	bool readystart = false; | 	bool readystart = false; | ||||||
| 	do { | 	do { | ||||||
| 		Log("Entrez la duree de la partie: ", false, false); | 		Log("Entrez la duree de la partie: ", false, false); | ||||||
| 		std::cin.getline(m_buf.ptr, BUFFER_LENGTH); | 		std::cin.getline(m_buf.ptr, BUFFER_LENGTH); | ||||||
| 		try {	 | 		try { | ||||||
| 			m_game.countdown = std::stoi(m_buf.ptr); | 			m_game.countdown = std::stoi(m_buf.ptr); | ||||||
| 		} catch(const std::exception& e) { | 		} | ||||||
|  | 		catch (const std::exception& e) { | ||||||
| 			Log(e.what(), true, false); | 			Log(e.what(), true, false); | ||||||
| 			m_game.countdown = 0; | 			m_game.countdown = 0; | ||||||
| 		} | 		} | ||||||
| @@ -85,9 +86,10 @@ int Server::Ready() { | |||||||
| 	do { | 	do { | ||||||
| 		Log("Entrez le seed de la partie: ", false, false); | 		Log("Entrez le seed de la partie: ", false, false); | ||||||
| 		std::cin.getline(m_buf.ptr, BUFFER_LENGTH); | 		std::cin.getline(m_buf.ptr, BUFFER_LENGTH); | ||||||
| 		try {	 | 		try { | ||||||
| 			m_game.seed = 9370707;//std::stoi(m_buf.ptr); | 			m_game.seed = 9370707;//std::stoi(m_buf.ptr); | ||||||
| 		} catch(const std::exception& e) { | 		} | ||||||
|  | 		catch (const std::exception& e) { | ||||||
| 			Log(e.what(), true, false); | 			Log(e.what(), true, false); | ||||||
| 			m_game.seed = 0; | 			m_game.seed = 0; | ||||||
| 		} | 		} | ||||||
| @@ -95,9 +97,10 @@ int Server::Ready() { | |||||||
| 	do { | 	do { | ||||||
| 		Log("Entrez le nombre de joueurs: ", false, false); | 		Log("Entrez le nombre de joueurs: ", false, false); | ||||||
| 		std::cin.getline(m_buf.ptr, BUFFER_LENGTH); | 		std::cin.getline(m_buf.ptr, BUFFER_LENGTH); | ||||||
| 		try {	 | 		try { | ||||||
| 			nbrjoueurs = std::stoi(m_buf.ptr); | 			nbrjoueurs = std::stoi(m_buf.ptr); | ||||||
| 		} catch(const std::exception& e) { | 		} | ||||||
|  | 		catch (const std::exception& e) { | ||||||
| 			Log(e.what(), true, false); | 			Log(e.what(), true, false); | ||||||
| 			nbrjoueurs = 0; | 			nbrjoueurs = 0; | ||||||
| 		} | 		} | ||||||
| @@ -113,9 +116,9 @@ int Server::Ready() { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	buildIdList(ID_LIST_SIZE); | 	buildIdList(ID_LIST_SIZE); | ||||||
| 	 |  | ||||||
| 	Log("A l'ecoute sur le port: " + std::to_string(SRV_PORT), false, false); | 	Log("A l'ecoute sur le port: " + std::to_string(SRV_PORT), false, false); | ||||||
| 	 |  | ||||||
| 	while (!readystart) { | 	while (!readystart) { | ||||||
| 		sockaddr_in sockad; | 		sockaddr_in sockad; | ||||||
| 		addrlen_t addrlen = sizeof(sockad); | 		addrlen_t addrlen = sizeof(sockad); | ||||||
| @@ -135,7 +138,7 @@ int Server::Ready() { | |||||||
| 				if (pck.type != PACKET_TYPE::LOGINF) { | 				if (pck.type != PACKET_TYPE::LOGINF) { | ||||||
| 					Log("Paquet invalide.", true, false); | 					Log("Paquet invalide.", true, false); | ||||||
| 					if (pck.type != PACKET_TYPE::ERR) | 					if (pck.type != PACKET_TYPE::ERR) | ||||||
| 						netprot::emptyPack(pck);  | 						netprot::emptyPack(pck); | ||||||
| 					continue; // Passer au prochain appel si c'est pas un LoginInfo ou un LoginInfo invalide qui rentre. | 					continue; // Passer au prochain appel si c'est pas un LoginInfo ou un LoginInfo invalide qui rentre. | ||||||
| 				} | 				} | ||||||
| 				LoginInfo* log = (LoginInfo*)pck.ptr; | 				LoginInfo* log = (LoginInfo*)pck.ptr; | ||||||
| @@ -145,17 +148,17 @@ int Server::Ready() { | |||||||
|  |  | ||||||
| 				Log(str.append(" Nom: ").append(log->name), false, false); | 				Log(str.append(" Nom: ").append(log->name), false, false); | ||||||
| 				str.clear(); | 				str.clear(); | ||||||
| 					 |  | ||||||
|  |  | ||||||
| 				sendPackTo<LoginInfo>(m_sock_udp, log, &m_buf, &sockad); | 				sendPackTo<LoginInfo>(m_sock_udp, log, &m_buf, &sockad); | ||||||
| 				 |  | ||||||
| 				play.id = getUniqueId(); | 				play.id = getUniqueId(); | ||||||
| 				play.tid = log->tid; | 				play.tid = log->tid; | ||||||
| 				strcpy(play.name, log->name); | 				strcpy(play.name, log->name); | ||||||
|  |  | ||||||
| 				Log(str.append(play.name).append(" SID: [").append(std::to_string(log->sid)).append("]") | 				Log(str.append(play.name).append(" SID: [").append(std::to_string(log->sid)).append("]") | ||||||
| 										 .append(" ID: [").append(std::to_string(play.id)).append("]") | 					.append(" ID: [").append(std::to_string(play.id)).append("]") | ||||||
| 									     .append(" TID: [").append(std::to_string(play.tid)).append("]"), false, false); | 					.append(" TID: [").append(std::to_string(play.tid)).append("]"), false, false); | ||||||
| 				play.tid = log->tid; | 				play.tid = log->tid; | ||||||
|  |  | ||||||
| 				sendPackTo<GameInfo>(m_sock_udp, &m_game, &m_buf, &sockad); | 				sendPackTo<GameInfo>(m_sock_udp, &m_game, &m_buf, &sockad); | ||||||
| @@ -174,7 +177,7 @@ int Server::Ready() { | |||||||
| 	for (auto& [keyin, playin] : m_players) // Not pretty, but it works. | 	for (auto& [keyin, playin] : m_players) // Not pretty, but it works. | ||||||
| 		for (auto& [keyout, playout] : m_players) { | 		for (auto& [keyout, playout] : m_players) { | ||||||
| 			if (keyin == keyout) | 			if (keyin == keyout) | ||||||
| 				continue;	 | 				continue; | ||||||
| 			sendPackTo<PlayerInfo>(m_sock_udp, playout->getInfo(), &m_buf, playin->getAddr()); // et envoyer les infos des joueurs distants au nouveau joueur. | 			sendPackTo<PlayerInfo>(m_sock_udp, playout->getInfo(), &m_buf, playin->getAddr()); // et envoyer les infos des joueurs distants au nouveau joueur. | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -207,66 +210,72 @@ void Server::Run() { | |||||||
| 		sync.timestamp = 0; | 		sync.timestamp = 0; | ||||||
| 		sync.timer = m_game.countdown; | 		sync.timer = m_game.countdown; | ||||||
| 		sendPackTo<Sync>(m_sock_udp, &sync, &m_buf, conn->getAddr()); | 		sendPackTo<Sync>(m_sock_udp, &sync, &m_buf, conn->getAddr()); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 		int timer = m_game.countdown, sync_acc = 0; | 	int timer = m_game.countdown, sync_acc = 0; | ||||||
| 		std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now(); | 	std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now(); | ||||||
| 		Timestamp last = 0; | 	Timestamp last = 0; | ||||||
|  | 	std::vector<Chat> chatlog; | ||||||
|  |  | ||||||
| 		while (!endgame) { | 	while (!endgame) { | ||||||
| 			using namespace std::chrono; | 		using namespace std::chrono; | ||||||
| 			Timestamp tstamp = duration_cast<milliseconds>(high_resolution_clock::now() - start).count(); | 		Timestamp tstamp = duration_cast<milliseconds>(high_resolution_clock::now() - start).count(); | ||||||
|  |  | ||||||
| 			if (last == 0) | 		if (last == 0) | ||||||
| 				last = tstamp; | 			last = tstamp; | ||||||
| 			sync_acc += tstamp - last; | 		sync_acc += tstamp - last; | ||||||
| 			if (sync_acc >= 1000) { | 		if (sync_acc >= 1000) { | ||||||
| 				sync_acc -= 1000; | 			sync_acc -= 1000; | ||||||
| 				--timer; | 			--timer; | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			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. | 		for (auto& [key, conn] : m_players) { | ||||||
|  | 			int deadplayers = 0; | ||||||
|  | 			std::vector<char*> lsPck; | ||||||
|  | 			Input in; Chat chat; 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: | ||||||
|  | 					if (Deserialize(&chat, pck, &bsize)) | ||||||
|  | 						chatlog.push_back(chat); | ||||||
|  | 					break; | ||||||
|  | 				default: break; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			lsPck.clear(); | ||||||
|  |  | ||||||
|  | 			if (conn->m_nsync) { | ||||||
|  | 				if (conn->player->AmIDead()) { | ||||||
|  | 					++deadplayers; | ||||||
|  | 					conn->m_nsync == false; | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				conn->Run(m_world); | ||||||
|  | 				conn->sendPacks(m_sock_udp, m_players, timer); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			if (deadplayers == players - 1 || timer <= 0) | ||||||
|  | 				endgame = true; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		for (auto& chat : chatlog) | ||||||
|  | 			for (auto& [key, conn] : m_players) | ||||||
|  | 				sendPackTo<Chat>(m_sock_udp, &chat, &m_buf, conn->getAddr()); | ||||||
|  | 		chatlog.clear(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: Gérer les 2-3 secondes post-game avant le billboard pour pas avoir un whiplash à la fin de la game. | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| inline std::string Server::LogTimestamp() { | inline std::string Server::LogTimestamp() { | ||||||
| @@ -291,13 +300,13 @@ inline std::string Server::LogTimestamp() { | |||||||
| void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) { | void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) { | ||||||
| 	switch (m_log) { | 	switch (m_log) { | ||||||
| 		using enum LOG_DEST; // C++20! | 		using enum LOG_DEST; // C++20! | ||||||
| 		case LOGFILE: | 	case LOGFILE: | ||||||
| 			m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; | 		m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; | ||||||
| 			break; | 		break; | ||||||
| 		case CONSOLE: [[fallthrough]]; // Pour dire que c'est voulu que ça traverse vers le case en dessous (C++17!) | 	case CONSOLE: [[fallthrough]]; // Pour dire que c'est voulu que ça traverse vers le case en dessous (C++17!) | ||||||
| 		default: | 	default: | ||||||
| 			std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; | 		std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl; | ||||||
| 			break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (is_fatal) { | 	if (is_fatal) { | ||||||
| @@ -325,7 +334,7 @@ void Server::buildIdList(size_t size) { | |||||||
| 	srand(time(NULL)); | 	srand(time(NULL)); | ||||||
| 	do lst.insert(((uint64_t)rand() << 32 | rand())); | 	do lst.insert(((uint64_t)rand() << 32 | rand())); | ||||||
| 	while (lst.size() < size); | 	while (lst.size() < size); | ||||||
| 	 |  | ||||||
| 	m_ids = std::vector<uint64_t>(lst.begin(), lst.end()); | 	m_ids = std::vector<uint64_t>(lst.begin(), lst.end()); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1339,8 +1339,6 @@ void Engine::Render(float elapsedTime) { | |||||||
| 							if (diff.y < 1.) | 							if (diff.y < 1.) | ||||||
| 								diff.y = 0; | 								diff.y = 0; | ||||||
|  |  | ||||||
| 							//std::cout << sync.timestamp << " ms: " << comp.position << " - " << sync.position << " Diff: " << diff.Length() << std::endl; |  | ||||||
|  |  | ||||||
| 							if (diff.Length() > 1.5) { | 							if (diff.Length() > 1.5) { | ||||||
| 								diff.Normalize(); | 								diff.Normalize(); | ||||||
| 								m_player.Move(-diff); | 								m_player.Move(-diff); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user