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(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 DifficultyOptions { get; } = new() { "None", "Normal", "Difficult" }; public List 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); } }