diff options
author | nokoe <nokoe@mailbox.org> | 2024-06-20 14:13:28 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:24:14 +0200 |
commit | 80039e0e7eb142d51f882a39981fd415ea3f5c54 (patch) | |
tree | 62d75807ff55374bdb5431dd5db82399d241c4c7 /client/scripts/multiplayer.gd | |
parent | 5bf50cd276a568f55fb1d5aedef96e614bed015b (diff) | |
download | hurrycurry-80039e0e7eb142d51f882a39981fd415ea3f5c54.tar hurrycurry-80039e0e7eb142d51f882a39981fd415ea3f5c54.tar.bz2 hurrycurry-80039e0e7eb142d51f882a39981fd415ea3f5c54.tar.zst |
map generation
Diffstat (limited to 'client/scripts/multiplayer.gd')
-rw-r--r-- | client/scripts/multiplayer.gd | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/client/scripts/multiplayer.gd b/client/scripts/multiplayer.gd new file mode 100644 index 00000000..bd488900 --- /dev/null +++ b/client/scripts/multiplayer.gd @@ -0,0 +1,116 @@ +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 |