added so you can choose race when starting the game.
This commit is contained in:
@@ -264,6 +264,38 @@ func _complete_disarm() -> void:
|
||||
# Change trap visual to show it's disarmed (optional - could fade out or change color)
|
||||
sprite.modulate = Color(0.5, 0.5, 0.5, 0.5)
|
||||
|
||||
# Grant EXP to all players for disarming trap (only on server)
|
||||
# CRITICAL: Only server should grant EXP to avoid duplicates
|
||||
if multiplayer.has_multiplayer_peer() and multiplayer.is_server():
|
||||
var trap_exp_reward = 8.0 # EXP reward for disarming a trap
|
||||
var all_players = get_tree().get_nodes_in_group("player")
|
||||
var valid_players = []
|
||||
for player in all_players:
|
||||
if is_instance_valid(player) and player.character_stats:
|
||||
valid_players.append(player)
|
||||
|
||||
if valid_players.size() > 0:
|
||||
# Split EXP evenly among all players
|
||||
var exp_per_player = trap_exp_reward / valid_players.size()
|
||||
for player in valid_players:
|
||||
player.character_stats.add_xp(exp_per_player)
|
||||
LogManager.log("Trap disarmed: granted " + str(exp_per_player) + " EXP to " + str(player.name) + " (shared from " + str(trap_exp_reward) + " total)", LogManager.CATEGORY_ENEMY)
|
||||
|
||||
# Sync EXP to client if this player belongs to a client
|
||||
var player_peer_id = player.get_multiplayer_authority()
|
||||
if player_peer_id != 0 and player_peer_id != multiplayer.get_unique_id() and player.has_method("_sync_stats_update"):
|
||||
var coins = player.character_stats.coin if "coin" in player.character_stats else 0
|
||||
var xp = player.character_stats.xp if "xp" in player.character_stats else 0.0
|
||||
player._sync_stats_update.rpc_id(player_peer_id, player.character_stats.kills, coins, xp)
|
||||
|
||||
# Show floating EXP text at trap position and sync to all clients
|
||||
# Show locally first
|
||||
_show_exp_number(exp_per_player, global_position)
|
||||
# Sync to all clients via game_world
|
||||
var game_world = get_tree().get_first_node_in_group("game_world")
|
||||
if game_world and game_world.has_method("_sync_exp_text_at_position") and multiplayer.has_multiplayer_peer():
|
||||
game_world._sync_exp_text_at_position.rpc(exp_per_player, global_position)
|
||||
|
||||
# Sync disarm to all clients (including host when joiner disarms)
|
||||
if multiplayer.has_multiplayer_peer() and is_inside_tree() and is_instance_valid(self):
|
||||
var game_world = get_tree().get_first_node_in_group("game_world")
|
||||
@@ -291,6 +323,38 @@ func _sync_trap_disarmed() -> void:
|
||||
if activation_area:
|
||||
activation_area.monitoring = false
|
||||
|
||||
func _show_exp_number(amount: float, exp_pos: Vector2):
|
||||
# Show EXP number (green, using dmg_numbers.png font) at position
|
||||
var damage_number_scene = preload("res://scenes/damage_number.tscn")
|
||||
if not damage_number_scene:
|
||||
return
|
||||
|
||||
var exp_label = damage_number_scene.instantiate()
|
||||
if not exp_label:
|
||||
return
|
||||
|
||||
# Set text and color for EXP (green)
|
||||
exp_label.label = "+" + str(int(amount)) + " EXP"
|
||||
exp_label.color = Color(0.4, 1.0, 0.4) # Bright green
|
||||
exp_label.z_index = 5
|
||||
|
||||
# Direction is straight up
|
||||
exp_label.direction = Vector2(0, -1)
|
||||
|
||||
# Position at the specified location
|
||||
var game_world = get_tree().get_first_node_in_group("game_world")
|
||||
if game_world:
|
||||
var entities_node = game_world.get_node_or_null("Entities")
|
||||
if entities_node:
|
||||
entities_node.add_child(exp_label)
|
||||
exp_label.global_position = exp_pos + Vector2(0, -20) # Slightly above
|
||||
else:
|
||||
get_tree().current_scene.add_child(exp_label)
|
||||
exp_label.global_position = exp_pos + Vector2(0, -20)
|
||||
else:
|
||||
get_tree().current_scene.add_child(exp_label)
|
||||
exp_label.global_position = exp_pos + Vector2(0, -20)
|
||||
|
||||
func _show_floating_text(text: String, color: Color) -> void:
|
||||
var floating_text_scene = preload("res://scenes/floating_text.tscn")
|
||||
if floating_text_scene:
|
||||
|
||||
Reference in New Issue
Block a user