From e84496dcf8796d9a955b794859136f718d5f93cc Mon Sep 17 00:00:00 2001 From: Lexi Quinn Date: Sat, 30 Mar 2024 16:44:52 +1100 Subject: [PATCH] fixed an issue regarding weapon node names causing multiplayer desync --- .../RocketLauncher/weapon_rocket_launcher.gd | 10 +-- PCs/hero.gd | 72 ++++++++++++++----- Scenes/CardPrinter/card_printer.gd | 4 +- Scenes/CardPrinter/card_printer.tscn | 48 +++++++------ Scripts/edit_tool.gd | 2 + 5 files changed, 90 insertions(+), 46 deletions(-) diff --git a/PCs/Mechanic/ClassCards/RocketLauncher/weapon_rocket_launcher.gd b/PCs/Mechanic/ClassCards/RocketLauncher/weapon_rocket_launcher.gd index 77f3fe4..1f5669f 100644 --- a/PCs/Mechanic/ClassCards/RocketLauncher/weapon_rocket_launcher.gd +++ b/PCs/Mechanic/ClassCards/RocketLauncher/weapon_rocket_launcher.gd @@ -24,11 +24,11 @@ func _process(delta: float) -> void: super._process(delta) if !trigger_held or time_since_firing < time_between_shots or current_energy < energy_cost: return - var target_list: Array[EnemyController] = targets.duplicate() - for target: EnemyController in target_list: - if !is_instance_valid(target): - targets.erase(target) - continue + var target_list: Array[EnemyController] = [] + for target: EnemyController in targets: + if is_instance_valid(target): + target_list.append(target) + targets = target_list for x: int in target_icons.size(): if x < targets.size(): target_icons[x].global_position = targets[x].sprite.global_position diff --git a/PCs/hero.gd b/PCs/hero.gd index c93d77e..9eff552 100644 --- a/PCs/hero.gd +++ b/PCs/hero.gd @@ -36,6 +36,7 @@ signal died @export var swap_off_audio: AudioStreamPlayer @export var swap_on_audio: AudioStreamPlayer +var weapons_spawn_count: int = 0 #Used to prevent node name collisions for multiplayer var inventory_selected_index: int = 0 var equipped_card: Card var offhand_card: Card @@ -124,7 +125,8 @@ func _process(delta: float) -> void: if Input.is_action_just_pressed("Equip In Gauntlet"): equip_weapon() if Input.is_action_just_pressed("Secondary Fire"): - swap_weapons() + if equipped_card or offhand_card: + swap_weapons() if Input.is_action_just_pressed("Select Next Card") and inventory.contents.size() > 1: increment_selected() swap_card_audio.play() @@ -202,6 +204,8 @@ func ready_self() -> void: edit_tool.interact_key_held = false if !ready_state: ready_state = true + hud.place_icon.set_visible(false) + hud.swap_icon.set_visible(false) hud.shrink_wave_start_label() ready_audio.play() networked_set_ready_state.rpc(ready_state) @@ -210,6 +214,10 @@ func ready_self() -> void: func unready_self() -> void: if ready_state: ready_state = false + if !equipped_card: + hud.place_icon.set_visible(true) + if !offhand_card: + hud.swap_icon.set_visible(true) hud.grow_wave_start_label() unready_audio.play() networked_set_ready_state(ready_state) @@ -298,12 +306,12 @@ func equip_weapon() -> void: equipped_card = inventory.remove_at(inventory_selected_index) if !inventory.contents.has(equipped_card): decrement_selected() - networked_equip_weapon.rpc(Data.cards.find(equipped_card)) weapon = equipped_card.weapon_scene.instantiate() + weapon.name = str(weapons_spawn_count) + networked_equip_weapon.rpc(Data.cards.find(equipped_card), 0, weapons_spawn_count) + weapons_spawn_count += 1 weapon.energy_changed.connect(hud.set_weapon_energy) - #weapon.name = "weapon" weapon.set_multiplayer_authority(multiplayer.get_unique_id()) - #gauntlet_sprite.set_visible(false) gauntlet_card_1.set_card(equipped_card) hud.place_icon.set_visible(false) gauntlet_card_1.view_weapon() @@ -372,7 +380,7 @@ func _on_timer_timeout() -> void: func unequip_weapon() -> void: - networked_unequip_weapon.rpc() + networked_unequip_weapon.rpc(0) gauntlet_card_1.set_visible(false) hud.place_icon.set_visible(true) #gauntlet_sprite.set_visible(true) @@ -391,18 +399,48 @@ func networked_set_ready_state(state: bool) -> void: @rpc("reliable") -func networked_equip_weapon(card_index: int) -> void: - equipped_card = Data.cards[card_index] - weapon = equipped_card.weapon_scene.instantiate() - weapon.set_multiplayer_authority(multiplayer.get_remote_sender_id()) - #weapon.name = "weapon" - weapon.set_hero(self) - right_hand.add_child(weapon) +func networked_swap_weapon() -> void: + var temp: Weapon = offhand_weapon + var temp_card: Card = offhand_card + if weapon: + offhand_weapon = weapon + offhand_card = equipped_card + else: + offhand_weapon = null + offhand_card = null + if temp: + weapon = temp + equipped_card = temp_card + else: + weapon = null + equipped_card = null @rpc("reliable") -func networked_unequip_weapon() -> void: - weapon.queue_free() - weapon = null - inventory.add(equipped_card) - equipped_card = null +func networked_equip_weapon(card_index: int, slot: int, id: int) -> void: + var new_card: Card = Data.cards[card_index] + var new_weapon: Weapon = new_card.weapon_scene.instantiate() + new_weapon.set_multiplayer_authority(multiplayer.get_remote_sender_id()) + new_weapon.name = str(id) + new_weapon.set_hero(self) + right_hand.add_child(new_weapon) + match slot: + 0: + equipped_card = new_card + weapon = new_weapon + 1: + offhand_card = new_card + offhand_weapon = new_weapon + + +@rpc("reliable") +func networked_unequip_weapon(slot: int) -> void: + match slot: + 0: + weapon.queue_free() + weapon = null + equipped_card = null + 1: + offhand_weapon.queue_free() + offhand_weapon = null + offhand_card = null diff --git a/Scenes/CardPrinter/card_printer.gd b/Scenes/CardPrinter/card_printer.gd index 86cb55f..0fde846 100644 --- a/Scenes/CardPrinter/card_printer.gd +++ b/Scenes/CardPrinter/card_printer.gd @@ -55,7 +55,7 @@ func retrieve_card(i: int, reply: Hero) -> void: #add_child(item) button_collider.disabled = false button_box.position = Vector3(0,0,0) - $AudioStreamPlayer3D.play() + $StaticBody3D/AudioStreamPlayer3D.play() reply_player = null @@ -63,5 +63,5 @@ func _on_static_body_3d_button_interacted(_value: int, reply: Hero) -> void: reply_player = reply button_collider.disabled = true button_box.position = Vector3(0,0,-0.2) - $AudioStreamPlayer3D.play() + $StaticBody3D/AudioStreamPlayer3D.play() randomize_cards() diff --git a/Scenes/CardPrinter/card_printer.tscn b/Scenes/CardPrinter/card_printer.tscn index 49ee980..2313839 100644 --- a/Scenes/CardPrinter/card_printer.tscn +++ b/Scenes/CardPrinter/card_printer.tscn @@ -10,7 +10,7 @@ albedo_color = Color(0.203922, 0.592157, 0.592157, 1) [sub_resource type="BoxShape3D" id="BoxShape3D_0ebt5"] -size = Vector3(2.672, 1.75, 1) +size = Vector3(2, 2.1, 1) [sub_resource type="ViewportTexture" id="ViewportTexture_yf4je"] viewport_path = NodePath("SubViewport") @@ -24,15 +24,15 @@ viewport_path = NodePath("SubViewport3") [sub_resource type="BoxShape3D" id="BoxShape3D_ikdwj"] size = Vector3(1.29447, 0.342125, 0.277604) -[sub_resource type="BoxShape3D" id="BoxShape3D_gv3t5"] -size = Vector3(0.763889, 0.773027, 0.0570252) - [sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_73g2w"] random_pitch = 1.1 streams_count = 1 stream_0/stream = ExtResource("5_m033a") stream_0/weight = 1.0 +[sub_resource type="BoxShape3D" id="BoxShape3D_gv3t5"] +size = Vector3(0.617184, 0.869944, 0.0570252) + [node name="CardPrinter" type="StaticBody3D" node_paths=PackedStringArray("cards", "button_collider", "button_box", "choice_colliders")] script = ExtResource("1_qft15") cards = [NodePath("SubViewport/Node2D"), NodePath("SubViewport2/Node2D"), NodePath("SubViewport3/Node2D")] @@ -42,52 +42,59 @@ button_box = NodePath("StaticBody3D/CollisionShape3D2/CSGBox3D") choice_colliders = [NodePath("StaticBody3D2/CollisionShape3D2"), NodePath("StaticBody3D3/CollisionShape3D2"), NodePath("StaticBody3D4/CollisionShape3D2")] [node name="CSGBox3D" type="CSGBox3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.875, 0) -size = Vector3(2.672, 1.75, 1) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.05, 0) +size = Vector3(2, 2.1, 1) material = SubResource("StandardMaterial3D_s02au") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.875, 0) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.05, 0) shape = SubResource("BoxShape3D_0ebt5") [node name="SubViewport" type="SubViewport" parent="."] transparent_bg = true +size = Vector2i(352, 512) render_target_update_mode = 4 [node name="Node2D" parent="SubViewport" instance=ExtResource("3_wygtg")] +position = Vector2(-56, 0) [node name="SubViewport2" type="SubViewport" parent="."] transparent_bg = true +size = Vector2i(352, 512) render_target_update_mode = 4 [node name="Node2D" parent="SubViewport2" instance=ExtResource("3_wygtg")] +position = Vector2(-56, 0) [node name="SubViewport3" type="SubViewport" parent="."] transparent_bg = true +size = Vector2i(352, 512) render_target_update_mode = 4 [node name="Node2D" parent="SubViewport3" instance=ExtResource("3_wygtg")] +position = Vector2(-56, 0) [node name="Node3D" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.149617, 0) visible = false [node name="Sprite3D" type="Sprite3D" parent="Node3D"] -transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, -0.805106, 1.12938, 0.500052) +transform = Transform3D(0.175, 0, 0, 0, 0.175, 0, 0, 0, 0.175, -0.65, 1.65, 0.506948) texture_filter = 0 texture = SubResource("ViewportTexture_yf4je") [node name="Sprite3D2" type="Sprite3D" parent="Node3D"] -transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0.0180808, 1.12938, 0.500052) +transform = Transform3D(0.175, 0, 0, 0, 0.175, 0, 0, 0, 0.175, 0, 1.65, 0.506948) texture_filter = 0 texture = SubResource("ViewportTexture_3q3h0") [node name="Sprite3D3" type="Sprite3D" parent="Node3D"] -transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0.843507, 1.12938, 0.500052) +transform = Transform3D(0.175, 0, 0, 0, 0.175, 0, 0, 0, 0.175, 0.65, 1.65, 0.506948) texture_filter = 0 texture = SubResource("ViewportTexture_vyyy4") [node name="StaticBody3D" type="StaticBody3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.444448, 0.610684) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.847404, 0.610684) collision_layer = 16 collision_mask = 0 script = ExtResource("4_eavi1") @@ -100,20 +107,24 @@ shape = SubResource("BoxShape3D_ikdwj") [node name="CSGBox3D" type="CSGBox3D" parent="StaticBody3D/CollisionShape3D2"] size = Vector3(1.29447, 0.342125, 0.277604) +[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="StaticBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.010989, -0.086501) +stream = SubResource("AudioStreamRandomizer_73g2w") +bus = &"SFX" + [node name="StaticBody3D2" type="StaticBody3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.756734, 1.15772, 0.610684) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.650194, 1.50143, 0.528758) collision_layer = 16 collision_mask = 0 script = ExtResource("4_eavi1") hover_text = "Select card" [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0466152, -0.0297148, -0.0917365) shape = SubResource("BoxShape3D_gv3t5") disabled = true [node name="StaticBody3D3" type="StaticBody3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0672475, 1.15772, 0.610684) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.000848182, 1.5001, 0.528758) collision_layer = 16 collision_mask = 0 script = ExtResource("4_eavi1") @@ -121,12 +132,11 @@ button_press_value = 1 hover_text = "Select card" [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0466152, -0.0297148, -0.0917365) shape = SubResource("BoxShape3D_gv3t5") disabled = true [node name="StaticBody3D4" type="StaticBody3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.883877, 1.15772, 0.610684) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.648946, 1.49865, 0.528758) collision_layer = 16 collision_mask = 0 script = ExtResource("4_eavi1") @@ -134,15 +144,9 @@ button_press_value = 2 hover_text = "Select card" [node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0466152, -0.0297148, -0.0917365) shape = SubResource("BoxShape3D_gv3t5") disabled = true -[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.433459, 0.524183) -stream = SubResource("AudioStreamRandomizer_73g2w") -bus = &"SFX" - [connection signal="button_interacted" from="StaticBody3D" to="." method="_on_static_body_3d_button_interacted"] [connection signal="button_interacted" from="StaticBody3D2" to="." method="retrieve_card"] [connection signal="button_interacted" from="StaticBody3D3" to="." method="retrieve_card"] diff --git a/Scripts/edit_tool.gd b/Scripts/edit_tool.gd index c26b8c7..888653f 100644 --- a/Scripts/edit_tool.gd +++ b/Scripts/edit_tool.gd @@ -155,6 +155,8 @@ func build_wall() -> void: func refund_wall(wall: TowerBase) -> void: + if !is_instance_valid(wall): + return last_collider = null if wall.has_card: wall.remove_card()