#include "client_node.h" #include "core/config/engine.h" #include "scene/main/node.h" #include "you_done_it/clue_data.h" #include "you_done_it/clue_db.h" #include "you_done_it/ydi_client.h" ClientNode *ClientNode::singleton_instance{ nullptr }; String const ClientNode::sig_connection_changed{ "connection_changed" }; void ClientNode::_bind_methods() { ClassDB::bind_method(D_METHOD("connect_to_server", "server_url"), &self_type::connect_to_server); ADD_SIGNAL(MethodInfo(sig_connection_changed, PropertyInfo(Variant::INT, "connected", PROPERTY_HINT_ENUM, "Disconnected,Connected,Authenticated"))); } void ClientNode::enter_tree() { if (singleton_instance) { print_error("Attempt to create duplicate ClientNode, aborting"); abort(); } else { singleton_instance = this; } } void ClientNode::process() { NetworkData::ConnectionStatus const new_status{ ydi::client::status() }; if (new_status != this->state) { this->state = new_status; emit_signal(sig_connection_changed, new_status); if (new_status == NetworkData::CONNECTION_AUTHENTICATED) { reveal_backlog(); } } } void ClientNode::exit_tree() { ydi::client::disconnect(); if (singleton_instance == this) { singleton_instance = nullptr; } } void ClientNode::reveal_backlog() { Ref db{ ClueDB::get_singleton() }; for (int i{ 0 }; i < NetworkData::CLUE_MAX; ++i) { Ref data{ db->get_clue((NetworkData::ClueID)i) }; if (data.is_valid() && data->get_revealed()) { ydi::client::send::reveal_clue(data->get_id()); } } } void ClientNode::_notification(int what) { if (Engine::get_singleton()->is_editor_hint()) { return; } switch (what) { default: return; case NOTIFICATION_ENTER_TREE: set_process(true); return; case NOTIFICATION_PROCESS: process(); return; case NOTIFICATION_EXIT_TREE: exit_tree(); return; } } ClientNode *ClientNode::get_singleton() { return singleton_instance; } void ClientNode::connect_to_server(String const &url) { ydi::client::connect(url); }