Repositories / GSConfigTool / GsConfigTool / ViewModels / PalworldConfigViewModel.cs
PalworldConfigViewModel.cs 14.3 KB
git clone https://rl-dev.de/git/gsconfigtool Raw Download
using GsConfigTool.Helpers;
using GsConfigTool.Models;
using GsConfigTool.Services;
using Microsoft.Win32;
using System.IO;
using System.Text.Json;
using System.Windows;
using System.Windows.Input;

namespace GsConfigTool.ViewModels;

public class PalworldConfigViewModel : BaseViewModel
{
    private readonly DatabaseService _db;
    private readonly MainViewModel _main;
    private ServerProject _project;
    private PalworldServerSettings _settings;
    private string _generatedConfig = "";
    private bool _isDirty;
    private string _projectName;
    private string _projectDescription;

    public PalworldConfigViewModel(DatabaseService db, MainViewModel main, ServerProject? project = null)
    {
        _db = db;
        _main = main;

        if (project != null)
        {
            _project = project;
            _settings = JsonSerializer.Deserialize<PalworldServerSettings>(project.ConfigJson) ?? new PalworldServerSettings();
        }
        else
        {
            _project = new ServerProject { Game = GameType.Palworld, Name = "Neuer Palworld Server" };
            _settings = new PalworldServerSettings();
        }

        _projectName = _project.Name;
        _projectDescription = _project.Description;

        SaveCommand = new RelayCommand(async () => await SaveAsync());
        SaveAsFileCommand = new RelayCommand(SaveAsFile);
        CopyConfigCommand = new RelayCommand(() => CopyToClipboard(GeneratedConfig));
        GoBackCommand = new RelayCommand(() => _main.NavigateTo("Home"));

        GeneratePreview();
    }

    public bool IsDirty { get => _isDirty; set => SetField(ref _isDirty, value); }

    public string ProjectName
    {
        get => _projectName;
        set { SetField(ref _projectName, value); IsDirty = true; }
    }
    public string ProjectDescription
    {
        get => _projectDescription;
        set { SetField(ref _projectDescription, value); IsDirty = true; }
    }

    // ── Server Info ───────────────────────────────────────────────────────
    public string ServerName { get => _settings.ServerName; set { _settings.ServerName = value; OnPropertyChanged(); MarkDirty(); } }
    public string ServerDescription { get => _settings.ServerDescription; set { _settings.ServerDescription = value; OnPropertyChanged(); MarkDirty(); } }
    public string AdminPassword { get => _settings.AdminPassword; set { _settings.AdminPassword = value; OnPropertyChanged(); MarkDirty(); } }
    public string ServerPassword { get => _settings.ServerPassword; set { _settings.ServerPassword = value; OnPropertyChanged(); MarkDirty(); } }
    public string PublicIP { get => _settings.PublicIP; set { _settings.PublicIP = value; OnPropertyChanged(); MarkDirty(); } }
    public int PublicPort { get => _settings.PublicPort; set { _settings.PublicPort = value; OnPropertyChanged(); MarkDirty(); } }
    public int CoopPlayerMaxNum { get => _settings.CoopPlayerMaxNum; set { _settings.CoopPlayerMaxNum = value; OnPropertyChanged(); MarkDirty(); } }
    public int ServerPlayerMaxNum { get => _settings.ServerPlayerMaxNum; set { _settings.ServerPlayerMaxNum = value; OnPropertyChanged(); MarkDirty(); } }
    public string Region { get => _settings.Region; set { _settings.Region = value; OnPropertyChanged(); MarkDirty(); } }

