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) | 
