diff options
Diffstat (limited to 'client/scripts')
-rw-r--r-- | client/scripts/controllable_player.gd | 18 | ||||
-rw-r--r-- | client/scripts/game.gd | 8 | ||||
-rw-r--r-- | client/scripts/marker.gd | 8 | ||||
-rw-r--r-- | client/scripts/multiplayer.gd | 53 |
4 files changed, 57 insertions, 30 deletions
diff --git a/client/scripts/controllable_player.gd b/client/scripts/controllable_player.gd index 819e7a08..4cedbdbb 100644 --- a/client/scripts/controllable_player.gd +++ b/client/scripts/controllable_player.gd @@ -23,7 +23,8 @@ func _process(delta): update(delta, input) position_anim = position_ rotation_anim = rotation_ - interact() + if not Input.is_action_pressed("interact")||Input.is_action_just_pressed("interact"): + interact() super(delta) func update(dt: float, input: Vector2): @@ -75,14 +76,17 @@ func interact(): ) var tile_idx = str(target) var t: Floor = game.map.tile_by_pos.get(tile_idx) - if Input.is_action_just_pressed("interact"): - Multiplayer.send_interact(target, true) - if t != null: - t.interact() - elif Input.is_action_just_released("interact"): - Multiplayer.send_interact(target, false) if t != null: game.marker.visible = true game.marker_target = t.item_base.global_position + if Multiplayer.get_tile_interactive(target): + game.marker.set_interactive(true) + if Input.is_action_just_pressed("interact"): + Multiplayer.send_interact(target, true) + t.interact() + elif Input.is_action_just_released("interact"): + Multiplayer.send_interact(target, false) + else: + game.marker.set_interactive(false) else: game.marker.visible = false diff --git a/client/scripts/game.gd b/client/scripts/game.gd index 1c966fa6..ff90065e 100644 --- a/client/scripts/game.gd +++ b/client/scripts/game.gd @@ -3,7 +3,7 @@ extends Node3D @onready var camera: FollowCamera = $FollowCamera @onready var map: Map = $Map -@onready var marker: Node3D = $Marker +@onready var marker: Marker = $Marker var marker_target = Vector3(0,0,0) var players := {} @@ -13,13 +13,13 @@ func _ready(): if Multiplayer.player_id == -1: push_error("multiplayer has not been initialized") Multiplayer.connect("add_player", - func(player: int, name: String, pos: Vector2, character: int): + func(player: int, player_name: String, pos: Vector2, character: int): var player_instance: Player if player == Multiplayer.player_id: - player_instance = ControllablePlayer.new(player, name, pos, character, self) + player_instance = ControllablePlayer.new(player, player_name, pos, character, self) camera.target = player_instance else: - player_instance = Player.new(player, name, pos, character, self) + player_instance = Player.new(player, player_name, pos, character, self) players[player] = player_instance add_child(player_instance) ) diff --git a/client/scripts/marker.gd b/client/scripts/marker.gd new file mode 100644 index 00000000..0127cd5b --- /dev/null +++ b/client/scripts/marker.gd @@ -0,0 +1,8 @@ +class_name Marker +extends Node3D + +@onready var _cube: MeshInstance3D = $Cube + +func set_interactive(val: bool): + var mat: ShaderMaterial = _cube.get_active_material(0) + mat.set_shader_parameter("interactive", val) diff --git a/client/scripts/multiplayer.gd b/client/scripts/multiplayer.gd index 4dbce890..3d360cf8 100644 --- a/client/scripts/multiplayer.gd +++ b/client/scripts/multiplayer.gd @@ -25,7 +25,6 @@ var tile_interact = [] var item_idx_from_name: Dictionary = {} var player_id = -1 -var other_players = {} var tileid_by_pos: Dictionary = {} func connectClient(url: String): @@ -71,39 +70,46 @@ func handle_packet(bytes: PackedByteArray): var id = decoded["id"] var player_name = decoded["name"] var pos = decoded["position"] - var char = decoded["character"] - other_players[id] = [player_name, char] - emit_signal("add_player", id, player_name, pos_to_vec2(pos), char) + var character = decoded["character"] + emit_signal("add_player", id, player_name, pos_to_vec2(pos), character) "remove_player": var id = decoded["id"] - other_players.erase(id) emit_signal("remove_player", id) "position": - var id = decoded["player"] + var player = decoded["player"] var pos = decoded["pos"] var rot = decoded["rot"] - emit_signal("position", id, pos_to_vec2(pos), rot) + emit_signal("position", player, pos_to_vec2(pos), rot) "take_item": var tile = pos_to_vec2i(decoded["tile"]) - var player_id = decoded["player"] - emit_signal("take_item", tile, player_id) + var player = decoded["player"] + emit_signal("take_item", tile, player) "put_item": var tile = pos_to_vec2i(decoded["tile"]) var player_id = decoded["player"] emit_signal("take_item", tile, player_id) - "set_progress": + "set_active": var tile = pos_to_vec2i(decoded["tile"]) var warn = decoded["warn"] - if decoded.has("progress")&&decoded["progress"] != null: + var progress = decoded.get("progress") + if progress != null: emit_signal("set_progress", tile, decoded["progress"], warn) else: emit_signal("set_finished", tile, warn) "set_tile_item": var tile = pos_to_vec2i(decoded["tile"]) - if decoded.has("item")&&decoded["item"] != null: - emit_signal("set_tile_item", tile, decoded["item"]) + var item = decoded.get("item") + if item != null: + emit_signal("set_tile_item", tile, item) else: - emit_signal("remove_tile_name", tile) + emit_signal("remove_tile_item", tile) + "set_player_item": + var player = decoded["player"] + var item = decoded.get("item") + if item != null: + emit_signal("set_player_item", player, decoded["item"]) + else: + emit_signal("remove_player_item", player) "update_map": var tile: int = decoded["tile"] var pos: Array = decoded["pos"] @@ -112,12 +118,16 @@ func handle_packet(bytes: PackedByteArray): emit_signal("update_map", pos, tile_names[tile], neighbors) "communicate": var player = decoded["player"] - if decoded.has("message"): - var message: Dictionary = decoded["message"] - if message.has("item"): - emit_signal("item_message", player, message["item"]) + var message = decoded.get("message") + if message != null: + var item = message.get("item") + var text = message.get("text") + if item != null: + emit_signal("item_message", player, item) + elif text != null: + emit_signal("text_message", player, text) else: - emit_signal("text_message", player, message["text"]) + push_error("neither text nor item provided") else: emit_signal("clear_message", player) _: @@ -168,3 +178,8 @@ func get_tile_collision(pos: Vector2i) -> bool: var t = tileid_by_pos[str(pos)] if t == null: return false else: return tile_collide[t] + +func get_tile_interactive(pos: Vector2i) -> bool: + var t = tileid_by_pos[str(pos)] + if t == null: return false + else: return tile_interact[t] |