begin network

This commit is contained in:
2024-08-16 19:00:45 +02:00
parent 65e2a0b3ce
commit 3769fd3ace
18 changed files with 305 additions and 77 deletions

96
src/Lobby.cpp Normal file
View File

@@ -0,0 +1,96 @@
#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