#include "Lobby.h" #include #include using namespace godot; namespace blitz { void Lobby::_bind_methods() { godot::ClassDB::bind_method(godot::D_METHOD("create_game", "port", "dedicated"), &Lobby::CreateGame); godot::ClassDB::bind_method(godot::D_METHOD("join_game", "address", "port"), &Lobby::JoinGame); ADD_SIGNAL(MethodInfo("player_connected", PropertyInfo(Variant::INT, "peer_id"), PropertyInfo(Variant::STRING, "player_name"))); ADD_SIGNAL(MethodInfo("player_disconnected", PropertyInfo(Variant::INT, "peer_id"))); ADD_SIGNAL(MethodInfo("server_disconnected")); ADD_SIGNAL(MethodInfo("local_player_connected")); } Lobby::Lobby() {} Lobby::~Lobby() {} void Lobby::_ready() { get_multiplayer()->connect("peer_connected", callable_mp(this, &Lobby::OnPlayerConnected)); get_multiplayer()->connect("peer_disconnected", callable_mp(this, &Lobby::OnPlayerDisconnected)); get_multiplayer()->connect("connected_to_server", callable_mp(this, &Lobby::OnConnectOk)); get_multiplayer()->connect("connection_failed", callable_mp(this, &Lobby::OnConnectFail)); get_multiplayer()->connect("server_disconnected", callable_mp(this, &Lobby::OnServerDisconnected)); } Error Lobby::JoinGame(const String& a_Address, uint16_t a_Port) { auto* peer = memnew(ENetMultiplayerPeer); Error error = peer->create_client(a_Address, a_Port); if (error) return error; get_multiplayer()->set_multiplayer_peer(peer); return Error::OK; } Error Lobby::CreateGame(uint16_t a_Port, bool a_Dedicated) { auto* peer = memnew(ENetMultiplayerPeer); Error error = peer->create_server(a_Port); if (error) return error; get_multiplayer()->set_multiplayer_peer(peer); if (!a_Dedicated) { emit_signal("local_player_connected"); String playerName = "Imtheadmin"; m_Players.insert({get_multiplayer()->get_unique_id(), {playerName}}); emit_signal("player_connected", get_multiplayer()->get_unique_id(), playerName); } return Error::OK; } void Lobby::Shutdown() { get_multiplayer()->set_multiplayer_peer(nullptr); m_Players.clear(); } void Lobby::OnPlayerConnected(int32_t a_PeerId) { emit_signal("player_connected", a_PeerId, "anonymous"); if (get_multiplayer()->is_server()) { // TODO: broadcast player join } } void Lobby::OnPlayerDisconnected(int32_t a_PeerId) { m_Players.erase(a_PeerId); emit_signal("player_disconnected", a_PeerId); if (get_multiplayer()->is_server()) { // TODO: broadcast player leave } } void Lobby::OnConnectOk() { int32_t peerId = get_multiplayer()->get_unique_id(); PlayerInfo localPlayer{"MonPseudo"}; m_Players.insert({peerId, localPlayer}); emit_signal("player_connected", peerId, localPlayer.m_Name); emit_signal("local_player_connected"); } void Lobby::OnConnectFail() { Shutdown(); } void Lobby::OnServerDisconnected() { Shutdown(); emit_signal("server_disconnected"); } } // namespace blitz