diff --git a/CMakeLists.txt b/CMakeLists.txt index 15cb97ce..76882d8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,6 +119,7 @@ set(SOURCES "network/message.cpp" "network/manager.cpp" "network/backend/asio.cpp" +"network/backend/file.cpp" "widgets/vehiclelist.cpp" diff --git a/command.cpp b/command.cpp index c5d9bd74..1d9e9802 100644 --- a/command.cpp +++ b/command.cpp @@ -317,8 +317,8 @@ void command_queue::push_commands(const commands_map &commands) { } void -command_relay::post( user_command const Command, double const Param1, double const Param2, - int const Action, uint16_t Recipient) const { +command_relay::post(user_command const Command, double const Param1, double const Param2, + int const Action, uint16_t Recipient, glm::vec3 Position) const { auto const &command = simulation::Commands_descriptions[ static_cast( Command ) ]; @@ -337,8 +337,11 @@ command_relay::post( user_command const Command, double const Param1, double con return; } + if (Position == glm::vec3(0.0f)) + Position = Global.pCamera.Pos; + uint32_t combined_recipient = static_cast( command.target ) | Recipient; - command_data commanddata({Command, Action, Param1, Param2, Timer::GetDeltaTime(), FreeFlyModeFlag, Global.pCamera.Pos }); + command_data commanddata({Command, Action, Param1, Param2, Timer::GetDeltaTime(), FreeFlyModeFlag, Position }); simulation::Commands.push(commanddata, combined_recipient); } diff --git a/command.h b/command.h index 61b10e26..b20f0d26 100644 --- a/command.h +++ b/command.h @@ -349,7 +349,7 @@ public: // posts specified command for the specified recipient void post(user_command const Command, double const Param1, double const Param2, - int const Action, uint16_t Recipient ) const; + int const Action, uint16_t Recipient, glm::vec3 Position = glm::vec3(0.0f) ) const; }; //--------------------------------------------------------------------------- diff --git a/drivermode.cpp b/drivermode.cpp index 6b5d8850..d6693bcd 100644 --- a/drivermode.cpp +++ b/drivermode.cpp @@ -182,6 +182,16 @@ driver_mode::update() { // variable step simulation time routines + if (!change_train.empty()) { + TTrain *train = simulation::Trains.find(change_train); + if (train) { + simulation::Train = train; + InOutKey(); + m_relay.post(user_command::aidriverdisable, 0.0, 0.0, GLFW_PRESS, 0); + change_train.clear(); + } + } + if( ( simulation::Train == nullptr ) && ( false == FreeFlyModeFlag ) ) { // intercept cases when the driven train got removed after entering portal InOutKey(); @@ -258,33 +268,23 @@ driver_mode::enter() { simulation::Vehicles.find( Global.asHumanCtrlVehicle ) : nullptr ) }; - Camera.Init(Global.FreeCameraInit[0], Global.FreeCameraInitAngle[0], nPlayerTrain ); + Camera.Init(Global.FreeCameraInit[0], Global.FreeCameraInitAngle[0], nullptr ); Global.pCamera = Camera; Global.pDebugCamera = DebugCamera; + FreeFlyModeFlag = true; + DebugCamera = Camera; + if (nPlayerTrain) { - // M7TODO: restore - /* - WriteLog( "Initializing player train, \"" + Global.asHumanCtrlVehicle + "\"" ); + WriteLog( "Trying to enter player train, \"" + Global.asHumanCtrlVehicle + "\"" ); - Global.pCamera.Pos = nPlayerTrain->GetPosition(); - m_relay.post(user_command::entervehicle, 0.0, 0.0, GLFW_PRESS, 0); - */ - - FreeFlyModeFlag = true; - Camera.m_owner = nullptr; - DebugCamera = Camera; + m_relay.post(user_command::entervehicle, 0.0, 0.0, GLFW_PRESS, 0, nPlayerTrain->GetPosition()); + change_train = nPlayerTrain->name(); } - else + else if (Global.asHumanCtrlVehicle != "ghostview") { - if (Global.asHumanCtrlVehicle != "ghostview") - { - Error("Bad scenario: failed to locate player train, \"" + Global.asHumanCtrlVehicle + "\"" ); - } - FreeFlyModeFlag = true; // Ra: automatycznie włączone latanie - Camera.m_owner = nullptr; - DebugCamera = Camera; + Error("Bad scenario: failed to locate player train, \"" + Global.asHumanCtrlVehicle + "\"" ); } // if (!Global.bMultiplayer) //na razie włączone @@ -379,7 +379,6 @@ driver_mode::on_event_poll() { void driver_mode::update_camera( double const Deltatime ) { - Camera.Pos = Global.pCamera.Pos; // M7TODO auto *controlled = ( simulation::Train ? @@ -686,15 +685,11 @@ driver_mode::OnKeyDown(int cKey) { // only available in free fly mode break; - TDynamicObject *dynamic = std::get( simulation::Region->find_vehicle( Global.pCamera.Pos, 50, true, false ) ); + TDynamicObject *dynamic = std::get( simulation::Region->find_vehicle( Camera.Pos, 50, true, false ) ); if (dynamic) { - TTrain *train = simulation::Trains.find(dynamic->name()); - if (train) { - simulation::Train = train; - InOutKey(); - } else { - m_relay.post(user_command::entervehicle, 0.0, 0.0, GLFW_PRESS, 0); - } + m_relay.post(user_command::entervehicle, 0.0, 0.0, GLFW_PRESS, 0); + + change_train = dynamic->name(); } break; diff --git a/drivermode.h b/drivermode.h index 734df796..abe1cc1b 100644 --- a/drivermode.h +++ b/drivermode.h @@ -109,4 +109,5 @@ private: double m_secondaryupdateaccumulator { m_secondaryupdaterate }; // keeps track of elapsed simulation time, for less important fixed step routines int iPause { 0 }; // wykrywanie zmian w zapauzowaniu command_relay m_relay; + std::string change_train; // train name awaiting entering }; diff --git a/network/backend/file.cpp b/network/backend/file.cpp new file mode 100644 index 00000000..e69de29b diff --git a/network/backend/file.h b/network/backend/file.h new file mode 100644 index 00000000..3737c53f --- /dev/null +++ b/network/backend/file.h @@ -0,0 +1,22 @@ +#include "network/network.h" + +namespace network::file +{ + class server : public network::server + { + private: + std::fstream stream; + + public: + server(); + }; + + class client : public network::client + { + private: + std::fstream stream; + + public: + client(); + }; +} diff --git a/network/network.cpp b/network/network.cpp index ccd8d2c3..7b98f9fd 100644 --- a/network/network.cpp +++ b/network/network.cpp @@ -113,11 +113,6 @@ command_queue::commands_map network::connection::pop_commands() // server -network::server::server() -{ - recorder.open("recorder.bin", std::ios::trunc | std::ios::out | std::ios::binary); -} - void network::server::push_delta(double dt, double sync, const command_queue::commands_map &commands) { if (dt == 0.0 && commands.empty()) @@ -128,12 +123,6 @@ void network::server::push_delta(double dt, double sync, const command_queue::co msg.sync = sync; msg.commands = commands; - sn_utils::ls_uint32(recorder, 0x37305545); - sn_utils::ls_uint32(recorder, 0); - sn_utils::ls_uint16(recorder, (uint16_t)msg.type); - msg.serialize(recorder); - recorder.flush(); - for (auto c : clients) if (c->state == connection::ACTIVE) c->send_message(msg); diff --git a/network/network.h b/network/network.h index a9e12029..9bcdb1f4 100644 --- a/network/network.h +++ b/network/network.h @@ -54,12 +54,10 @@ namespace network void handle_message(connection &conn, const message &msg); std::vector> clients; - std::fstream recorder; command_queue::commands_map client_commands_queue; public: - server(); void push_delta(double dt, double sync, const command_queue::commands_map &commands); command_queue::commands_map pop_commands(); }; diff --git a/widgets/vehiclelist.cpp b/widgets/vehiclelist.cpp index 930aa947..7c3d2dc6 100644 --- a/widgets/vehiclelist.cpp +++ b/widgets/vehiclelist.cpp @@ -20,9 +20,7 @@ void ui::vehiclelist_panel::render_contents() { else if (ImGui::TreeNode(vehicle, label.c_str())) { vehicle = vehicle->Next(); while (vehicle) { - if (ImGui::Button(vehicle->name().c_str())) { - Global.pCamera.Pos = vehicle->GetPosition(); - } + ImGui::TextUnformatted(vehicle->name().c_str()); vehicle = vehicle->Next(); } ImGui::TreePop();