diff --git a/gui/main_menu/main_menu.tscn b/gui/main_menu/main_menu.tscn index ca46952..d9e85d1 100644 --- a/gui/main_menu/main_menu.tscn +++ b/gui/main_menu/main_menu.tscn @@ -217,3 +217,4 @@ script = ExtResource("3_qy2xc") [connection signal="value_changed" from="Lobby/HBoxContainer/HostMenu/BuyTime/BuyTimeBox" to="Lobby/HBoxContainer/HostMenu" method="_on_buy_time_box_value_changed"] [connection signal="value_changed" from="Lobby/HBoxContainer/HostMenu/RoundAmount/RoundBox" to="Lobby/HBoxContainer/HostMenu" method="_on_round_box_value_changed"] [connection signal="value_changed" from="Lobby/HBoxContainer/HostMenu/TeamSwitchAmount/TeamSwitchBox" to="Lobby/HBoxContainer/HostMenu" method="_on_team_switch_box_value_changed"] +[connection signal="update_ip" from="Lobby/HBoxContainer/HostMenu/ForwardPortButton" to="Lobby/HBoxContainer/HostMenu/PublicIP" method="on_update_ip"] diff --git a/multiplayer/ip_display.gd b/multiplayer/ip_display.gd index 955a20a..dcad586 100644 --- a/multiplayer/ip_display.gd +++ b/multiplayer/ip_display.gd @@ -1,8 +1,4 @@ extends Label - -func _ready() -> void: - Lobby.update_ip.connect(on_update_ip) - func on_update_ip(to: StringName): text = to diff --git a/multiplayer/lobby.gd b/multiplayer/lobby.gd index 9710a1d..e99056c 100644 --- a/multiplayer/lobby.gd +++ b/multiplayer/lobby.gd @@ -9,8 +9,6 @@ signal lobby_joined signal lobby_closed signal update_teams_state -signal update_ip(StringName) - var in_lobby: bool = false var attack_team: Array[int] = [] diff --git a/multiplayer/port_forward_button.gd b/multiplayer/port_forward_button.gd index 78b10f4..477ee49 100644 --- a/multiplayer/port_forward_button.gd +++ b/multiplayer/port_forward_button.gd @@ -1,5 +1,6 @@ extends Button +signal update_ip(StringName) func _pressed() -> void: var upnp = UPNP.new() @@ -7,18 +8,18 @@ func _pressed() -> void: var discover_error = upnp.discover() if discover_error != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: - Lobby.update_ip.emit("Discover error: " + str(discover_error as UPNP.UPNPResult)) + update_ip.emit("Discover error: " + str(discover_error as UPNP.UPNPResult)) return var error_udp = upnp.add_port_mapping(Lobby.PORT) if error_udp != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: - Lobby.update_ip.emit("UDP forward error: " + str(error_udp as UPNP.UPNPResult)) + update_ip.emit("UDP forward error: " + str(error_udp as UPNP.UPNPResult)) return var error_tcp = upnp.add_port_mapping(Lobby.PORT,0,"","TCP") if error_tcp != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: - Lobby.update_ip.emit("TCP forward error: " + str(error_tcp as UPNP.UPNPResult)) + update_ip.emit("TCP forward error: " + str(error_tcp as UPNP.UPNPResult)) return Lobby.update_ip.emit(upnp.query_external_address()) diff --git a/multiplayer/session.gd b/multiplayer/session.gd index 5ab4149..9507751 100644 --- a/multiplayer/session.gd +++ b/multiplayer/session.gd @@ -333,16 +333,21 @@ func shoot(id:int , limb_damage: int, torso_damage: int,head_damage: int, distan var hit_player: Player = collision["collider"] var shape_object: CollisionShape3D = hit_player.shape_owner_get_owner(collision["shape"]) var reduction: float = 0 + var damage: int = 0 + + match shape_object.get_groups()[0]: + "Head": + damage = head_damage + "Limb": + damage = limb_damage + _: + damage = torso_damage + if damage_reduction_curve != null: var distance_to_hit = (player_camera.global_position - collision["position"]).length()/distance reduction = damage_reduction_curve.sample(distance_to_hit) - match shape_object.get_groups()[0]: - "Head": - hit_player.take_damage(head_damage*reduction) - "Limb": - hit_player.take_damage(limb_damage*reduction) - _: - hit_player.take_damage(torso_damage*reduction) + + hit_player.take_damage(int(float(damage) * reduction)) diff --git a/players/molikman.tscn b/players/molikman.tscn index 8251121..625cb0e 100644 --- a/players/molikman.tscn +++ b/players/molikman.tscn @@ -8748,6 +8748,7 @@ script = ExtResource("28_xqgvn") player = NodePath("..") player_input = NodePath("../PlayerInput") jump_velocity = 12.0 +max_speed_debuff = 75.0 [node name="WeaponSystem" type="Node" parent="." node_paths=PackedStringArray("animation_player", "camera", "player", "player_input")] unique_name_in_owner = true @@ -8802,6 +8803,7 @@ script = ExtResource("37_3lpnn") replication_config = SubResource("SceneReplicationConfig_5amik") script = ExtResource("38_2cl6u") +[connection signal="damaged" from="." to="PlayerMovement" method="apply_speed_debuff"] [connection signal="died" from="." to="molikman_ingame/PlayerBasedVisibility" method="reverse_if_own"] [connection signal="died" from="." to="Camera3D" method="disable"] [connection signal="died" from="." to="Camera3D/molikman_hands/PlayerBasedVisibility" method="reverse_if_own"] diff --git a/players/player/player.gd b/players/player/player.gd index 5266fb9..2d3bd55 100644 --- a/players/player/player.gd +++ b/players/player/player.gd @@ -13,6 +13,7 @@ class_name Player var passived: bool = false signal health_changed(to: int) +signal damaged signal died const MAX_HP = 100 @@ -58,3 +59,4 @@ func depassive() -> void: func take_damage(damage: int): hp -= damage + damaged.emit() diff --git a/players/player/player_movement.gd b/players/player/player_movement.gd index 74dce84..b6a1cc6 100644 --- a/players/player/player_movement.gd +++ b/players/player/player_movement.gd @@ -2,12 +2,19 @@ extends Node class_name PlayerMovement +const XZ_PLANE = Vector3.RIGHT + Vector3.BACK + @export var player: Player @export var player_input: PlayerInput @export var jump_velocity: float +@export_range(0,100,1,"suffix:%") var max_speed_debuff: float +@export var debuff_time: float = 0.5 var disabled: bool +var speed_debuff: float +var debuff_tween: Tween + func disable() -> void: disabled = true @@ -21,11 +28,26 @@ func process_movement(max_speed: float,acceleration: float,deceleration: float,d var input_dir := player_input.direction var direction := (player.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: - player.velocity.x = clamp(player.velocity.x + direction.x * acceleration * delta,-max_speed*abs(direction.x),max_speed*abs(direction.x)) - player.velocity.z = clamp(player.velocity.z + direction.z * acceleration * delta,-max_speed*abs(direction.z),max_speed*abs(direction.z)) + var computed_mult : float = (1.-speed_debuff/100.) + player.velocity.x = clamp(player.velocity.x + direction.x * acceleration * delta * computed_mult,-max_speed*abs(direction.x),max_speed*abs(direction.x)) + player.velocity.z = clamp(player.velocity.z + direction.z * acceleration * delta * computed_mult,-max_speed*abs(direction.z),max_speed*abs(direction.z)) else: player.velocity.x = move_toward(player.velocity.x, 0, deceleration*delta) player.velocity.z = move_toward(player.velocity.z, 0, deceleration*delta) func jump() -> void: player.velocity.y = jump_velocity + +func apply_speed_debuff(): + if debuff_tween: + debuff_tween.kill() + speed_debuff = max_speed_debuff + + var xz_velocity: Vector3 = player.velocity * XZ_PLANE + var new_velocity = xz_velocity * (1.-max_speed_debuff/100.) + + player.velocity = Vector3(new_velocity.x,player.velocity.y,new_velocity.z) + + + debuff_tween = create_tween().set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_SINE) + debuff_tween.tween_property(self,"speed_debuff",0,debuff_time) diff --git a/systems/weapon_system/weapon_system.gd b/systems/weapon_system/weapon_system.gd index 77c2b6a..b712147 100644 --- a/systems/weapon_system/weapon_system.gd +++ b/systems/weapon_system/weapon_system.gd @@ -150,6 +150,8 @@ func remote_ammo_update(ammo: int, remaining_ammo: int): ammo_updated.emit(ammo,remaining_ammo) func notify_slots_updated(): + if not is_multiplayer_authority(): + return var display_slots: Dictionary[StringName,StringName] = {} for key in slots.keys(): if slots[key] == null: