extends RigidBody sync var left = 0 sync var right = 0 var active = false var right_active = false var activation_margin = 0.1 var update_frequency = 2 # In secs. This isn't too fast-paced, so don't clog the network with updates every frame var update_count = 0 var master_team_right = null var friend_color var enemy_color var build_rate = 1.5 var restart_count = 0 var restart_time = 15 slave func set_status(status): transform = status[0] angular_velocity = status[1] func get_status(): return [ transform, angular_velocity, ] func _process(delta): # Figure out what team we're on # We have to do this here because we never know when the master player will actually be added if master_team_right == null: var master_player = util.get_master_player() if master_player: master_team_right = master_player.player_info.is_right_team friend_color = master_player.friend_color enemy_color = master_player.enemy_color else: master_team_right = true # Doesn't matter, it's all graphical and we're headless friend_color = Color() enemy_color = Color() var name = "right" if master_team_right else "left" var full_name = "res://assets/objective-%s.png" % name get_node("MeshInstance").get_surface_material(0).albedo_texture = load(full_name) # Check what's active var rot = rotation.x if active: activation_margin = 0 if rot > activation_margin: active = true right_active = false if rot < -activation_margin: active = true right_active = true if active: if right_active == master_team_right: # We DO own the correct one; display left counting, blue get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", friend_color) get_node("../HUD/RightTeam").add_color_override("font_color_shadow", Color(0,0,0,0)) else: # We DO NOT own the correct one; display right counting, red get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", Color(0,0,0,0)) get_node("../HUD/RightTeam").add_color_override("font_color_shadow", enemy_color) # Count the percents if active: if right_active: right += delta * build_rate else: left += delta * build_rate update_count += delta / Engine.time_scale # This is important so we update at 100% as well if is_network_master() and update_count > update_frequency: update_count = 0 rset("left", left) rset("right", right) if is_network_master(): rpc_unreliable("set_status", get_status()) # Check for game over var game_over = false var winner_right if left >= 100: game_over = true winner_right = false left = 100 if right >= 100: game_over = true winner_right = true right = 100 if game_over: var text = "You lose :(" if winner_right == master_team_right: text = "You win!!!" get_node("../HUD/Finish").set_text(text) Engine.time_scale = 0.1 # You won't believe this, but because time_scale is 0.1 we have to multiply times 10 for proper timing restart_count += delta / Engine.time_scale if restart_count > restart_time: Engine.time_scale = 1 if is_network_master(): get_node("/root/Lobby").rpc("reset_state") # Render the percents var on_left = left var on_right = right # Always display OUR team on the LEFT (in blue) if master_team_right: on_left = right on_right = left get_node("../HUD/LeftTeam").set_text("%d%%" % on_left) get_node("../HUD/RightTeam").set_text("%d%%" % on_right) func _exit_tree(): var lobby = get_node("/root/Lobby") lobby.call_deferred("pre_configure_game", lobby.my_info.level)