# ClassicAssist.Avalonia Linux Setup - Yapılan Değişiklikler ## Özet ClassicAssist.Avalonia plugin'i ClassicUO üzerinde Linux'ta çalışır hale getirildi. --- ## 1. ClassicUO - Plugin Yükleme Düzeltmeleri ### Dosya: `ClassicUO/src/ClassicUO.Client/Network/Plugin.cs` - **Sorun**: `dotnet cuo.dll` ile çalıştırıldığında `PluginHost` null oluyor, plugin hiç yüklenmiyordu - **Çözüm**: `PluginHost == null` olduğunda fallback managed loader eklendi - `Assembly.LoadFile` + `AssemblyResolve` handler ile plugin ve bağımlılıkları yükleniyor - Reflection ile `Assistant.Engine.Install()` metodu çağrılıyor ### Dosya: `ClassicUO/src/ClassicUO.Bootstrap/src/Plugin.cs` - **Çözüm**: `meth.Invoke` öncesi `AssemblyResolve` handler eklendi (plugin bağımlılıkları için) --- ## 2. ClassicAssist.Avalonia Düzeltmeleri ### Dosya: `ClassicAssist.Avalonia/Engine.cs` - **Install** metoduna try-catch ve dosya loglama eklendi (`avalonia_debug.log`) - Debug loglama: Assembly.Location, Shared.dll yükleme, Initialize, LoadUI durumları ### Dosya: `ClassicAssist.Shared/Engine.cs` - **InitializePlugin**: Console.WriteLine loglama eklendi (delegate atamaları, WindowHandle, vb.) - **OnClientClosing**: `Options.CurrentOptions` null kontrolü eklendi, try-catch ile sarmalandı ### Dosya: `ClassicAssist.Shared/UI/ViewModels/AboutControlViewModel.cs` - **Sorun**: `GetBuildDateTime()` - `Version.TryParse` başarısız olunca `version` null, `version.Build` NullRefException - **Çözüm**: `assembly.Location` ve `version` için null kontrolleri, try-catch eklendi ### Dosya: `ClassicAssist.Shared/UI/ViewModels/OptionsTabViewModel.cs` - **Sorun**: `Serialize()` - `CurrentOptions` null olduğunda NullRefException - **Çözüm**: `CurrentOptions == null` ise early return ### Dosya: `ClassicAssist.Shared/UO/Data/Cliloc.cs` - **Sorun 1**: `Dictionary.Add()` duplicate key (5) olduğunda exception fırlatıyor - **Çözüm 1**: Indexer kullanımı `clilocList[key] = value` (overwrite) - **Sorun 2**: `UTF8Encoding.GetString` buffer sınırlarını aşıyor (bozuk/non-standard Cliloc.enu) - **Çözüm 2**: Bounds checking eklendi (`x + 7 + len > fileBytes.Length` kontrolü), try-catch --- ## 3. Native Kütüphaneler ### libSkiaSharp.so ve libHarfBuzzSharp.so - **Sorun**: `runtimes/linux-x64/native/` altındaki native .so dosyaları bulunamıyor - **Çözüm**: Plugin dizininin köküne kopyalandı - Kaynak: `~/.nuget/packages/skiasharp.nativeassets.linux/2.88.3/runtimes/linux-x64/native/` --- ## 4. Build ve Deploy ### Release Build Komutları ```bash # ClassicAssist.Avalonia cd ClassicAssist.Avalonia/ClassicAssist.Avalonia dotnet build -c Release -f netcoreapp3.1 # ClassicUO cd ClassicUO dotnet build -c Release ``` ### Çıktı Dizinleri - ClassicAssist: `ClassicAssist.Avalonia/Output/netcoreapp3.1/` - ClassicAssist.Shared: `ClassicAssist.Avalonia/Output/netstandard2.0/` - ClassicUO: `ClassicUO/bin/Release/net10.0/` ### Deploy Dizini ``` /home/beyhan/Projeler/CSharp/uoclient/linux/ ├── cuo (executable) ├── settings.json ├── Data/Plugins/ClassicAssistAvalonia/ │ ├── ClassicAssist.Avalonia.dll │ ├── ClassicAssist.Shared.dll │ ├── libSkiaSharp.so │ ├── libHarfBuzzSharp.so │ └── ... (diğer DLL'ler) └── ... (ClassicUO dosyaları) ``` ### Çalıştırma ```bash cd /home/beyhan/Projeler/CSharp/uoclient/linux && ./cuo ``` --- ## 5. settings.json (Plugin Konfigürasyonu) ```json { "ip": "uo.troyuo.com", "port": 2594, "ultimaonlinedirectory": "/home/beyhan/Projeler/CSharp/uoclient", "force_driver": 1, "plugins": [ "./ClassicAssistAvalonia/ClassicAssist.Avalonia.dll" ] } ``` --- ## Kalan/Sonraki Adımlar - [ ] Plugin pencere boyutu/pozisyonu kontrolü - [ ] Hotkey'lerin Linux'ta çalışıp çalışmadığı testi - [ ] Macro sisteminin tam fonksiyonel testi - [ ] Packet filter'ların çalışması (Cliloc.enu non-standard olabilir) - [ ] Release build tam testi