diff options
-rw-r--r-- | client/scenes/marker.tscn | 5 | ||||
-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 | ||||
-rw-r--r-- | client/textures/interact_marker.gdshader | 14 |
6 files changed, 73 insertions, 33 deletions
diff --git a/client/scenes/marker.tscn b/client/scenes/marker.tscn index b13d3747..7f21e199 100644 --- a/client/scenes/marker.tscn +++ b/client/scenes/marker.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=6 format=3 uid="uid://c0euiv7duqfp4"] +[gd_scene load_steps=7 format=3 uid="uid://c0euiv7duqfp4"] +[ext_resource type="Script" path="res://scripts/marker.gd" id="1_3njdu"] [ext_resource type="Shader" path="res://textures/interact_marker.gdshader" id="2_dejwy"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o4v68"] @@ -40,8 +41,10 @@ shader = ExtResource("2_dejwy") shader_parameter/max_width = 0.1 shader_parameter/marker_length = 0.5 shader_parameter/pulse_speed = 4.0 +shader_parameter/interactive = false [node name="Marker" type="Node3D"] +script = ExtResource("1_3njdu") [node name="Cube" type="MeshInstance3D" parent="."] transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0.25, 0) 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] diff --git a/client/textures/interact_marker.gdshader b/client/textures/interact_marker.gdshader index dccaf17d..94b7323d 100644 --- a/client/textures/interact_marker.gdshader +++ b/client/textures/interact_marker.gdshader @@ -3,12 +3,22 @@ shader_type spatial; uniform float max_width = .1; uniform float marker_length = .5; uniform float pulse_speed = 4.; +uniform bool interactive = false; void fragment() { - ALBEDO = vec3(15., 0., 0.); + if (interactive) { + ALBEDO = vec3(15., 0., 0.); + } else { + ALBEDO = vec3(.1, .1, .1); + } vec2 uv = abs(2. * UV.xy - 1.); float m_length = marker_length / max_width; - float anim = sin(TIME * pulse_speed) * .5 + 1.; + float anim; + if (interactive) { + anim = sin(TIME * pulse_speed) * .5 + 1.; + } else { + anim = .5; + } float alpha = step( 1. - max_width * anim, max(uv.x, uv.y)) * step(1. - max_width * m_length, min(uv.x, uv.y) |