sasalka/Code/UI/Buttons/ChangeSceneButton.cs
2025-06-29 14:44:00 +03:00

169 lines
4.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.IO;
using System.Threading.Tasks;
using Sandbox.Gravity;
using Sandbox;
namespace Sandbox.UI;
[Icon( "skip_next" )]
public sealed class ChangeSceneButton : InteractionButton
{
/// <summary>
/// Название сцены для загрузки
/// </summary>
[Property]
public string SceneName { get; set; } = "";
/// <summary>
/// Загружать сцену с задержкой (в секундах)
/// </summary>
[Property]
public float LoadDelay { get; set; } = 0.0f;
/// <summary>
/// Показывать сообщение при загрузке сцены
/// </summary>
[Property]
public bool ShowLoadingMessage { get; set; } = true;
public override bool Press( IPressable.Event e )
{
base.Press( e );
// Проверяем, что название сцены указано
if ( string.IsNullOrWhiteSpace( SceneName ) )
{
Log.Warning( "ChangeSceneButton: SceneName не указано!" );
return true;
}
// Формируем путь к сцене
var scenePath = $"scenes/{SceneName}.scene";
// Логируем действие
Log.Info( $"ChangeSceneButton: Подготавливаем сцену '{scenePath}'" );
// Показываем сообщение о загрузке
if ( ShowLoadingMessage )
{
Log.Info( $"Подготавливаем сцену: {scenePath}..." );
}
// Загружаем сцену с задержкой или сразу
if ( LoadDelay > 0.0f )
{
_ = LoadSceneWithDelay();
}
else
{
LoadScene();
}
return true;
}
/// <summary>
/// Загружает сцену с задержкой
/// </summary>
private async Task LoadSceneWithDelay()
{
await Task.Delay( (int)(LoadDelay * 1000) );
LoadScene();
}
/// <summary>
/// Загружает указанную сцену
/// </summary>
private void LoadScene()
{
try
{
// Проверяем, что код выполняется на сервере/хосте
if ( !Networking.IsHost )
{
Log.Warning( "ChangeSceneButton: Подготовка сцены возможна только на сервере/хосте!" );
return;
}
// Формируем путь к сцене
var scenePath = $"scenes/{SceneName}.scene";
// Проверяем, существует ли файл сцены
if ( !FileSystem.Mounted.FileExists( scenePath ) )
{
Log.Error( $"Файл сцены не найден: {scenePath}" );
return;
}
// В s&box для смены сцены нужно использовать GameResource.Load
// или перезапустить игру с новой сценой
Log.Info( $"Файл сцены найден: {scenePath}" );
// Пока что просто логируем успех
// В реальном проекте здесь нужно использовать GameResource.Load
// или другой механизм смены сцены
Log.Info( $"Сцена '{scenePath}' готова к загрузке!" );
Scene.Load( ResourceLibrary.Get<SceneFile>( scenePath ) );
// TODO: Реализовать фактическую загрузку сцены
// Например: GameResource.Load<SceneFile>( scenePath );
}
catch ( Exception ex )
{
Log.Error( $"Ошибка при подготовке сцены '{SceneName}': {ex.Message}" );
}
}
/// <summary>
/// Получает список доступных сцен для отображения в редакторе
/// </summary>
[Property, Category( "Debug" )]
public void ListAvailableScenes()
{
Log.Info( "=== ДОСТУПНЫЕ СЦЕНЫ ===" );
// Получаем все сцены из папки scenes
var sceneFiles = FileSystem.Mounted.FindFile( "scenes", "*.scene" );
if ( sceneFiles == null || !sceneFiles.Any() )
{
Log.Info( "Сцены не найдены в папке scenes/" );
return;
}
foreach ( var sceneFile in sceneFiles )
{
var sceneName = Path.GetFileNameWithoutExtension( sceneFile );
Log.Info( $" - {sceneName}" );
}
Log.Info( "=======================" );
}
/// <summary>
/// Тестирует загрузку сцены (для отладки)
/// </summary>
[Property, Category( "Debug" )]
public void TestSceneLoad()
{
if ( string.IsNullOrWhiteSpace( SceneName ) )
{
Log.Warning( "SceneName не указано для тестирования!" );
return;
}
Log.Info( $"=== ТЕСТ ПОДГОТОВКИ СЦЕНЫ '{SceneName}' ===" );
var scenePath = $"scenes/{SceneName}.scene";
Log.Info( $"Путь к сцене: {scenePath}" );
Log.Info( $"Файл существует: {FileSystem.Mounted.FileExists( scenePath )}" );
Log.Info( $"IsHost: {Networking.IsHost}" );
Log.Info( $"IsClient: {Networking.IsClient}" );
Log.Info( $"IsActive: {Networking.IsActive}" );
Log.Info( "=== ТЕСТ ЗАВЕРШЕН ===" );
}
}