#pragma once #include "services/players/player_service.hpp" namespace big { constexpr int DEFAULT_STACK_SIZE = 1424; class script_connection { std::string m_script_name; rage::joaat_t m_script_hash; std::optional m_target; int m_instance_id = -1; rage::scrThread* m_thread = nullptr; bool m_startup_done = false; bool m_startup_failed = false; int m_host_broadcast_size = 0; int m_player_broadcast_size = 0; bool m_debug_logging = false; bool m_wait_for_host_broadcast_data = false; bool m_no_remote_start = false; bool m_quick_cleanup = false; std::optional m_host_broadcast_default_data_address = std::nullopt; std::optional m_player_broadcast_default_data_address = std::nullopt; std::function m_broadcast_setup_callback{}; std::function m_broadcast_modify_callback{}; uint64_t* m_host_broadcast_data = nullptr; uint64_t* m_player_broadcast_data = nullptr; std::optional m_startup_complete_time = std::nullopt; bool does_remote_script_exist(); bool start_script_on_local(); void start_script_on_remote(); bool populate_instance_id(); bool set_script_as_networked(); void setup_broadcast_data(); void register_broadcast_data(); bool force_host_of_script(); bool wait_for_host_broadcast_data(); bool wait_for_connection_to_remote(); bool start_impl(); public: script_connection(const std::string& script_name, std::optional target = std::nullopt); void start(); void cleanup(); bool should_cleanup(); // clang-format off inline rage::joaat_t get_script_hash() { return m_script_hash; } inline std::optional get_target() { return m_target; } inline rage::scrThread* get_script_thread() { return m_thread; } inline void set_host_broadcast_size(int size) { m_host_broadcast_size = size; } inline void set_player_broadcast_size(int size) { m_player_broadcast_size = size; } inline void set_debug_logging(bool enabled) { m_debug_logging = enabled; } inline void set_wait_for_host_broadcast_data(bool enabled) { m_wait_for_host_broadcast_data = enabled; } inline void set_no_remote_start(bool enabled) { m_no_remote_start = enabled; } inline void set_quick_cleanup(bool enabled) { m_quick_cleanup = enabled; } inline void set_host_broadcast_default_data_address(int data_address) { m_host_broadcast_default_data_address = data_address; } inline void set_player_broadcast_default_data_address(int data_address) { m_player_broadcast_default_data_address = data_address; } // thread, host_broadcast_data, player_broadcast_data inline void set_broadcast_setup_callback(std::function cb) { m_broadcast_setup_callback = std::move(cb); } inline void set_broadcast_modify_callback(std::function cb) { m_broadcast_modify_callback = std::move(cb); } inline void invalidate_script_thread() { m_thread = nullptr; } // clang-format on }; }