aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/scenes/marker.tscn5
-rw-r--r--client/scripts/controllable_player.gd18
-rw-r--r--client/scripts/game.gd8
-rw-r--r--client/scripts/marker.gd8
-rw-r--r--client/scripts/multiplayer.gd53
-rw-r--r--client/textures/interact_marker.gdshader14
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)