🏥
This commit is contained in:
		| @@ -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(); | ||||
|  | ||||
| 			if (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() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user