first commit

This commit is contained in:
Beyhan Oğur
2026-09-03 04:45:36 +03:00
commit d5f52cc3d3
1038 changed files with 169579 additions and 0 deletions
@@ -0,0 +1,225 @@
#region License
// Copyright (C) 2020 Reetus
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#endregion
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input;
using ClassicAssist.Data.Autoloot;
using ClassicAssist.Misc;
using ClassicAssist.Shared.Resources;
using ClassicAssist.Shared.UO;
using ClassicAssist.UI.ViewModels;
using ClassicAssist.UO.Objects;
using Newtonsoft.Json;
namespace ClassicAssist.Shared.UI.ViewModels.Autoloot
{
public class CustomPropertiesViewModel : BaseViewModel
{
private readonly string _propertiesFileCustom =
Path.Combine( Engine.StartupPath ?? Environment.CurrentDirectory, "Data", "Properties.Custom.json" );
private ICommand _chooseFromItemCommand;
private ObservableCollection<CustomProperty> _properties = new ObservableCollection<CustomProperty>();
private ICommand _removeCommand;
private ICommand _saveCommand;
private CustomProperty _selectedProperty;
public CustomPropertiesViewModel()
{
LoadCustomProperties();
}
public ICommand ChooseFromClilocCommand => new RelayCommand( ChooseFromCliloc, o => true );
public ICommand ChooseFromItemCommand =>
_chooseFromItemCommand ?? ( _chooseFromItemCommand = new RelayCommandAsync( ChooseFromItem, o => true ) );
public ObservableCollection<CustomProperty> Properties
{
get => _properties;
set => SetProperty( ref _properties, value );
}
public ICommand RemoveCommand =>
_removeCommand ?? ( _removeCommand = new RelayCommand( Remove, o => SelectedProperty != null ) );
public ICommand SaveCommand => _saveCommand ?? ( _saveCommand = new RelayCommand( Save, o => true ) );
public CustomProperty SelectedProperty
{
get => _selectedProperty;
set => SetProperty( ref _selectedProperty, value );
}
private void ChooseFromCliloc( object obj )
{
ClilocSelectionViewModel vm = new ClilocSelectionViewModel();
Engine.UIInvoker.InvokeDialog( "ClilocSelectionWindow", dataContext: vm );
if ( vm.DialogResult != MessageBoxResult.OK )
{
return;
}
if ( Properties.Any( p => p.Cliloc == vm.SelectedCliloc.Key ) )
{
return;
}
Properties.AddSorted( new CustomProperty
{
Cliloc = vm.SelectedCliloc.Key,
Name = vm.SelectedCliloc.Value,
Arguments = vm.SelectedCliloc.Value.Contains( "~" )
} );
}
private async Task ChooseFromItem( object obj )
{
int serial = await Commands.GetTargeSerialAsync( Strings.Target_object___, 90000 );
if ( serial == 0 )
{
Commands.SystemMessage( Strings.Cannot_find_item___ );
return;
}
Item item = Engine.Items.GetItem( serial );
if ( item == null )
{
Commands.SystemMessage( Strings.Cannot_find_item___ );
return;
}
if ( item.Properties == null )
{
Commands.SystemMessage( Strings.Item_properties_null_or_not_loaded___ );
return;
}
PropertySelectionViewModel vm = new PropertySelectionViewModel( item.Properties );
await Engine.UIInvoker.InvokeDialog( "PropertySelectionWindow", dataContext: vm );
if ( vm.DialogResult != MessageBoxResult.OK )
{
return;
}
IEnumerable<SelectProperties> selectedProperties = vm.Properties.Where( p => p.Selected );
foreach ( SelectProperties property in selectedProperties )
{
if ( Properties.Any( p => p.Cliloc == property.Property.Cliloc ) )
{
continue;
}
Properties.AddSorted( new CustomProperty
{
Name = property.Name,
Cliloc = property.Property.Cliloc,
Arguments = property.Property.Arguments != null && property.Property.Arguments.Length > 0
} );
}
}
private void Remove( object obj )
{
if ( SelectedProperty == null )
{
return;
}
Properties.Remove( SelectedProperty );
}
private void Save( object obj )
{
SaveCustomProperties();
}
private void SaveCustomProperties()
{
List<PropertyEntry> properties = Properties.Select( property => new PropertyEntry
{
ClilocIndex = property.Arguments ? 0 : -1,
Clilocs = new[] { property.Cliloc },
ConstraintType = 0,
Name = property.Name
} ).ToList();
File.WriteAllText( _propertiesFileCustom, JsonConvert.SerializeObject( properties ) );
}
private void LoadCustomProperties()
{
if ( !File.Exists( _propertiesFileCustom ) )
{
return;
}
JsonSerializer serializer = new JsonSerializer();
using ( StreamReader sr = new StreamReader( _propertiesFileCustom ) )
{
using ( JsonTextReader reader = new JsonTextReader( sr ) )
{
PropertyEntry[] constraints = serializer.Deserialize<PropertyEntry[]>( reader );
foreach ( PropertyEntry constraint in constraints )
{
CustomProperty customProperty = new CustomProperty
{
Name = constraint.Name,
Cliloc = constraint.Clilocs[0],
Arguments = constraint.ClilocIndex == 0
};
Properties.AddSorted( customProperty );
}
}
}
}
}
public class CustomProperty : IComparable<CustomProperty>
{
public bool Arguments { get; set; }
public int Cliloc { get; set; }
public string Name { get; set; }
public int CompareTo( CustomProperty other )
{
if ( ReferenceEquals( this, other ) )
{
return 0;
}
return ReferenceEquals( null, other )
? 1
: string.Compare( Name, other.Name, StringComparison.InvariantCultureIgnoreCase );
}
}
}