mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-08 17:57:02 +08:00
fix: build fail on windows
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -42,4 +42,5 @@ CMakeError.log
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
assets/config.toml
|
assets/config.toml
|
||||||
.venv/
|
.venv/
|
||||||
pyout/
|
pyout/
|
||||||
|
vcpkg_installed/
|
||||||
@@ -69,6 +69,11 @@ target_compile_definitions(${PROJECT_NAME}
|
|||||||
ASIO_STANDALONE
|
ASIO_STANDALONE
|
||||||
ASIO_NO_DEPRECATED
|
ASIO_NO_DEPRECATED
|
||||||
$<$<CONFIG:Debug>:DEBUG_MODE>
|
$<$<CONFIG:Debug>:DEBUG_MODE>
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:
|
||||||
|
WIN32_LEAN_AND_MEAN
|
||||||
|
NOMINMAX
|
||||||
|
_CRT_SECURE_NO_WARNINGS
|
||||||
|
>
|
||||||
)
|
)
|
||||||
|
|
||||||
if(CMAKE_CONFIGURATION_TYPES)
|
if(CMAKE_CONFIGURATION_TYPES)
|
||||||
@@ -119,6 +124,7 @@ target_link_libraries(${PROJECT_NAME}
|
|||||||
absl::log
|
absl::log
|
||||||
absl::check
|
absl::check
|
||||||
zstd::zstd
|
zstd::zstd
|
||||||
|
$<$<PLATFORM_ID:Windows>:ws2_32>
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,14 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#ifdef _WIN32
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@@ -23,11 +30,10 @@ enum class CompressType : uint16_t {
|
|||||||
|
|
||||||
inline CompressType get_compress_type(uint16_t id) {
|
inline CompressType get_compress_type(uint16_t id) {
|
||||||
using enum CompressType;
|
using enum CompressType;
|
||||||
constexpr auto& to = std::to_underlying<CompressType>;
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case to(NONE):
|
case std::to_underlying(NONE):
|
||||||
return NONE;
|
return NONE;
|
||||||
case to(ZSTD):
|
case std::to_underlying(ZSTD):
|
||||||
return ZSTD;
|
return ZSTD;
|
||||||
}
|
}
|
||||||
throw std::runtime_error(std::format("Unknown CompressType {}", id));
|
throw std::runtime_error(std::format("Unknown CompressType {}", id));
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
|
|
||||||
namespace Logger {
|
namespace Logger {
|
||||||
enum class Level { TRACE, DEBUG, INFO, ERROR, WARN };
|
enum class Level { L_TRACE, L_DEBUG, L_INFO, L_ERROR, L_WARN };
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
inline void info(std::format_string<Args...> fmt, Args&&... args) {
|
inline void info(std::format_string<Args...> fmt, Args&&... args) {
|
||||||
@@ -53,7 +53,7 @@ inline void log(Level level, std::source_location loc,
|
|||||||
std::chrono::system_clock::now());
|
std::chrono::system_clock::now());
|
||||||
std::string msg = std::vformat(fmt.get(), std::make_format_args(args...));
|
std::string msg = std::vformat(fmt.get(), std::make_format_args(args...));
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case Logger::Level::TRACE:
|
case Logger::Level::L_TRACE:
|
||||||
std::osyncstream(std::cout)
|
std::osyncstream(std::cout)
|
||||||
<< "\033[1;34m"
|
<< "\033[1;34m"
|
||||||
<< std::format("[TRACE][{:%Y-%m-%d %H:%M:%S}]", now_time) << "["
|
<< std::format("[TRACE][{:%Y-%m-%d %H:%M:%S}]", now_time) << "["
|
||||||
@@ -61,20 +61,20 @@ inline void log(Level level, std::source_location loc,
|
|||||||
<< "[" << loc.function_name() << "]" << msg << "\033[0m"
|
<< "[" << loc.function_name() << "]" << msg << "\033[0m"
|
||||||
<< "\n";
|
<< "\n";
|
||||||
break;
|
break;
|
||||||
case Logger::Level::DEBUG:
|
case Logger::Level::L_DEBUG:
|
||||||
std::osyncstream(std::cout)
|
std::osyncstream(std::cout)
|
||||||
<< "\033[1;34m"
|
<< "\033[1;34m"
|
||||||
<< std::format("[DEBUG][{:%Y-%m-%d %H:%M:%S}]", now_time) << msg
|
<< std::format("[DEBUG][{:%Y-%m-%d %H:%M:%S}]", now_time) << msg
|
||||||
<< "\033[0m"
|
<< "\033[0m"
|
||||||
<< "\n";
|
<< "\n";
|
||||||
break;
|
break;
|
||||||
case Logger::Level::INFO:
|
case Logger::Level::L_INFO:
|
||||||
info(fmt, std::forward<Args>(args)...);
|
info(fmt, std::forward<Args>(args)...);
|
||||||
break;
|
break;
|
||||||
case Logger::Level::WARN:
|
case Logger::Level::L_WARN:
|
||||||
warn(fmt, std::forward<Args>(args)...);
|
warn(fmt, std::forward<Args>(args)...);
|
||||||
break;
|
break;
|
||||||
case Logger::Level::ERROR:
|
case Logger::Level::L_ERROR:
|
||||||
error(fmt, std::forward<Args>(args)...);
|
error(fmt, std::forward<Args>(args)...);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,10 +96,10 @@ void App::handle_argument(int argc, char** argv) {
|
|||||||
[&](ArgParser& p) {
|
[&](ArgParser& p) {
|
||||||
auto arg = p.require_next("-p");
|
auto arg = p.require_next("-p");
|
||||||
|
|
||||||
auto r =
|
auto r = std::from_chars(arg.data(), arg.data() + arg.size(),
|
||||||
std::from_chars(arg.begin(), arg.end(), m_argument.port);
|
m_argument.port);
|
||||||
|
|
||||||
if (r.ec != std::errc{} || r.ptr != arg.end()) {
|
if (r.ec != std::errc{} || arg.data() + arg.size()) {
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
std::format("Invalid port: {}", arg));
|
std::format("Invalid port: {}", arg));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
#include "Cubed/config.hpp"
|
#include "Cubed/config.hpp"
|
||||||
#include "Cubed/gameplay/game_time.hpp"
|
#include "Cubed/gameplay/game_time.hpp"
|
||||||
#include "Cubed/gameplay/packet.hpp"
|
#include "Cubed/gameplay/packet.hpp"
|
||||||
|
|
||||||
|
#include <numbers>
|
||||||
|
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
using namespace std::chrono_literals;
|
using namespace std::chrono_literals;
|
||||||
using namespace google::protobuf;
|
using namespace google::protobuf;
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
#include "Cubed/gameplay/client_world.hpp"
|
#include "Cubed/gameplay/client_world.hpp"
|
||||||
#include "Cubed/tools/log.hpp"
|
#include "Cubed/tools/log.hpp"
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
using namespace google::protobuf;
|
using namespace google::protobuf;
|
||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
NetworkClient::NetworkClient(ClientWorld& world)
|
NetworkClient::NetworkClient(ClientWorld& world)
|
||||||
@@ -62,10 +65,10 @@ asio::awaitable<void> NetworkClient::read_loop() {
|
|||||||
asio::use_awaitable);
|
asio::use_awaitable);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr auto& to_num = std::to_underlying<PacketEnum>;
|
using std::to_underlying;
|
||||||
Arena arena;
|
Arena arena;
|
||||||
switch (header.cmd) {
|
switch (header.cmd) {
|
||||||
case to_num(PacketEnum::LOGIN_RSP): {
|
case std::to_underlying(PacketEnum::LOGIN_RSP): {
|
||||||
auto* rsp = Arena::Create<LoginRsp>(&arena);
|
auto* rsp = Arena::Create<LoginRsp>(&arena);
|
||||||
Logger::info("Client: Receive Login rsp");
|
Logger::info("Client: Receive Login rsp");
|
||||||
if (decode_packet(*rsp, body_data, header)) {
|
if (decode_packet(*rsp, body_data, header)) {
|
||||||
@@ -76,7 +79,7 @@ asio::awaitable<void> NetworkClient::read_loop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case to_num(PacketEnum::CHUNK_DATA_RSP): {
|
case std::to_underlying(PacketEnum::CHUNK_DATA_RSP): {
|
||||||
ChunkDataRsp rsp;
|
ChunkDataRsp rsp;
|
||||||
// Logger::info("Client: Receive Chunk Data rsp, size {}mb",
|
// Logger::info("Client: Receive Chunk Data rsp, size {}mb",
|
||||||
// body_data.size() / 1024.0f / 1024);
|
// body_data.size() / 1024.0f / 1024);
|
||||||
@@ -84,32 +87,32 @@ asio::awaitable<void> NetworkClient::read_loop() {
|
|||||||
m_world.receive_chunk(std::move(rsp));
|
m_world.receive_chunk(std::move(rsp));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case to_num(PacketEnum::BLOCK_CHANGE_RSP): {
|
case std::to_underlying(PacketEnum::BLOCK_CHANGE_RSP): {
|
||||||
auto* rsp = Arena::Create<BlockChangeRsp>(&arena);
|
auto* rsp = Arena::Create<BlockChangeRsp>(&arena);
|
||||||
Logger::info("Client: Receive Block Change rsp");
|
Logger::info("Client: Receive Block Change rsp");
|
||||||
if (decode_packet(*rsp, body_data, header)) {
|
if (decode_packet(*rsp, body_data, header)) {
|
||||||
m_world.receive_block_change(*rsp);
|
m_world.receive_block_change(*rsp);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case to_num(PacketEnum::UPDATE_TIME): {
|
case std::to_underlying(PacketEnum::UPDATE_TIME): {
|
||||||
auto* rsp = Arena::Create<UpdateTime>(&arena);
|
auto* rsp = Arena::Create<UpdateTime>(&arena);
|
||||||
if (decode_packet(*rsp, body_data, header)) {
|
if (decode_packet(*rsp, body_data, header)) {
|
||||||
m_world.receive_time(*rsp);
|
m_world.receive_time(*rsp);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case to_num(PacketEnum::PLAYER_INFO_RSP): {
|
case std::to_underlying(PacketEnum::PLAYER_INFO_RSP): {
|
||||||
auto* rsp = Arena::Create<PlayerInfoRsp>(&arena);
|
auto* rsp = Arena::Create<PlayerInfoRsp>(&arena);
|
||||||
if (decode_packet(*rsp, body_data, header)) {
|
if (decode_packet(*rsp, body_data, header)) {
|
||||||
m_world.receive_remote_player(*rsp);
|
m_world.receive_remote_player(*rsp);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case to_num(PacketEnum::LOGOUT_RSP): {
|
case std::to_underlying(PacketEnum::LOGOUT_RSP): {
|
||||||
auto* rsp = Arena::Create<LogoutRsp>(&arena);
|
auto* rsp = Arena::Create<LogoutRsp>(&arena);
|
||||||
if (decode_packet(*rsp, body_data, header)) {
|
if (decode_packet(*rsp, body_data, header)) {
|
||||||
m_world.receive_player_logout(*rsp);
|
m_world.receive_player_logout(*rsp);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case to_num(PacketEnum::S2C_CLEAR_ALL_CHUNKS): {
|
case std::to_underlying(PacketEnum::S2C_CLEAR_ALL_CHUNKS): {
|
||||||
auto* rsp = Arena::Create<S2C_ClearAllChunks>(&arena);
|
auto* rsp = Arena::Create<S2C_ClearAllChunks>(&arena);
|
||||||
if (decode_packet(*rsp, body_data, header)) {
|
if (decode_packet(*rsp, body_data, header)) {
|
||||||
if (rsp->clear()) {
|
if (rsp->clear()) {
|
||||||
|
|||||||
@@ -53,10 +53,9 @@ asio::awaitable<void> Session::read_loop() {
|
|||||||
co_await asio::async_read(m_socket, asio::buffer(body_data),
|
co_await asio::async_read(m_socket, asio::buffer(body_data),
|
||||||
asio::use_awaitable);
|
asio::use_awaitable);
|
||||||
}
|
}
|
||||||
constexpr auto& to_num = std::to_underlying<PacketEnum>;
|
|
||||||
auto cmd_id = header.cmd;
|
auto cmd_id = header.cmd;
|
||||||
Arena arena;
|
Arena arena;
|
||||||
if (cmd_id == to_num(PacketEnum::LOGIN_REQ)) {
|
if (cmd_id == std::to_underlying(PacketEnum::LOGIN_REQ)) {
|
||||||
auto* req = Arena::Create<LoginReq>(&arena);
|
auto* req = Arena::Create<LoginReq>(&arena);
|
||||||
Logger::info("Session: Receive Login req");
|
Logger::info("Session: Receive Login req");
|
||||||
if (decode_packet(*req, body_data, header)) {
|
if (decode_packet(*req, body_data, header)) {
|
||||||
@@ -64,7 +63,7 @@ asio::awaitable<void> Session::read_loop() {
|
|||||||
shared_from_this());
|
shared_from_this());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cmd_id == to_num(PacketEnum::PLAYER_POS)) {
|
if (cmd_id == std::to_underlying(PacketEnum::PLAYER_POS)) {
|
||||||
auto* pos = Arena::Create<PlayerPos>(&arena);
|
auto* pos = Arena::Create<PlayerPos>(&arena);
|
||||||
if (decode_packet(*pos, body_data, header)) {
|
if (decode_packet(*pos, body_data, header)) {
|
||||||
m_server_world.sync_player_pos(pos->uuid(), pos->pos().x(),
|
m_server_world.sync_player_pos(pos->uuid(), pos->pos().x(),
|
||||||
@@ -72,7 +71,7 @@ asio::awaitable<void> Session::read_loop() {
|
|||||||
pos->pos().z());
|
pos->pos().z());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cmd_id == to_num(PacketEnum::CHUNK_DATA_REQ)) {
|
if (cmd_id == std::to_underlying(PacketEnum::CHUNK_DATA_REQ)) {
|
||||||
auto* req = Arena::Create<ChunkDataReq>(&arena);
|
auto* req = Arena::Create<ChunkDataReq>(&arena);
|
||||||
// Logger::info("Session: Receive Chunk Data req");
|
// Logger::info("Session: Receive Chunk Data req");
|
||||||
if (decode_packet(*req, body_data, header)) {
|
if (decode_packet(*req, body_data, header)) {
|
||||||
@@ -81,14 +80,14 @@ asio::awaitable<void> Session::read_loop() {
|
|||||||
ChunkPos(req->pos().x(), req->pos().z()));
|
ChunkPos(req->pos().x(), req->pos().z()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cmd_id == to_num(PacketEnum::BLOCK_CHANGE_REQ)) {
|
if (cmd_id == std::to_underlying(PacketEnum::BLOCK_CHANGE_REQ)) {
|
||||||
auto* req = Arena::Create<BlockChangeReq>(&arena);
|
auto* req = Arena::Create<BlockChangeReq>(&arena);
|
||||||
Logger::info("Session: Receive Block Change req");
|
Logger::info("Session: Receive Block Change req");
|
||||||
if (decode_packet(*req, body_data, header)) {
|
if (decode_packet(*req, body_data, header)) {
|
||||||
m_server_world.handle_block_change(*req);
|
m_server_world.handle_block_change(*req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cmd_id == to_num(PacketEnum::LOGOUT_REQ)) {
|
if (cmd_id == std::to_underlying(PacketEnum::LOGOUT_REQ)) {
|
||||||
auto* req = Arena::Create<LogoutReq>(&arena);
|
auto* req = Arena::Create<LogoutReq>(&arena);
|
||||||
if (decode_packet(*req, body_data, header)) {
|
if (decode_packet(*req, body_data, header)) {
|
||||||
m_server_world.handle_player_exit(req->uuid());
|
m_server_world.handle_player_exit(req->uuid());
|
||||||
|
|||||||
7
vcpkg.json
Normal file
7
vcpkg.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"dependencies": [
|
||||||
|
"protobuf",
|
||||||
|
"zstd"
|
||||||
|
],
|
||||||
|
"builtin-baseline": "a0400024711b283056538ac19ced80b91a83c24c"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user