extends Node signal update_map var connected := false var socket := WebSocketPeer.new() var item_names = [] var tile_names = [] var player_id = -1 var other_players = {} func connectClient(url: String): socket.connect_to_url(url) connected = true func _process(_delta): if connected: socket.poll() var state = socket.get_ready_state() if state == WebSocketPeer.STATE_OPEN: while socket.get_available_packet_count(): handle_packet(socket.get_packet()) elif state == WebSocketPeer.STATE_CONNECTING: print("connecting") elif state == WebSocketPeer.STATE_CLOSING: # Keep polling to achieve proper close. print("closing") pass elif state == WebSocketPeer.STATE_CLOSED: var code = socket.get_close_code() var reason = socket.get_close_reason() print("WebSocket closed with code: %d, reason %s. Clean: %s" % [code, reason, code != -1]) func handle_packet(bytes: PackedByteArray): var decoded = decode_packet(bytes) if decoded == null: return var packet_type: String = decoded["type"] match packet_type: "init": player_id = decoded["id"] item_names = decoded["data"]["item_names"] tile_names = decoded["data"]["tile_names"] "add_player": var id = decoded["id"] var player_name = decoded["name"] #var item = decoded["item"] var pos = decoded["position"] var char = decoded["character"] other_players[id] = [player_name, char] "remove_player": var id = decoded["id"] other_players.erase(id) "position": var id = decoded["player"] var pos = decoded["pos"] var rot = decoded["rot"] "take_item": var tile = decoded["tile"] var player_id = decoded["player"] "put_item": var tile = decoded["tile"] var player_id = decoded["player"] "produce_item": var tile = decoded["tile"] var item = decoded["item"] "consume_item": var tile = decoded["tile"] "set_active": var tile = decoded["tile"] var progress = decoded["progress"] "update_map": var tile = decoded["tile"] var pos = decoded["pos"] var neighbors = decoded["neighbors"] emit_signal("update_map", pos, tile_names[tile], neighbors) _: push_error("Unrecognized packet type: %s" % packet_type) func send_join(player_name: String): send_packet({ "type": "join", "name": player_name }) func send_position(pos: Vector2, rotation: float): send_packet({ "type": "position", "pos": [pos.x, pos.y], "rot": rotation }) func send_interact(pos: Vector2, edge: bool): send_packet({ "type": "interact", "pos": [pos.x, pos.y], "edge": edge }) func send_packet(packet): var json = JSON.stringify(packet) socket.send_text(json) func decode_packet(bytes: PackedByteArray): var json = JSON.new() var in_str = bytes.get_string_from_utf8() var error = json.parse(in_str) if error == OK: return json.data else: print("Decode of packet failed: %s in %s" % [json.get_error_message(), in_str]) return null