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);
}
}