    // ── Gameplay ──────────────────────────────────────────────────────────
    public string Difficulty { get => _settings.Difficulty; set { _settings.Difficulty = value; OnPropertyChanged(); MarkDirty(); } }
    public float DayTimeSpeedRate { get => _settings.DayTimeSpeedRate; set { _settings.DayTimeSpeedRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float NightTimeSpeedRate { get => _settings.NightTimeSpeedRate; set { _settings.NightTimeSpeedRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float ExpRate { get => _settings.ExpRate; set { _settings.ExpRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalCaptureRate { get => _settings.PalCaptureRate; set { _settings.PalCaptureRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalSpawnNumRate { get => _settings.PalSpawnNumRate; set { _settings.PalSpawnNumRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float EnemyDropItemRate { get => _settings.EnemyDropItemRate; set { _settings.EnemyDropItemRate = value; OnPropertyChanged(); MarkDirty(); } }
    public string DeathPenalty { get => _settings.DeathPenalty; set { _settings.DeathPenalty = value; OnPropertyChanged(); MarkDirty(); } }

    // ── Pal Combat ────────────────────────────────────────────────────────
    public float PalDamageRateAttack { get => _settings.PalDamageRateAttack; set { _settings.PalDamageRateAttack = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalDamageRateDefense { get => _settings.PalDamageRateDefense; set { _settings.PalDamageRateDefense = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalStomachDecreaseRate { get => _settings.PalStomachDecreaseRate; set { _settings.PalStomachDecreaseRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalStaminaDecreaseRate { get => _settings.PalStaminaDecreaseRate; set { _settings.PalStaminaDecreaseRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalAutoHPRegeneRate { get => _settings.PalAutoHPRegeneRate; set { _settings.PalAutoHPRegeneRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PalAutoHpRegeneRateInSleep { get => _settings.PalAutoHpRegeneRateInSleep; set { _settings.PalAutoHpRegeneRateInSleep = value; OnPropertyChanged(); MarkDirty(); } }

    // ── Player Combat ─────────────────────────────────────────────────────
    public float PlayerDamageRateAttack { get => _settings.PlayerDamageRateAttack; set { _settings.PlayerDamageRateAttack = value; OnPropertyChanged(); MarkDirty(); } }
    public float PlayerDamageRateDefense { get => _settings.PlayerDamageRateDefense; set { _settings.PlayerDamageRateDefense = value; OnPropertyChanged(); MarkDirty(); } }
    public float PlayerStomachDecreaseRate { get => _settings.PlayerStomachDecreaseRate; set { _settings.PlayerStomachDecreaseRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PlayerStaminaDecreaseRate { get => _settings.PlayerStaminaDecreaseRate; set { _settings.PlayerStaminaDecreaseRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PlayerAutoHPRegeneRate { get => _settings.PlayerAutoHPRegeneRate; set { _settings.PlayerAutoHPRegeneRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float PlayerAutoHpRegeneRateInSleep { get => _settings.PlayerAutoHpRegeneRateInSleep; set { _settings.PlayerAutoHpRegeneRateInSleep = value; OnPropertyChanged(); MarkDirty(); } }

    // ── Building ──────────────────────────────────────────────────────────
    public float BuildObjectDamageRate { get => _settings.BuildObjectDamageRate; set { _settings.BuildObjectDamageRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float BuildObjectDeteriorationDamageRate { get => _settings.BuildObjectDeteriorationDamageRate; set { _settings.BuildObjectDeteriorationDamageRate = value; OnPropertyChanged(); MarkDirty(); } }
    public int BaseCampMaxNum { get => _settings.BaseCampMaxNum; set { _settings.BaseCampMaxNum = value; OnPropertyChanged(); MarkDirty(); } }
    public int BaseCampWorkerMaxNum { get => _settings.BaseCampWorkerMaxNum; set { _settings.BaseCampWorkerMaxNum = value; OnPropertyChanged(); MarkDirty(); } }

    // ── Collection ────────────────────────────────────────────────────────
    public float CollectionDropRate { get => _settings.CollectionDropRate; set { _settings.CollectionDropRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float CollectionObjectHpRate { get => _settings.CollectionObjectHpRate; set { _settings.CollectionObjectHpRate = value; OnPropertyChanged(); MarkDirty(); } }
    public float CollectionObjectRespawnSpeedRate { get => _settings.CollectionObjectRespawnSpeedRate; set { _settings.CollectionObjectRespawnSpeedRate = value; OnPropertyChanged(); MarkDirty(); } }

    // ── PvP / Multiplayer ─────────────────────────────────────────────────
    public bool bIsPvP { get => _settings.bIsPvP; set { _settings.bIsPvP = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnablePlayerToPlayerDamage { get => _settings.bEnablePlayerToPlayerDamage; set { _settings.bEnablePlayerToPlayerDamage = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnableFriendlyFire { get => _settings.bEnableFriendlyFire; set { _settings.bEnableFriendlyFire = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnableInvaderEnemy { get => _settings.bEnableInvaderEnemy; set { _settings.bEnableInvaderEnemy = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bCanPickupOtherGuildDeathPenaltyDrop { get => _settings.bCanPickupOtherGuildDeathPenaltyDrop; set { _settings.bCanPickupOtherGuildDeathPenaltyDrop = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnableDefenseOtherGuildPlayer { get => _settings.bEnableDefenseOtherGuildPlayer; set { _settings.bEnableDefenseOtherGuildPlayer = value; OnPropertyChanged(); MarkDirty(); } }

    // ── World ─────────────────────────────────────────────────────────────
    public bool bEnableFastTravel { get => _settings.bEnableFastTravel; set { _settings.bEnableFastTravel = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bIsStartLocationSelectByMap { get => _settings.bIsStartLocationSelectByMap; set { _settings.bIsStartLocationSelectByMap = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bExistPlayerAfterLogout { get => _settings.bExistPlayerAfterLogout; set { _settings.bExistPlayerAfterLogout = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnableNonLoginPenalty { get => _settings.bEnableNonLoginPenalty; set { _settings.bEnableNonLoginPenalty = value; OnPropertyChanged(); MarkDirty(); } }
    public int DropItemMaxNum { get => _settings.DropItemMaxNum; set { _settings.DropItemMaxNum = value; OnPropertyChanged(); MarkDirty(); } }
    public float DropItemAliveForPlayerTime { get => _settings.DropItemAliveForPlayerTime; set { _settings.DropItemAliveForPlayerTime = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnableAimAssistPad { get => _settings.bEnableAimAssistPad; set { _settings.bEnableAimAssistPad = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bEnableAimAssistKeyboard { get => _settings.bEnableAimAssistKeyboard; set { _settings.bEnableAimAssistKeyboard = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bActiveUNKO { get => _settings.bActiveUNKO; set { _settings.bActiveUNKO = value; OnPropertyChanged(); MarkDirty(); } }

    // ── RCON / Auth ───────────────────────────────────────────────────────
    public bool RCONEnabled { get => _settings.RCONEnabled; set { _settings.RCONEnabled = value; OnPropertyChanged(); MarkDirty(); } }
    public int RCONPort { get => _settings.RCONPort; set { _settings.RCONPort = value; OnPropertyChanged(); MarkDirty(); } }
    public bool bUseAuth { get => _settings.bUseAuth; set { _settings.bUseAuth = value; OnPropertyChanged(); MarkDirty(); } }
    public string BanListURL { get => _settings.BanListURL; set { _settings.BanListURL = value; OnPropertyChanged(); MarkDirty(); } }

    // ── Preview ───────────────────────────────────────────────────────────
    public string GeneratedConfig { get => _generatedConfig; private set => SetField(ref _generatedConfig, value); }

    // ── Commands ──────────────────────────────────────────────────────────
    public ICommand SaveCommand { get; }
    public ICommand SaveAsFileCommand { get; }
    public ICommand CopyConfigCommand { get; }
    public ICommand GoBackCommand { get; }

    public List<string> DifficultyOptions { get; } = new() { "None", "Normal", "Difficult" };
    public List<string> DeathPenaltyOptions { get; } = new() { "None", "Item", "ItemAndEquipment", "All" };

    private void MarkDirty()
    {
        IsDirty = true;
        GeneratePreview();
    }

    public void GeneratePreview() =>
        GeneratedConfig = PalworldConfigGeneratorService.Generate(_settings);

    private async Task SaveAsync()
    {
        _project.Name = ProjectName;
        _project.Description = ProjectDescription;
        _project.ConfigJson = JsonSerializer.Serialize(_settings);
        await _db.SaveProjectAsync(_project);
        IsDirty = false;
        MessageBox.Show("Projekt gespeichert!", "Gespeichert", MessageBoxButton.OK, MessageBoxImage.Information);
    }

    private void SaveAsFile()
    {
        var dialog = new SaveFileDialog
        {
            Title = "PalWorldSettings.ini speichern",
            Filter = "INI Files (*.ini)|*.ini|All Files (*.*)|*.*",
            FileName = "PalWorldSettings.ini"
        };
        if (dialog.ShowDialog() != true) return;
        File.WriteAllText(dialog.FileName, PalworldConfigGeneratorService.Generate(_settings));
        MessageBox.Show($"Config gespeichert:\n{dialog.FileName}",
            "Export erfolgreich", MessageBoxButton.OK, MessageBoxImage.Information);
    }

    private static void CopyToClipboard(string text)
    {
        Clipboard.SetText(text);
        MessageBox.Show("In die Zwischenablage kopiert!", "Kopiert", MessageBoxButton.OK, MessageBoxImage.Information);
    }
}
24Fire Wuppertaler Tafel Romeo