From 81e79dd0a5a33e2a19f1fac269803ef206a54ec9 Mon Sep 17 00:00:00 2001 From: Luiz de Oliveira Date: Sat, 10 Apr 2021 11:40:17 -0300 Subject: [PATCH] 30 - simple TextChat --- Game/Assets/UI/HUD.gd | 2 +- Game/Assets/UI/HUD.tscn | 14 +++ Game/Classes/Player/Player.gd | 157 +++++++++++++++-------------- Game/Classes/Player/Player.tscn | 3 +- Game/Classes/UI/CharacterSelect.gd | 8 +- Game/Classes/UI/TextChat.gd | 63 ++++++++++++ Game/Classes/UI/TextChat.tscn | 51 ++++++++++ Game/Game.gd | 103 +++++++++++-------- Game/Game.tscn | 9 +- Game/PlayerListContainer.gd | 6 +- Game/project.godot | 10 ++ 11 files changed, 294 insertions(+), 132 deletions(-) create mode 100644 Game/Classes/UI/TextChat.gd create mode 100644 Game/Classes/UI/TextChat.tscn diff --git a/Game/Assets/UI/HUD.gd b/Game/Assets/UI/HUD.gd index 2de6bfe..2c6880c 100644 --- a/Game/Assets/UI/HUD.gd +++ b/Game/Assets/UI/HUD.gd @@ -6,7 +6,7 @@ func update_ammo(var weapon, var amount): func updateHealth(health: int): $Health/HealthBar.value = health $Health/HealthBar/HealthText.text = String(health) - + func update_crosshair(visible: bool, hit: bool): $Crosshair.visible = visible if hit: diff --git a/Game/Assets/UI/HUD.tscn b/Game/Assets/UI/HUD.tscn index d95cecc..316a85e 100644 --- a/Game/Assets/UI/HUD.tscn +++ b/Game/Assets/UI/HUD.tscn @@ -57,6 +57,7 @@ __meta__ = { } [node name="Health" parent="." instance=ExtResource( 2 )] +mouse_filter = 2 [node name="Weapon" type="MarginContainer" parent="."] anchor_left = 1.0 @@ -69,6 +70,7 @@ margin_right = -32.0 margin_bottom = -32.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -90,6 +92,7 @@ margin_right = 116.0 margin_bottom = 64.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 alignment = 1 [node name="RoundsClips" type="Label" parent="Weapon/VBoxContainer"] @@ -123,6 +126,7 @@ margin_left = -511.401 margin_top = -301.225 margin_right = 512.599 margin_bottom = 298.775 +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -132,6 +136,7 @@ margin_left = 512.0 margin_top = 300.0 margin_right = 512.0 margin_bottom = 300.0 +mouse_filter = 2 [node name="Line1" type="ColorRect" parent="Crosshair/CrosshairCenter"] margin_left = 8.0 @@ -139,6 +144,7 @@ margin_top = -1.0 margin_right = 20.0 margin_bottom = 1.0 rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -150,6 +156,7 @@ margin_right = 20.0 margin_bottom = 1.0 rect_rotation = 90.0 rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -161,6 +168,7 @@ margin_right = 20.0 margin_bottom = 1.0 rect_rotation = 180.0 rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -172,6 +180,7 @@ margin_right = 20.0 margin_bottom = 1.0 rect_rotation = -90.0 rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -182,6 +191,7 @@ margin_left = 512.0 margin_top = 300.0 margin_right = 512.0 margin_bottom = 300.0 +mouse_filter = 2 script = ExtResource( 3 ) [node name="HitConfirmationSound" type="AudioStreamPlayer" parent="Crosshair/HitConfirmation"] @@ -198,6 +208,7 @@ margin_bottom = 1.0 rect_rotation = 45.3067 rect_scale = Vector2( 1, 0.5 ) rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -210,6 +221,7 @@ margin_bottom = 1.0 rect_rotation = 135.307 rect_scale = Vector2( 1, 0.5 ) rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -222,6 +234,7 @@ margin_bottom = 1.0 rect_rotation = 225.306 rect_scale = Vector2( 1, 0.5 ) rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } @@ -234,6 +247,7 @@ margin_bottom = 1.0 rect_rotation = -44.6931 rect_scale = Vector2( 1, 0.5 ) rect_pivot_offset = Vector2( -8, 1 ) +mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } diff --git a/Game/Classes/Player/Player.gd b/Game/Classes/Player/Player.gd index ebfafe9..bcb3cdc 100644 --- a/Game/Classes/Player/Player.gd +++ b/Game/Classes/Player/Player.gd @@ -43,7 +43,7 @@ onready var active_weapon = weapons.switch_to_weapon(0) #onready var sfx_foosteps = [$"Sounds/Footstep-Concrete-01", # $"Sounds/Footstep-Concrete-02", # $"Sounds/Footstep-Concrete-03", -# $"Sounds/Footstep-Concrete-04"] +# $"Sounds/Footstep-Concrete-04"] #var sfx_footsteps_last = 0 #var sfx_footsteps_next = 0 @@ -88,17 +88,17 @@ remote func set_player_data(player): func get_closest_point(_A: Vector3, _B: Vector3): var A = transform.inverse().xform(_A) var B = transform.inverse().xform(_B) - + var diff = B - A var result = A - (A.dot(diff) * diff) / (diff.length_squared()) return transform.xform(result) func on_bullet_flyby(from, to): var closest_point = get_closest_point(from, to) - + var flyby_noise = preload("res://Classes/Audio/BulletFlyBySoundPlayer.tscn").instance() flyby_noise.translation = closest_point - + get_tree().root.call_deferred("add_child", flyby_noise) remote func jump(): @@ -112,15 +112,15 @@ func jetpack(delta): # Swap these to try the different versions of the jetpack. #jetpack_grounded(delta) #jetpack_empty(delta) - + # activate visual jetpack effects when sound is playing: $Sounds/Jetpack.stream_paused = !jetpack_fireing - + $Effects/JetpackFlame.emitting = jetpack_fireing $Effects/JetpackSmoke.emitting = jetpack_fireing $Effects/JetpackLight.visible = jetpack_fireing #print(get_tree().get_network_unique_id()) - + #$Effects/JetpackFlame.emitting = ! $Sounds/Jetpack.stream_paused #$Effects/JetpackSmoke.emitting = ! $Sounds/Jetpack.stream_paused #$Effects/JetpackLight.visible = ! $Sounds/Jetpack.stream_paused @@ -129,22 +129,22 @@ func jetpack_empty(delta): debug.text = "JP fuel: %s\nJP active: %s\nJP used: %s\nJP sound: %s" % [ jetpack_fuel, jetpack_active, jetpack_used, !$Sounds/Jetpack.stream_paused ] - + # Enable jetpack when it is fully charged. if jetpack_fuel > (JETPACK_FUEL_MAX - 0.001): jetpack_used = false # Disable jetpack when it is empty. elif jetpack_fuel <= 0 and not jetpack_active: jetpack_used = true - + if jetpack_active and not jetpack_used and jetpack_fuel > 0: velocity.y += JETPACK_THRUST * delta jetpack_fuel -= delta - + $Sounds/Jetpack.stream_paused = false else: $Sounds/Jetpack.stream_paused = true - + # Only charge when fully empty. if jetpack_used: jetpack_fuel = clamp( @@ -158,7 +158,7 @@ func jetpack_grounded(delta): debug.text = "JP fuel: %s\nJP active: %s\nJP sound: %s" % [ jetpack_fuel, jetpack_active, !$Sounds/Jetpack.stream_paused ] - + # Only charge when grounded. if is_on_floor: jetpack_fuel = clamp( @@ -166,13 +166,13 @@ func jetpack_grounded(delta): 0.0, JETPACK_FUEL_MAX ) - + jetpack_fireing = false - + # Only use jetpack in the air. else: if jetpack_active and jetpack_fuel > 0: - + velocity.y += JETPACK_THRUST * delta jetpack_fuel -= delta jetpack_fireing = true @@ -187,42 +187,42 @@ remote func mouselook(rel): var sensitivity = MOUSE_SENSITIVITY * game.mouse_sensitivity_multiplier rotate_y(- rel.x * sensitivity) camera.rotation.x = clamp(camera.rotation.x-rel.y * sensitivity, -PI/2, PI/2) - + rpc_unreliable("mouselook_abs", camera.rotation.x, rotation.y) func _physics_process(delta): if get_parent().name != "Players": return - + check_floor_collision() - + walk(delta) fall(delta) jetpack_grounded(delta) - - + + if str(get_tree().get_network_unique_id()) != name: return - + var movement_vector = Vector3() if jump_timeout > 0: movement_vector = move_and_slide(velocity, Vector3.UP) else: var upvector = floor_normal movement_vector = move_and_slide_with_snap(velocity, Vector3.DOWN, upvector, true) - + velocity = movement_vector - + rset("translation", translation) func check_floor_collision(): var space_state = get_world().direct_space_state - + var from = global_transform.xform(Vector3(0, 0.0, 0)) var to = global_transform.xform(Vector3(0, -0.3, 0.0)) - + var result = space_state.intersect_ray(from, to) - + if jump_timeout > 0: is_on_floor = false elif result: @@ -233,38 +233,39 @@ func check_floor_collision(): func walk(delta): jump_timeout -= delta - + # Walk walk_direction = Vector2() - - if Input.is_action_pressed("MoveForward"): - walk_direction.y -= 1 - if Input.is_action_pressed("MoveBack"): - walk_direction.y += 1 - if Input.is_action_pressed("MoveLeft"): - walk_direction.x -= 1 - if Input.is_action_pressed("MoveRight"): - walk_direction.x += 1 - + + if not get_tree().is_input_handled(): + if Input.is_action_pressed("MoveForward"): + walk_direction.y -= 1 + if Input.is_action_pressed("MoveBack"): + walk_direction.y += 1 + if Input.is_action_pressed("MoveLeft"): + walk_direction.x -= 1 + if Input.is_action_pressed("MoveRight"): + walk_direction.x += 1 + walk_direction = walk_direction.normalized() - + var walking_speed = Vector2(velocity.x, velocity.z) - + walking_speed = walking_speed.rotated(rotation.y) - + if is_on_floor: walking_speed = lerp(walking_speed, walk_direction * WALK_VELOCITY, delta * WALK_ACCEL) else: walking_speed = lerp(walking_speed, walk_direction * JUMP_VELOCITY, delta * JUMP_ACCEL) walking_speed = walking_speed.rotated(-rotation.y) - + velocity.x = walking_speed.x velocity.z = walking_speed.y - + # Make walking perpendicular to the floor if is_on_floor: velocity.y -= velocity.dot(floor_normal) / floor_normal.y - + if walking_speed.length() > 0 and is_on_floor: weapon_bob_anim.travel("Walk") elif walking_speed.length() == 0 and is_on_floor: @@ -275,18 +276,18 @@ func fall(delta): if is_on_floor: if not was_on_floor: # if this is the first frame of ground conotact after a frame of no ground contact - we've just ended a fall weapon_bob_anim.travel("Land") - + else: velocity += delta * GRAVITY - + was_on_floor = is_on_floor - + master func on_hit(damage, location): set_health(health - 30) - + rpc("blood_splatter", location) - + if health <= 0: rpc("kill") else: @@ -300,42 +301,42 @@ sync func blood_splatter(location): master func kill(): if is_dead: return - + $Sounds/Death.rpc("play") - + is_dead = true - + set_health(0) $CollisionShapeBody.disabled = true - + $Camera/Hand.hide() #$HUD.update_crosshair(false, false) - + yield(get_tree().create_timer(3), "timeout") - + spawn() - + yield(get_tree().create_timer(3), "timeout") - + # for i in gibs.get_children(): # i.queue_free() # yield(get_tree().create_timer(rand_range(0.1, 1)), "timeout") - + # gibs.queue_free() func spawn(): rpc("unset_death") set_health(max_health) - + velocity = Vector3() - + game.get_spawn_point().spawn(self) - + $Camera/Hand.show() $HUD.show() - + $CollisionShapeBody.disabled = false - + $Camera.rotation = Vector3.ZERO rotation = Vector3.ZERO @@ -357,39 +358,39 @@ sync func switch_to_next_weapon(): sync func switch_to_prev_weapon(): active_weapon = weapons.prev_weapon() -func _input(event): +func _unhandled_input(event): if is_dead: return - + if str(get_tree().get_network_unique_id()) != name: return - + if game.GAME_MODE != "PLAYING": return - + # Moouselook if event is InputEventMouseMotion: var rel = event.relative - + mouselook(rel) - + # Jump if event.is_action_pressed("MoveJump"): rpc("jump") jump() - + # Jetpack if event.is_action_pressed("MoveJetpack"): rpc("set_jetpack_active", true) if event.is_action_released("MoveJetpack"): rpc("set_jetpack_active", false) - + # Weapon if event.is_action_pressed("WeaponPrimary"): shoot() if event.is_action_pressed("WeaponReload"): reload() - + if event.is_action_pressed("WeaponNext"): rpc("switch_to_next_weapon") if event.is_action_pressed("WeaponPrev"): @@ -407,30 +408,30 @@ func set_local_player(): # Called when the node enters the scene tree for the first time. func _ready(): $HUD/Health/HealthBar.max_value = max_health - + # Set player class var path = get_script().get_path() - + if path.find("res://Assets/Characters/") != -1: player_class = path.replace("res://Assets/Characters/", "").split("/")[0] - + set_health(max_health) # disabled the ragdoll collider #for i in $Player/Gibs.get_children(): # i.get_child(1).disabled = true #disabled = true #$"Player/Gibs/PlayerGibs _cell /shape0".set_disabled(true) - + rset_config("translation", MultiplayerAPI.RPC_MODE_SYNC) if !show_healthbar: $Billboard.hide() - + # only show the debug label on local machine if name != String(get_tree().get_network_unique_id()): debug.hide() - + # initialize sound looping - + #$Sounds/Jetpack.stream. # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/Game/Classes/Player/Player.tscn b/Game/Classes/Player/Player.tscn index 58c7667..a944b4c 100644 --- a/Game/Classes/Player/Player.tscn +++ b/Game/Classes/Player/Player.tscn @@ -220,7 +220,7 @@ script = ExtResource( 8 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.53592, -0.0651628 ) [node name="Hand" type="Spatial" parent="Camera"] -transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.392298, -0.559 ) +transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.390282, -0.559 ) [node name="WeaponBobAnimationTree" type="AnimationTree" parent="Camera/Hand"] tree_root = SubResource( 12 ) @@ -356,3 +356,4 @@ stream_paused = true [node name="HUD" parent="." instance=ExtResource( 7 )] visible = false +mouse_filter = 2 diff --git a/Game/Classes/UI/CharacterSelect.gd b/Game/Classes/UI/CharacterSelect.gd index 01e83e3..4efdbe8 100644 --- a/Game/Classes/UI/CharacterSelect.gd +++ b/Game/Classes/UI/CharacterSelect.gd @@ -7,22 +7,22 @@ func _ready(): var dir = Directory.new() dir.open("res://Assets/Characters/") dir.list_dir_begin() - + var file = dir.get_next() while file != "": if not file.begins_with("."): # Add character add_character(file) - + file = dir.get_next() func add_character(character_name): var path = "res://Assets/Characters/" + character_name + "/" + character_name + ".tscn" var packed_character = load(path) - + var character_option = preload("res://Classes/UI/CharacterOption.tscn").instance() $CenterContainer/VBoxContainer/CharacterList.add_child(character_option) - + character_option.set_character(packed_character) character_option.connect("character_selected", self, "character_selected", [character_name, packed_character]) diff --git a/Game/Classes/UI/TextChat.gd b/Game/Classes/UI/TextChat.gd new file mode 100644 index 0000000..81b1a81 --- /dev/null +++ b/Game/Classes/UI/TextChat.gd @@ -0,0 +1,63 @@ +extends Control + +signal typing_toggled(is_typing) + +const TOGGLE_KEY = KEY_ENTER +const MESSAGE_FORMAT = "%s: %s" + +sync var chat_text: = "" setget set_chat_text + +var player_name: = "Unknown" + +onready var line_edit: LineEdit = $LineEdit +onready var chat_history: RichTextLabel = $Panel/ChatHistory + +func _input(event: InputEvent) -> void: + pass + + +func _unhandled_input(event: InputEvent) -> void: + if is_typing(): + get_tree().set_input_as_handled() + + if event.is_action_pressed("ToggleChatWrite"): + toggle_typing() + +func toggle() -> bool: + visible = not visible + + if not visible: + $LineEdit.hide() + + return visible + +func toggle_typing() -> bool: + $LineEdit.visible = not $LineEdit.visible and visible + + return $LineEdit.visible + +func is_typing() -> bool: + return $LineEdit.visible + +func _on_LineEdit_text_entered(new_text: String) -> void: + toggle_typing() + if new_text: + var formatted_message = MESSAGE_FORMAT % [player_name, new_text] + line_edit.text = "" + rset("chat_text", chat_text + formatted_message) + +func _on_LineEdit_visibility_changed() -> void: + if line_edit.visible: + line_edit.grab_focus() + else: + line_edit.release_focus() + +func set_chat_text(value: String) -> void: + visible = true + chat_text = "%s\n" % value + chat_history.text = chat_text + + +func _on_LineEdit_gui_input(event: InputEvent) -> void: + get_tree().set_input_as_handled() + pass diff --git a/Game/Classes/UI/TextChat.tscn b/Game/Classes/UI/TextChat.tscn new file mode 100644 index 0000000..f151358 --- /dev/null +++ b/Game/Classes/UI/TextChat.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Classes/UI/TextChat.gd" type="Script" id=1] + +[node name="TextChat" type="Control"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = 8.0 +margin_top = -192.0 +margin_right = 200.0 +margin_bottom = -8.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="Panel" parent="."] +self_modulate = Color( 1, 1, 1, 0.670588 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = -32.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ChatHistory" type="RichTextLabel" parent="Panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 8.0 +margin_top = 8.0 +margin_right = -8.0 +margin_bottom = -8.0 +text = " +" +scroll_following = true +selection_enabled = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineEdit" type="LineEdit" parent="."] +visible = false +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_top = -24.0 +__meta__ = { +"_edit_use_anchors_": false +} +[connection signal="text_entered" from="LineEdit" to="." method="_on_LineEdit_text_entered"] +[connection signal="visibility_changed" from="LineEdit" to="." method="_on_LineEdit_visibility_changed"] diff --git a/Game/Game.gd b/Game/Game.gd index 6c0c71e..e5e8184 100644 --- a/Game/Game.gd +++ b/Game/Game.gd @@ -24,44 +24,44 @@ onready var menu_stack = [$MenuContainer/MainMenu] func set_local_player(player): if local_player != null: $Players.remove_child(local_player) - + local_player = player - + var id = peer.get_unique_id() player.name = str(id) player.set_network_master(id) $Players.add_child(local_player) player.set_local_player() - + var nickname = $MenuContainer/MainMenu/Name.text set_nickname(nickname) player.set_nickname(nickname) - + var player_data = get_player_data() - + rpc("set_player_data", player_data) - + $PlayerListContainer.update_player_list() - + player.hide() # Called when the node enters the scene tree for the first time. func _ready(): $MenuContainer/ConnectMenu/Destination/IPAdress.set_text(SERVER_IP) $MenuContainer/ConnectMenu/Destination/Port.set_text(str(SERVER_PORT)) - + load_settings() - + if auto_host: initialize_server(false) func load_settings(): var load_settings = File.new() load_settings.open("user://settings.save", File.READ) - + if load_settings.is_open(): var settings = parse_json(load_settings.get_as_text()) - + for setting in settings: load_setting(setting, settings[setting]) @@ -71,7 +71,7 @@ func load_setting(setting, value): func save_setting(setting, value): var save_settings = File.new() save_settings.open("user://settings.save", File.READ_WRITE) - + if save_settings.is_open(): var settings = parse_json(save_settings.get_as_text()) settings[setting] = value @@ -97,15 +97,19 @@ func _input(event): for button in buttons: if button.name == "Back": button.emit_signal("pressed") - + if event.is_action_pressed("ShowPlayerList") and !$MenuContainer.visible: $PlayerListContainer.show() - + if event.is_action_released("ShowPlayerList"): $PlayerListContainer.hide() + if event.is_action_pressed("ToggleChatVisibility") and not $TextChat.is_typing() and GAME_MODE == "PLAYING": + $TextChat.toggle() + func open_menus(): GAME_MODE = "MENU" + $TextChat.hide() Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) $MenuContainer.show() @@ -119,7 +123,7 @@ func return_to_menu(type=null): if type == null: menu_stack.pop_back() type = menu_stack[-1].name - + for menu in $MenuContainer.get_children(): if menu.name == type: if type != null: @@ -164,7 +168,7 @@ func set_mouse_sensitivity(sensitivity_multiplier, save=true): mouse_sensitivity_multiplier = sensitivity_multiplier else: return - + if save: save_setting("mouse_sensitivity", sensitivity_multiplier) else: @@ -175,7 +179,7 @@ func set_fullscreen(is_fullscreen, save=true): OS.window_fullscreen = is_fullscreen else: return - + if save: save_setting("is_fullscreen", is_fullscreen) else: @@ -187,6 +191,8 @@ func set_nickname(nickname, save=true): else: $MenuContainer/MainMenu/Name.text = nickname + $TextChat.player_name = nickname + func debug_connection_status(): if (get_tree().network_peer.get_connection_status() == NetworkedMultiplayerPeer.CONNECTION_CONNECTING): print("We are trying to connect") @@ -202,9 +208,9 @@ func initialize_server(join=true): get_tree().connect("network_peer_connected", self, "on_peer_connected") get_tree().connect("network_peer_disconnected", self, "on_peer_disconnected") get_tree().network_peer = peer - + initialize() - + if join: join_game() #add_player(peer.get_unique_id(), false) @@ -214,32 +220,32 @@ func initialize_client(): get_tree().connect("connected_to_server", self, "on_connection_established") get_tree().connect("connection_failed", self, "on_connection_failed") get_tree().network_peer = peer - + initialize() func initialize(): return_to_menu("MainMenu") - + #$MenuContainer/MainMenu/Connect.hide() #$MenuContainer/MainMenu/Disconnect.show() - + #close_menus() func free_client(): $MenuContainer/MainMenu/Connect.show() $MenuContainer/MainMenu/Disconnect.hide() - + for player in $Players.get_children(): player.queue_free() - + for player_list_item in $PlayerListContainer/Panel/PlayerList.get_children(): player_list_item.queue_free() - + peer.close_connection() - + get_tree().network_peer = null local_player = null - + return_to_menu("MainMenu") func quit(): @@ -247,15 +253,15 @@ func quit(): func get_player_data(): var players = $Players.get_children() - + var player_data = {} for player in players: var data = {} data["nickname"] = player.nickname data["char_class"] = player.player_class - + player_data[player.name] = data - + return player_data func get_character_scene(character_name): @@ -266,37 +272,37 @@ func get_character_scene(character_name): remote func check_players(player_data): for player_name in player_data: var data = player_data[player_name] - + if $Players.has_node(player_name): var p = $Players.get_node(player_name) if data["char_class"] != p.player_class: $Players.remove_child(p) - + if not $Players.has_node(player_name): var player = get_character_scene(data["char_class"]).instance() - + player.name = player_name player.set_network_master(int(player_name)) - + $Players.add_child(player) player.translation += Vector3(0.0, 3.0, 0.0) - + player.set_nickname(data["nickname"]) - + $PlayerListContainer.update_player_list() func join_game(): var player = player_scene.instance() - + set_local_player(player) - + open_menu("CharacterSelectScreen") sync func spawn(player_id): var spawning_player = $Players.get_node(str(player_id)) - + $Level.show() - + spawning_player.spawn() spawning_player.show() close_menus() @@ -305,7 +311,7 @@ sync func remove_player(id): for player in $Players.get_children(): if player.name == str(id): player.free() - + $PlayerListContainer.update_player_list() @@ -317,14 +323,14 @@ func on_peer_connected(id): master func set_player_data(player_data): check_players(player_data) - + var new_player_data = get_player_data() - + rpc("check_players", new_player_data) func on_peer_disconnected(id): print("Peer disconnected with id ", id) - + rpc("remove_player", id) func on_connection_established(): @@ -333,3 +339,12 @@ func on_connection_established(): func on_connection_failed(): print("Connection has failed") + + +func _on_TextChat_typing_toggled(is_typing) -> void: + if is_typing: + GAME_MODE = "MENU" + + else: + GAME_MODE = "PLAYING" + pass diff --git a/Game/Game.tscn b/Game/Game.tscn index e775f01..6708e5d 100644 --- a/Game/Game.tscn +++ b/Game/Game.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://Classes/UI/theme.tres" type="Theme" id=1] [ext_resource path="res://Game.gd" type="Script" id=2] [ext_resource path="res://Assets/Maps/DM1/DM1.tscn" type="PackedScene" id=3] [ext_resource path="res://Classes/UI/CharacterSelect.tscn" type="PackedScene" id=4] [ext_resource path="res://PlayerListContainer.gd" type="Script" id=5] +[ext_resource path="res://Classes/UI/TextChat.tscn" type="PackedScene" id=6] [node name="Game" type="Node"] script = ExtResource( 2 ) @@ -317,6 +318,11 @@ theme = ExtResource( 1 ) [node name="PlayerList" type="VBoxContainer" parent="PlayerListContainer/Panel"] theme = ExtResource( 1 ) alignment = 1 + +[node name="TextChat" parent="." instance=ExtResource( 6 )] +visible = false +margin_top = -264.542 +margin_bottom = -80.5416 [connection signal="pressed" from="MenuContainer/MainMenu/QuickConnect" to="." method="join_test_server"] [connection signal="pressed" from="MenuContainer/MainMenu/Connect" to="." method="open_menu" binds= [ "ConnectMenu" ]] [connection signal="pressed" from="MenuContainer/MainMenu/Disconnect" to="." method="free_client"] @@ -339,5 +345,6 @@ alignment = 1 [connection signal="value_changed" from="MenuContainer/ControlsMenu/HBoxContainer/SensitivitySlider" to="." method="set_mouse_sensitivity"] [connection signal="pressed" from="MenuContainer/GraphicsMenu/Back" to="." method="return_to_menu" binds= [ "OptionsMenu" ]] [connection signal="toggled" from="MenuContainer/GraphicsMenu/Fullscreen" to="." method="set_fullscreen"] +[connection signal="typing_toggled" from="TextChat" to="." method="_on_TextChat_typing_toggled"] [editable path="MenuContainer/CharacterSelectScreen"] diff --git a/Game/PlayerListContainer.gd b/Game/PlayerListContainer.gd index 47cc324..5e04e02 100644 --- a/Game/PlayerListContainer.gd +++ b/Game/PlayerListContainer.gd @@ -4,12 +4,12 @@ var tracked_players = [] func update_player_list(): var players = get_parent().get_node("Players").get_children() - + for child in $Panel/PlayerList.get_children(): $Panel/PlayerList.remove_child(child) - + for player in players: var player_list_item = preload("res://Classes/UI/PlayerListItem.tscn").instance() $Panel/PlayerList.add_child(player_list_item) player_list_item.player = player - + diff --git a/Game/project.godot b/Game/project.godot index bbd5662..a6119d1 100644 --- a/Game/project.godot +++ b/Game/project.godot @@ -104,6 +104,16 @@ WeaponPrev={ "events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null) ] } +ToggleChatWrite={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null) + ] +} +ToggleChatVisibility={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":89,"unicode":0,"echo":false,"script":null) + ] +} [rendering]