diff --git a/include/Cubed/argument.hpp b/include/Cubed/argument.hpp index 4f4ac31..79b29c2 100644 --- a/include/Cubed/argument.hpp +++ b/include/Cubed/argument.hpp @@ -13,5 +13,6 @@ struct Argument { std::optional log_level; std::optional enable_filelog; std::optional enable_consolelog; + std::optional direct_enter; }; } // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/scene/scene_manager.hpp b/include/Cubed/scene/scene_manager.hpp index 973d380..e5a322c 100644 --- a/include/Cubed/scene/scene_manager.hpp +++ b/include/Cubed/scene/scene_manager.hpp @@ -36,6 +36,7 @@ public: App& app(); WorldSceneParam& world_scene_param(); + void push(SceneType type); private: enum class OperationType { PUSH, POP, CHANGE }; @@ -51,7 +52,7 @@ private: std::stack> m_scenes; void process_operation(); void change(SceneType type); - void push(SceneType type); + void pop(bool re_enter = true); std::unique_ptr create_scene(SceneType); diff --git a/src/app.cpp b/src/app.cpp index 688abcc..eb5422f 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -90,7 +90,14 @@ void App::init(int argc, char** argv) { m_texture_manager.init_texture(); Logger::info("Texture Load Success"); - m_scene_manager.request_push(SceneType::MAIN_MENU); + m_scene_manager.push(SceneType::MAIN_MENU); + if (m_argument.direct_enter) { + if (m_argument.port) { + m_scene_manager.request_push(SceneType::WORLD); + } else { + throw std::runtime_error("You need use -p to specify a port"); + } + } last_tick = SDL_GetTicks(); current_tick = SDL_GetTicks(); { @@ -181,7 +188,9 @@ void App::handle_argument(int argc, char** argv) { {"--enable-filelog", [&](ArgParser&) { m_argument.enable_filelog = true; }}, {"--enale-consolelog", - [&](ArgParser&) { m_argument.enable_consolelog = true; }} + [&](ArgParser&) { m_argument.enable_consolelog = true; }}, + {"--direct-enter", + [&](ArgParser&) { m_argument.direct_enter = true; }} }; ArgParser parser(argc, argv); diff --git a/src/scene/world_scene.cpp b/src/scene/world_scene.cpp index 827ab4b..84199a5 100644 --- a/src/scene/world_scene.cpp +++ b/src/scene/world_scene.cpp @@ -126,22 +126,34 @@ bool WorldScene::handle_event(const Event& e) { e); } void WorldScene::on_enter() { - auto& param = m_scene_manager.world_scene_param(); load_config(); m_error_ui.init(); - - if (param.host_game) { - if (param.seed) { - ChunkGenerator::init(*param.seed); - param.seed = std::nullopt; - } else { - ChunkGenerator::init(); - } - m_server.start_server(param.port); - } m_client = std::make_shared(m_client_world); + if (m_argument.direct_enter) { + if (!m_argument.ip) { + ChunkGenerator::init(); + m_server.start_server(*m_argument.port); + m_client->start("127.0.0.1", *m_argument.port); + } else { + m_client->start(*m_argument.ip, *m_argument.port); + } + + } else { + auto& param = m_scene_manager.world_scene_param(); + + if (param.host_game) { + if (param.seed) { + ChunkGenerator::init(*param.seed); + param.seed = std::nullopt; + } else { + ChunkGenerator::init(); + } + m_server.start_server(param.port); + } + + m_client->start(param.ip, param.port); + } - m_client->start(param.ip, param.port); // init will send packet try {