Theres been some changes to how Gd4's new WebSocketPeer works compared to Gd3's WebSocketClient. Here's my Gd3 implementation:
public override void _Ready() {
GD.Print("Connecting");
setup_connections();
connect_to_server();
}
public override void _Process(float delta) {
network.Poll();
}
private void _DataReceived() {
deconstruct_message(utf8.GetString(network.GetPeer(1).GetPacket()));
}
private void setup_connections() {
network.Connect("connection_established", this, "connection_succeeded");
network.Connect("connection_closed", this, "server_disconnected");
network.Connect("connection_error", this, "connection_failed");
network.Connect("server_close_request", this, "forced_disconnect");
network.Connect("data_received", this, "_DataReceived");
}
public void connect_to_server() {
Error err = network.ConnectToUrl(url);
if (err != Error.Ok) {
GD.Print("Unable to Connect");
SetProcess(false);
}
}
To summarize it, I connect the WebSocketClient's "data_received" signal to the _DataReceived function to handle packets received there. However, this signal (as far as I can tell) was removed in Gd4. In order to tackle this problem, I just followed the steps in the WebSocketPeer documentation which for some reason I missed even though I visited the page a bunch of times! Here's the result:
public override void _Process(double delta) {
network.Poll();
WebSocketPeer.State state = network.GetReadyState();
if (state == WebSocketPeer.State.Open) {
while (network.GetAvailablePacketCount() > 0) {
deconstruct_message(utf8.GetString(network.GetPacket()));
}
} else if (state == WebSocketPeer.State.Closed) {
int code = network.GetCloseCode();
string reason = network.GetCloseReason();
GD.Print("Disconnected from server: code:", code, " reason:", reason);
SetProcess(false);
}
}