generated from Persson-dev/Godot-Xmake
96 lines
2.9 KiB
C++
96 lines
2.9 KiB
C++
#include "Lobby.h"
|
|
|
|
#include <godot_cpp/classes/e_net_multiplayer_peer.hpp>
|
|
#include <godot_cpp/classes/multiplayer_api.hpp>
|
|
|
|
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
|