diff --git a/EVEData/EVEData.csproj b/EVEData/EVEData.csproj
index 47b8549f..1be4d158 100644
--- a/EVEData/EVEData.csproj
+++ b/EVEData/EVEData.csproj
@@ -14,7 +14,7 @@
-
+
@@ -34,6 +34,9 @@
Always
+
+ Always
+
Always
diff --git a/EVEData/EveAppConfig.cs b/EVEData/EveAppConfig.cs
index d18797f9..2a9e1744 100644
--- a/EVEData/EveAppConfig.cs
+++ b/EVEData/EveAppConfig.cs
@@ -16,7 +16,7 @@ public class EveAppConfig
///
/// Client ID from the EVE Developer setup
///
- public const string ClientID = "ID Goes here.. ";
+ public const string ClientID = "";
///
/// SMT Version Tagline
diff --git a/EVEData/EveManager.cs b/EVEData/EveManager.cs
index 2c2be7e9..b3f0b33e 100644
--- a/EVEData/EveManager.cs
+++ b/EVEData/EveManager.cs
@@ -675,6 +675,11 @@ public bool MoveLocalCharacterDown(LocalCharacter character)
///
public SerializableDictionary ShipTypes { get; set; }
+ ///
+ /// Gets or sets the Chinese Ship Type ID to Name dictionary (populated from ESI)
+ ///
+ public SerializableDictionary ShipTypesCN { get; set; } = new SerializableDictionary();
+
///
/// Gets or sets the System ID to Name dictionary
///
@@ -2398,6 +2403,100 @@ public async Task ResolveCharacterIDs(List IDs)
catch { }
}
+ ///
+ /// Load Chinese ship type names from built-in data, then merge user cache
+ ///
+ public void LoadShipTypesCNFromCache()
+ {
+ ShipTypesCN = new SerializableDictionary();
+
+ // Load built-in Chinese ship names shipped with the application
+ string builtinFile = Path.Combine(DataRootFolder, "ShipTypesCN.dat");
+ if (File.Exists(builtinFile))
+ {
+ try
+ {
+ var builtin = Serialization.DeserializeFromDisk>(builtinFile);
+ if (builtin != null)
+ {
+ foreach (var kvp in builtin)
+ ShipTypesCN[kvp.Key] = kvp.Value;
+ }
+ }
+ catch { }
+ }
+
+ // Merge user cache (may contain updates or overrides)
+ string userCnFile = Path.Combine(SaveDataRootFolder, "ShipTypesCN.dat");
+ if (File.Exists(userCnFile))
+ {
+ try
+ {
+ var userCache = Serialization.DeserializeFromDisk>(userCnFile);
+ if (userCache != null)
+ {
+ foreach (var kvp in userCache)
+ ShipTypesCN[kvp.Key] = kvp.Value;
+ }
+ }
+ catch { }
+ }
+ }
+
+ ///
+ /// Fetch missing Chinese ship type names from ESI
+ ///
+ public async Task FetchShipTypeChineseNamesAsync(CancellationToken cancellationToken = default)
+ {
+ if (ShipTypes == null || ShipTypesCN == null) return;
+
+ List missingIDs = new List();
+ foreach (var kvp in ShipTypes)
+ {
+ if (!ShipTypesCN.ContainsKey(kvp.Key) && int.TryParse(kvp.Key, out int typeId) && typeId > 0)
+ {
+ missingIDs.Add(typeId);
+ }
+ }
+
+ if (missingIDs.Count == 0) return;
+
+ try
+ {
+ using (var semaphore = new SemaphoreSlim(5))
+ {
+ var tasks = missingIDs.Select(async typeId =>
+ {
+ await semaphore.WaitAsync(cancellationToken);
+ try
+ {
+ var response = await EveApiClient.Universe.GetTypeInfoAsync(typeId, null, "zh");
+ if (response != null && response.Model != null && !string.IsNullOrEmpty(response.Model.Name))
+ {
+ lock (ShipTypesCN)
+ {
+ ShipTypesCN[typeId.ToString()] = response.Model.Name;
+ }
+ }
+ }
+ catch { }
+ finally { semaphore.Release(); }
+ });
+
+ await Task.WhenAll(tasks);
+ }
+ }
+ catch { }
+
+ // Save cache
+ try
+ {
+ string cnFile = Path.Combine(SaveDataRootFolder, "ShipTypesCN.dat");
+ Serialization.SerializeToDisk(ShipTypesCN, cnFile);
+ }
+ catch { }
+ }
+
///
/// Save the Data to disk
///
diff --git a/EVEData/ZKillRedisQ.cs b/EVEData/ZKillRedisQ.cs
index aee9be8d..b37e853f 100644
--- a/EVEData/ZKillRedisQ.cs
+++ b/EVEData/ZKillRedisQ.cs
@@ -132,7 +132,8 @@ private void zkb_DoWork(object sender, DoWorkEventArgs e)
zs.SystemName = EveManager.Instance.GetEveSystemNameFromID((int)r2z2Data.Esi.SolarSystemId);
zs.KillTime = r2z2Data.Esi.KillmailTime.ToLocalTime();
- string shipID = r2z2Data.Esi.Victim.ShipTypeId.ToString();
+ zs.ShipTypeID = r2z2Data.Esi.Victim.ShipTypeId;
+ string shipID = zs.ShipTypeID.ToString();
if(EveManager.Instance.ShipTypes.ContainsKey(shipID))
{
zs.ShipType = EveManager.Instance.ShipTypes[shipID];
@@ -231,9 +232,51 @@ public class ZKBDataSimple : INotifyPropertyChanged
public DateTimeOffset KillTime { get; set; }
///
- /// Gets or sets the Ship Lost in this kill
+ /// Gets or sets the Ship Type ID from the kill mail
///
- public string ShipType { get; set; }
+ public int ShipTypeID { get; set; }
+
+ private string m_shipType;
+
+ ///
+ /// Gets or sets the Ship Lost in this kill (English name)
+ ///
+ public string ShipType
+ {
+ get => m_shipType;
+ set
+ {
+ m_shipType = value;
+ OnPropertyChanged("ShipType");
+ OnPropertyChanged("ShipTypeDisplay");
+ }
+ }
+
+ ///
+ /// Gets the ship type name in the current display language
+ ///
+ public string ShipTypeDisplay
+ {
+ get
+ {
+ if (EveManager.CurrentLanguage == "zh-CN" &&
+ EveManager.Instance != null &&
+ EveManager.Instance.ShipTypesCN != null &&
+ EveManager.Instance.ShipTypesCN.ContainsKey(ShipTypeID.ToString()))
+ {
+ return EveManager.Instance.ShipTypesCN[ShipTypeID.ToString()];
+ }
+ return ShipType;
+ }
+ }
+
+ ///
+ /// Notify that ShipTypeDisplay may have changed (e.g. after language change or CN names loaded)
+ ///
+ public void RefreshShipTypeDisplay()
+ {
+ OnPropertyChanged("ShipTypeDisplay");
+ }
///
/// Gets or sets the System ID the kill was in
diff --git a/EVEData/data/ShipTypesCN.dat b/EVEData/data/ShipTypesCN.dat
new file mode 100644
index 00000000..d611fb73
--- /dev/null
+++ b/EVEData/data/ShipTypesCN.dat
@@ -0,0 +1,5419 @@
+
+
+ -
+
+ 582
+
+
+ 矮脚鸡级
+
+
+ -
+
+ 583
+
+
+ 秃鹫级
+
+
+ -
+
+ 584
+
+
+ 狮鹫级
+
+
+ -
+
+ 585
+
+
+ 伐木者级
+
+
+ -
+
+ 586
+
+
+ 探索级
+
+
+ -
+
+ 587
+
+
+ 裂谷级
+
+
+ -
+
+ 588
+
+
+ 死神号
+
+
+ -
+
+ 589
+
+
+ 刽子手级
+
+
+ -
+
+ 590
+
+
+ 检察官级
+
+
+ -
+
+ 591
+
+
+ 巨神兵级
+
+
+ -
+
+ 592
+
+
+ 纳维达斯级
+
+
+ -
+
+ 593
+
+
+ 特里斯坦级
+
+
+ -
+
+ 594
+
+
+ 因卡萨斯级
+
+
+ -
+
+ 595
+
+
+ 盖伦特警用船
+
+
+ -
+
+ 596
+
+
+ 帝国号
+
+
+ -
+
+ 597
+
+
+ 惩罚者级
+
+
+ -
+
+ 598
+
+
+ 分裂者级
+
+
+ -
+
+ 599
+
+
+ 爆发级
+
+
+ -
+
+ 600
+
+
+ 米玛塔尔维和船
+
+
+ -
+
+ 601
+
+
+ 伊毕斯号
+
+
+ -
+
+ 602
+
+
+ 茶隼级
+
+
+ -
+
+ 603
+
+
+ 小鹰级
+
+
+ -
+
+ 605
+
+
+ 苍鹭级
+
+
+ -
+
+ 606
+
+
+ 维拉托尔号
+
+
+ -
+
+ 607
+
+
+ 伊米卡斯级
+
+
+ -
+
+ 608
+
+
+ 阿特龙级
+
+
+ -
+
+ 609
+
+
+ 毛鲁斯级
+
+
+ -
+
+ 613
+
+
+ 吞噬级
+
+
+ -
+
+ 614
+
+
+ 女神级
+
+
+ -
+
+ 615
+
+
+ 献祭者级
+
+
+ -
+
+ 616
+
+
+ 美杜莎级
+
+
+ -
+
+ 617
+
+
+ 回声级
+
+
+ -
+
+ 618
+
+
+ 山猫级
+
+
+ -
+
+ 619
+
+
+ 剑刺级
+
+
+ -
+
+ 620
+
+
+ 鱼鹰级
+
+
+ -
+
+ 621
+
+
+ 狞獾级
+
+
+ -
+
+ 622
+
+
+ 刺客级
+
+
+ -
+
+ 623
+
+
+ 巨鸟级
+
+
+ -
+
+ 624
+
+
+ 暴君级
+
+
+ -
+
+ 625
+
+
+ 奥格诺级
+
+
+ -
+
+ 626
+
+
+ 狂怒者级
+
+
+ -
+
+ 627
+
+
+ 托勒克斯级
+
+
+ -
+
+ 628
+
+
+ 主宰级
+
+
+ -
+
+ 629
+
+
+ 断崖级
+
+
+ -
+
+ 630
+
+
+ 挑战级
+
+
+ -
+
+ 631
+
+
+ 镰刀级
+
+
+ -
+
+ 632
+
+
+ 黑鸟级
+
+
+ -
+
+ 633
+
+
+ 星空级
+
+
+ -
+
+ 634
+
+
+ 送葬者级
+
+
+ -
+
+ 635
+
+
+ 奥普克斯级豪华游轮
+
+
+ -
+
+ 638
+
+
+ 乌鸦级
+
+
+ -
+
+ 639
+
+
+ 狂暴级
+
+
+ -
+
+ 640
+
+
+ 毒蝎级
+
+
+ -
+
+ 641
+
+
+ 万王宝座级
+
+
+ -
+
+ 642
+
+
+ 灾难级
+
+
+ -
+
+ 643
+
+
+ 末日沙场级
+
+
+ -
+
+ 644
+
+
+ 台风级
+
+
+ -
+
+ 645
+
+
+ 多米尼克斯级
+
+
+ -
+
+ 648
+
+
+ 獾级
+
+
+ -
+
+ 649
+
+
+ 狐鼬级
+
+
+ -
+
+ 650
+
+
+ 涅鲁斯级
+
+
+ -
+
+ 651
+
+
+ 囤积者级
+
+
+ -
+
+ 652
+
+
+ 猛犸级
+
+
+ -
+
+ 653
+
+
+ 环绕级
+
+
+ -
+
+ 654
+
+
+ 克琉斯级
+
+
+ -
+
+ 655
+
+
+ 埃比斯级
+
+
+ -
+
+ 656
+
+
+ 米亚莫斯级
+
+
+ -
+
+ 657
+
+
+ 伊特龙级MKV
+
+
+ -
+
+ 670
+
+
+ 太空舱
+
+
+ -
+
+ 671
+
+
+ 俄洛巴斯级
+
+
+ -
+
+ 672
+
+
+ 加达里穿梭机
+
+
+ -
+
+ 1233
+
+
+ 北极星神秘护卫舰
+
+
+ -
+
+ 1896
+
+
+ 统合部警用护卫舰
+
+
+ -
+
+ 1898
+
+
+ 统合部特警护卫舰
+
+
+ -
+
+ 1900
+
+
+ 统合部军用护卫舰
+
+
+ -
+
+ 1902
+
+
+ 统合部特勤护卫舰
+
+
+ -
+
+ 1904
+
+
+ 统合部警用巡洋舰
+
+
+ -
+
+ 1912
+
+
+ 统合部警用战列舰
+
+
+ -
+
+ 1914
+
+
+ 统合部特勤战列舰
+
+
+ -
+
+ 1916
+
+
+ 统合部特警战列舰
+
+
+ -
+
+ 1918
+
+
+ 统合部军用战列舰
+
+
+ -
+
+ 1944
+
+
+ 恩赐者级
+
+
+ -
+
+ 2006
+
+
+ 启示级
+
+
+ -
+
+ 2078
+
+
+ 微风级
+
+
+ -
+
+ 2161
+
+
+ 磨难级
+
+
+ -
+
+ 2834
+
+
+ 乌图级
+
+
+ -
+
+ 2836
+
+
+ 复仇女神级
+
+
+ -
+
+ 2863
+
+
+ 元始级
+
+
+ -
+
+ 2948
+
+
+ 暗影
+
+
+ -
+
+ 2998
+
+
+ 黑夜级
+
+
+ -
+
+ 3514
+
+
+ 归魂者级
+
+
+ -
+
+ 3516
+
+
+ 恶意级
+
+
+ -
+
+ 3518
+
+
+ 传道者级
+
+
+ -
+
+ 3532
+
+
+ 梯队级
+
+
+ -
+
+ 3628
+
+
+ 萨沙
+
+
+ -
+
+ 3751
+
+
+ SOCT 1
+
+
+ -
+
+ 3753
+
+
+ SOCT 2
+
+
+ -
+
+ 3756
+
+
+ 灵感级
+
+
+ -
+
+ 3764
+
+
+ 勒维亚坦级
+
+
+ -
+
+ 3766
+
+
+ 守夜者级
+
+
+ -
+
+ 3768
+
+
+ 艾玛警用护卫舰
+
+
+ -
+
+ 4005
+
+
+ 毒蝎级异株湖保安型
+
+
+ -
+
+ 4302
+
+
+ 预言级
+
+
+ -
+
+ 4306
+
+
+ 娜迦级
+
+
+ -
+
+ 4308
+
+
+ 塔洛斯级
+
+
+ -
+
+ 4310
+
+
+ 龙卷风级
+
+
+ -
+
+ 4363
+
+
+ 米亚莫斯级酷菲特强版
+
+
+ -
+
+ 4386
+
+
+ 大型机动跳跃扰断器 I
+
+
+ -
+
+ 4388
+
+
+ 米亚莫斯级酷菲深蓝版
+
+
+ -
+
+ 9854
+
+
+ 北极星观测者护卫舰
+
+
+ -
+
+ 9858
+
+
+ 北极星百夫长级
+
+
+ -
+
+ 9860
+
+
+ 北极星将官护卫舰
+
+
+ -
+
+ 9862
+
+
+ 北极星百夫长护卫舰
+
+
+ -
+
+ 11011
+
+
+ 狂怒守卫者级
+
+
+ -
+
+ 11019
+
+
+ 蟑螂级
+
+
+ -
+
+ 11129
+
+
+ 盖伦特穿梭机
+
+
+ -
+
+ 11132
+
+
+ 米玛塔尔穿梭机
+
+
+ -
+
+ 11134
+
+
+ 艾玛穿梭机
+
+
+ -
+
+ 11172
+
+
+ 太阳神级
+
+
+ -
+
+ 11174
+
+
+ 克勒斯级
+
+
+ -
+
+ 11176
+
+
+ 黑鸦级
+
+
+ -
+
+ 11178
+
+
+ 猛禽级
+
+
+ -
+
+ 11182
+
+
+ 猎豹级
+
+
+ -
+
+ 11184
+
+
+ 十字军级
+
+
+ -
+
+ 11186
+
+
+ 咒灭级
+
+
+ -
+
+ 11188
+
+
+ 咒逐级
+
+
+ -
+
+ 11190
+
+
+ 哨兵级
+
+
+ -
+
+ 11192
+
+
+ 秃鹰级
+
+
+ -
+
+ 11194
+
+
+ 狐妖级
+
+
+ -
+
+ 11196
+
+
+ 利爪级
+
+
+ -
+
+ 11198
+
+
+ 短剑级
+
+
+ -
+
+ 11200
+
+
+ 塔纳尼斯级
+
+
+ -
+
+ 11202
+
+
+ 阿瑞斯级
+
+
+ -
+
+ 11365
+
+
+ 复仇级
+
+
+ -
+
+ 11371
+
+
+ 猎狼级
+
+
+ -
+
+ 11373
+
+
+ 刀锋级
+
+
+ -
+
+ 11375
+
+
+ 艾琳伊级
+
+
+ -
+
+ 11377
+
+
+ 纳美西斯级
+
+
+ -
+
+ 11379
+
+
+ 战鹰级
+
+
+ -
+
+ 11381
+
+
+ 女妖级
+
+
+ -
+
+ 11383
+
+
+ 收集者级
+
+
+ -
+
+ 11387
+
+
+ 土狼级
+
+
+ -
+
+ 11389
+
+
+ 基沙尔级
+
+
+ -
+
+ 11393
+
+
+ 审判者级
+
+
+ -
+
+ 11400
+
+
+ 美洲虎级
+
+
+ -
+
+ 11567
+
+
+ 神使级
+
+
+ -
+
+ 11936
+
+
+ 灾难级帝国型
+
+
+ -
+
+ 11938
+
+
+ 末日沙场级帝国型
+
+
+ -
+
+ 11940
+
+
+ 黄金富豪级
+
+
+ -
+
+ 11942
+
+
+ 白银富豪级
+
+
+ -
+
+ 11957
+
+
+ 战隼级
+
+
+ -
+
+ 11959
+
+
+ 白嘴鸦级
+
+
+ -
+
+ 11961
+
+
+ 休津级
+
+
+ -
+
+ 11963
+
+
+ 长剑级
+
+
+ -
+
+ 11965
+
+
+ 朝圣级
+
+
+ -
+
+ 11969
+
+
+ 埃拉兹级
+
+
+ -
+
+ 11971
+
+
+ 拉克希斯级
+
+
+ -
+
+ 11978
+
+
+ 曲剑级
+
+
+ -
+
+ 11985
+
+
+ 皇冠蜥级
+
+
+ -
+
+ 11987
+
+
+ 守卫级
+
+
+ -
+
+ 11989
+
+
+ 奥内罗斯级
+
+
+ -
+
+ 11993
+
+
+ 希尔博拉斯级
+
+
+ -
+
+ 11995
+
+
+ 奥尼克斯级
+
+
+ -
+
+ 11999
+
+
+ 流浪级
+
+
+ -
+
+ 12003
+
+
+ 狂热级
+
+
+ -
+
+ 12005
+
+
+ 伊什塔级
+
+
+ -
+
+ 12011
+
+
+ 银鹰级
+
+
+ -
+
+ 12013
+
+
+ 阔刀级
+
+
+ -
+
+ 12015
+
+
+ 缪宁级
+
+
+ -
+
+ 12017
+
+
+ 奉献级
+
+
+ -
+
+ 12019
+
+
+ 渎圣级
+
+
+ -
+
+ 12021
+
+
+ 伏波斯级
+
+
+ -
+
+ 12023
+
+
+ 戴默斯级
+
+
+ -
+
+ 12032
+
+
+ 蝎尾怪级
+
+
+ -
+
+ 12034
+
+
+ 猎犬级
+
+
+ -
+
+ 12036
+
+
+ 匕首级
+
+
+ -
+
+ 12038
+
+
+ 净化级
+
+
+ -
+
+ 12042
+
+
+ 伊什库尔级
+
+
+ -
+
+ 12044
+
+
+ 恩尤级
+
+
+ -
+
+ 12198
+
+
+ 小型机动跃迁扰断器 I
+
+
+ -
+
+ 12199
+
+
+ 中型机动跃迁扰断器 I
+
+
+ -
+
+ 12200
+
+
+ 大型机动跃迁扰断器 I
+
+
+ -
+
+ 12729
+
+
+ 天鹤级
+
+
+ -
+
+ 12731
+
+
+ 大鸨级
+
+
+ -
+
+ 12733
+
+
+ 分裂级
+
+
+ -
+
+ 12735
+
+
+ 徘徊者级
+
+
+ -
+
+ 12743
+
+
+ 旅行者级
+
+
+ -
+
+ 12745
+
+
+ 奥卡托级
+
+
+ -
+
+ 12747
+
+
+ 巨象级
+
+
+ -
+
+ 12753
+
+
+ 激进级
+
+
+ -
+
+ 13202
+
+
+ 万王宝座级联邦型
+
+
+ -
+
+ 16227
+
+
+ 猛鲑级
+
+
+ -
+
+ 16229
+
+
+ 布鲁提克斯级
+
+
+ -
+
+ 16231
+
+
+ 飓风级
+
+
+ -
+
+ 16233
+
+
+ 先知级
+
+
+ -
+
+ 16236
+
+
+ 强制者级
+
+
+ -
+
+ 16238
+
+
+ 海燕级
+
+
+ -
+
+ 16240
+
+
+ 促进级
+
+
+ -
+
+ 16242
+
+
+ 长尾鲛级
+
+
+ -
+
+ 17360
+
+
+ 隐秘级
+
+
+ -
+
+ 17476
+
+
+ 妄想级
+
+
+ -
+
+ 17478
+
+
+ 回旋者级
+
+
+ -
+
+ 17480
+
+
+ 猎获级
+
+
+ -
+
+ 17619
+
+
+ 加达里海军霍克比尔级
+
+
+ -
+
+ 17634
+
+
+ 狞獾级海军型
+
+
+ -
+
+ 17636
+
+
+ 乌鸦级海军型
+
+
+ -
+
+ 17703
+
+
+ 帝国海军切割机级
+
+
+ -
+
+ 17705
+
+
+ 卡尼迪海军护卫舰
+
+
+ -
+
+ 17707
+
+
+ 莫德团护卫舰
+
+
+ -
+
+ 17709
+
+
+ 启示级海军型
+
+
+ -
+
+ 17713
+
+
+ 刺客级舰队型
+
+
+ -
+
+ 17715
+
+
+ 毒蜥级
+
+
+ -
+
+ 17718
+
+
+ 幽灵级
+
+
+ -
+
+ 17720
+
+
+ 塞纳波级
+
+
+ -
+
+ 17722
+
+
+ 警惕级
+
+
+ -
+
+ 17726
+
+
+ 灾难级海军型
+
+
+ -
+
+ 17728
+
+
+ 万王宝座级海军型
+
+
+ -
+
+ 17732
+
+
+ 狂暴级舰队型
+
+
+ -
+
+ 17736
+
+
+ 噩梦级
+
+
+ -
+
+ 17738
+
+
+ 马克瑞级
+
+
+ -
+
+ 17740
+
+
+ 复仇者级
+
+
+ -
+
+ 17812
+
+
+ 共和舰队火尾鸡级
+
+
+ -
+
+ 17841
+
+
+ 联邦海军彗星级
+
+
+ -
+
+ 17843
+
+
+ 狂怒者级海军型
+
+
+ -
+
+ 17918
+
+
+ 响尾蛇级
+
+
+ -
+
+ 17920
+
+
+ 巴戈龙级
+
+
+ -
+
+ 17922
+
+
+ 阿什姆级
+
+
+ -
+
+ 17924
+
+
+ 魔女级
+
+
+ -
+
+ 17926
+
+
+ 凝血级
+
+
+ -
+
+ 17928
+
+
+ 夜魔侠级
+
+
+ -
+
+ 17930
+
+
+ 潜龙级
+
+
+ -
+
+ 17932
+
+
+ 德拉米尔级
+
+
+ -
+
+ 19720
+
+
+ 神示级
+
+
+ -
+
+ 19722
+
+
+ 纳迦法级
+
+
+ -
+
+ 19724
+
+
+ 莫洛级
+
+
+ -
+
+ 19726
+
+
+ 凤凰级
+
+
+ -
+
+ 19744
+
+
+ 魔符级
+
+
+ -
+
+ 20125
+
+
+ 诅咒级
+
+
+ -
+
+ 20183
+
+
+ 普罗维登斯级
+
+
+ -
+
+ 20185
+
+
+ 渡神级
+
+
+ -
+
+ 20187
+
+
+ 方尖塔级
+
+
+ -
+
+ 20189
+
+
+ 芬利厄级
+
+
+ -
+
+ 21097
+
+
+ 高鲁的穿梭机
+
+
+ -
+
+ 21628
+
+
+ 古斯塔斯穿梭机
+
+
+ -
+
+ 22428
+
+
+ 救世级
+
+
+ -
+
+ 22430
+
+
+ 罪恶级
+
+
+ -
+
+ 22436
+
+
+ 寡妇级
+
+
+ -
+
+ 22440
+
+
+ 黑豹级
+
+
+ -
+
+ 22442
+
+
+ 曙光女神级
+
+
+ -
+
+ 22444
+
+
+ 斯雷普尼级
+
+
+ -
+
+ 22446
+
+
+ 兀鹫级
+
+
+ -
+
+ 22448
+
+
+ 救赎级
+
+
+ -
+
+ 22452
+
+
+ 异端级
+
+
+ -
+
+ 22456
+
+
+ 剑齿虎级
+
+
+ -
+
+ 22460
+
+
+ 厄里斯级
+
+
+ -
+
+ 22464
+
+
+ 飞燕级
+
+
+ -
+
+ 22466
+
+
+ 阿施塔特级
+
+
+ -
+
+ 22468
+
+
+ 月刃级
+
+
+ -
+
+ 22470
+
+
+ 夜鹰级
+
+
+ -
+
+ 22474
+
+
+ 永灭级
+
+
+ -
+
+ 22544
+
+
+ 霍克级
+
+
+ -
+
+ 22546
+
+
+ 轻舟级
+
+
+ -
+
+ 22548
+
+
+ 麦基诺级
+
+
+ -
+
+ 22852
+
+
+ 冥府级
+
+
+ -
+
+ 23055
+
+
+ 圣殿骑士 I
+
+
+ -
+
+ 23057
+
+
+ 蜻蜓 I
+
+
+ -
+
+ 23059
+
+
+ 掷矛手 I
+
+
+ -
+
+ 23061
+
+
+ 因赫吉 I
+
+
+ -
+
+ 23757
+
+
+ 执政官级
+
+
+ -
+
+ 23773
+
+
+ 拉格纳洛克级
+
+
+ -
+
+ 23911
+
+
+ 绝念级
+
+
+ -
+
+ 23913
+
+
+ 夜神级
+
+
+ -
+
+ 23915
+
+
+ 奇美拉级
+
+
+ -
+
+ 23917
+
+
+ 飞龙级
+
+
+ -
+
+ 23919
+
+
+ 万古级
+
+
+ -
+
+ 24483
+
+
+ 尼铎格尔级
+
+
+ -
+
+ 24688
+
+
+ 鹏鲲级
+
+
+ -
+
+ 24690
+
+
+ 亥伯龙神级
+
+
+ -
+
+ 24692
+
+
+ 地狱天使级
+
+
+ -
+
+ 24694
+
+
+ 死亡漩涡级
+
+
+ -
+
+ 24696
+
+
+ 先驱者级
+
+
+ -
+
+ 24698
+
+
+ 幼龙级
+
+
+ -
+
+ 24700
+
+
+ 弥洱米顿级
+
+
+ -
+
+ 24702
+
+
+ 暴风级
+
+
+ -
+
+ 25560
+
+
+ 奥普克斯龙神级豪华游轮
+
+
+ -
+
+ 26840
+
+
+ 乌鸦级政府型
+
+
+ -
+
+ 26842
+
+
+ 狂暴级部族型
+
+
+ -
+
+ 26849
+
+
+ 锦标赛版跃迁阻扰设备
+
+
+ -
+
+ 26888
+
+
+ 大型机动跃迁扰断器 II
+
+
+ -
+
+ 26890
+
+
+ 中型机动跃迁扰断器 II
+
+
+ -
+
+ 26892
+
+
+ 小型机动跃迁扰断器 II
+
+
+ -
+
+ 27299
+
+
+ 民用艾玛穿梭机
+
+
+ -
+
+ 27301
+
+
+ 民用加达里穿梭机
+
+
+ -
+
+ 27303
+
+
+ 民用盖伦特穿梭机
+
+
+ -
+
+ 27305
+
+
+ 民用米玛塔尔穿梭机
+
+
+ -
+
+ 28352
+
+
+ 长须鲸级
+
+
+ -
+
+ 28606
+
+
+ 逆戟鲸级
+
+
+ -
+
+ 28659
+
+
+ 帕拉丁级
+
+
+ -
+
+ 28661
+
+
+ 克洛诺斯级
+
+
+ -
+
+ 28665
+
+
+ 恶狼级
+
+
+ -
+
+ 28710
+
+
+ 魔像级
+
+
+ -
+
+ 28770
+
+
+ 大型辛迪加机动跃迁扰断器
+
+
+ -
+
+ 28772
+
+
+ 中型辛迪加机动跃迁扰断器
+
+
+ -
+
+ 28774
+
+
+ 小型辛迪加机动跃迁扰断器
+
+
+ -
+
+ 28844
+
+
+ 奥鸟级
+
+
+ -
+
+ 28846
+
+
+ 游牧者级
+
+
+ -
+
+ 28848
+
+
+ 安莎尔级
+
+
+ -
+
+ 28850
+
+
+ 方舟级
+
+
+ -
+
+ 29248
+
+
+ 富豪级
+
+
+ -
+
+ 29266
+
+
+ 神圣穿梭机
+
+
+ -
+
+ 29328
+
+
+ 艾玛传媒穿梭机
+
+
+ -
+
+ 29330
+
+
+ 加达里传媒穿梭机
+
+
+ -
+
+ 29332
+
+
+ 盖伦特传媒穿梭机
+
+
+ -
+
+ 29334
+
+
+ 米玛塔尔传媒穿梭机
+
+
+ -
+
+ 29336
+
+
+ 镰刀级舰队型
+
+
+ -
+
+ 29337
+
+
+ 奥格诺级海军型
+
+
+ -
+
+ 29340
+
+
+ 鱼鹰级海军型
+
+
+ -
+
+ 29344
+
+
+ 送葬者级海军型
+
+
+ -
+
+ 29984
+
+
+ 金鹏级
+
+
+ -
+
+ 29986
+
+
+ 圣卒级
+
+
+ -
+
+ 29988
+
+
+ 海神级
+
+
+ -
+
+ 29990
+
+
+ 洛基级
+
+
+ -
+
+ 30842
+
+
+ 星际捷运穿梭机
+
+
+ -
+
+ 32207
+
+
+ 暴狼级
+
+
+ -
+
+ 32209
+
+
+ 弥米尔级
+
+
+ -
+
+ 32305
+
+
+ 末日沙场级海军型
+
+
+ -
+
+ 32307
+
+
+ 多米尼克斯级海军型
+
+
+ -
+
+ 32309
+
+
+ 毒蝎级海军型
+
+
+ -
+
+ 32311
+
+
+ 台风级舰队型
+
+
+ -
+
+ 32325
+
+
+ 独眼巨人 I
+
+
+ -
+
+ 32340
+
+
+ 槌骨 I
+
+
+ -
+
+ 32342
+
+
+ 斩裂剑 I
+
+
+ -
+
+ 32344
+
+
+ 螳螂 I
+
+
+ -
+
+ 32788
+
+
+ 魔裔级
+
+
+ -
+
+ 32790
+
+
+ 伊塔那级
+
+
+ -
+
+ 32811
+
+
+ 米亚莫斯级阿玛斯翠丝版
+
+
+ -
+
+ 32840
+
+
+ 星际捷运促进级
+
+
+ -
+
+ 32842
+
+
+ 印塔基联合财团促进级
+
+
+ -
+
+ 32844
+
+
+ 短途物流促进级
+
+
+ -
+
+ 32846
+
+
+ 酷菲促进级
+
+
+ -
+
+ 32848
+
+
+ 埃拉斯多集团促进级
+
+
+ -
+
+ 32872
+
+
+ 阿尔格斯级
+
+
+ -
+
+ 32874
+
+
+ 龙骑兵级
+
+
+ -
+
+ 32876
+
+
+ 渡鸦级
+
+
+ -
+
+ 32878
+
+
+ 弯刀级
+
+
+ -
+
+ 32880
+
+
+ 冲锋者级
+
+
+ -
+
+ 32983
+
+
+ 斯库维塔苍鹭级
+
+
+ -
+
+ 32985
+
+
+ 短途物流伊米卡斯级
+
+
+ -
+
+ 32987
+
+
+ 萨拉姆富豪级
+
+
+ -
+
+ 32989
+
+
+ 维洛奇亚探索级
+
+
+ -
+
+ 33079
+
+
+ 未来人类级
+
+
+ -
+
+ 33081
+
+
+ 毒蛇级
+
+
+ -
+
+ 33083
+
+
+ 违逆者级
+
+
+ -
+
+ 33099
+
+
+ 内凡达长尾鲛级
+
+
+ -
+
+ 33151
+
+
+ 布鲁提克斯级海军型
+
+
+ -
+
+ 33153
+
+
+ 幼龙级海军型
+
+
+ -
+
+ 33155
+
+
+ 先驱者级海军型
+
+
+ -
+
+ 33157
+
+
+ 暴风级舰队型
+
+
+ -
+
+ 33190
+
+
+ 塔什蒙贡富豪级
+
+
+ -
+
+ 33328
+
+
+ 太空舱 - 格鲁汀 曙光 197-衍生型
+
+
+ -
+
+ 33395
+
+
+ 莫拉查级
+
+
+ -
+
+ 33397
+
+
+ 克雷默斯级
+
+
+ -
+
+ 33468
+
+
+ 阿斯特罗级
+
+
+ -
+
+ 33470
+
+
+ 斯特修斯级
+
+
+ -
+
+ 33472
+
+
+ 涅斯托级
+
+
+ -
+
+ 33474
+
+
+ 移动式仓库
+
+
+ -
+
+ 33475
+
+
+ 移动式牵引装置
+
+
+ -
+
+ 33476
+
+
+ 移动式诱导抑制装置
+
+
+ -
+
+ 33477
+
+
+ 小型移动式虹吸装置
+
+
+ -
+
+ 33478
+
+
+ 中型移动式虹吸装置
+
+
+ -
+
+ 33479
+
+
+ 大型移动式虹吸装置
+
+
+ -
+
+ 33513
+
+
+ 美洲豹级
+
+
+ -
+
+ 33520
+
+
+ 小屋移动式仓库
+
+
+ -
+
+ 33522
+
+
+ 帐篷移动式仓库
+
+
+ -
+
+ 33553
+
+
+ 斯特修斯级应急反应型
+
+
+ -
+
+ 33581
+
+
+ 小型混合物移动式虹吸装置
+
+
+ -
+
+ 33583
+
+
+ 小型搬运工移动式虹吸装置
+
+
+ -
+
+ 33585
+
+
+ 失效的艾玛事件监测装置
+
+
+ -
+
+ 33587
+
+
+ 移动式诱捕装置
+
+
+ -
+
+ 33589
+
+
+ 移动式扫描抑制装置
+
+
+ -
+
+ 33591
+
+
+ 移动式微型跳跃装置
+
+
+ -
+
+ 33595
+
+
+ 失效的加达里事件监测装置
+
+
+ -
+
+ 33608
+
+
+ 失效的盖伦特事件监测装置
+
+
+ -
+
+ 33610
+
+
+ 失效的米玛塔尔事件监测装置
+
+
+ -
+
+ 33623
+
+
+ 地狱天使级塔什蒙贡版
+
+
+ -
+
+ 33625
+
+
+ 地狱天使级卡多尔版
+
+
+ -
+
+ 33627
+
+
+ 鹏鲲级纳基维版
+
+
+ -
+
+ 33629
+
+
+ 鹏鲲级维克米集团版
+
+
+ -
+
+ 33631
+
+
+ 死亡漩涡级内凡达版
+
+
+ -
+
+ 33633
+
+
+ 死亡漩涡级克鲁夏版
+
+
+ -
+
+ 33635
+
+
+ 亥伯龙神级埃拉斯多集团版
+
+
+ -
+
+ 33637
+
+
+ 亥伯龙神级短途物流版
+
+
+ -
+
+ 33639
+
+
+ 启示级卡多尔版
+
+
+ -
+
+ 33641
+
+
+ 启示级塔什蒙贡版
+
+
+ -
+
+ 33643
+
+
+ 狞獾级纳基维版
+
+
+ -
+
+ 33645
+
+
+ 狞獾级维克米集团版
+
+
+ -
+
+ 33647
+
+
+ 刺客级内凡达版
+
+
+ -
+
+ 33649
+
+
+ 刺客级克鲁夏版
+
+
+ -
+
+ 33651
+
+
+ 托勒克斯级埃拉斯多集团版
+
+
+ -
+
+ 33653
+
+
+ 托勒克斯级短途物流版
+
+
+ -
+
+ 33655
+
+
+ 惩罚者级卡多尔版
+
+
+ -
+
+ 33657
+
+
+ 惩罚者级塔什蒙贡版
+
+
+ -
+
+ 33659
+
+
+ 小鹰级纳基维版
+
+
+ -
+
+ 33661
+
+
+ 小鹰级维克米集团版
+
+
+ -
+
+ 33663
+
+
+ 裂谷级内凡达版
+
+
+ -
+
+ 33665
+
+
+ 裂谷级克鲁夏版
+
+
+ -
+
+ 33667
+
+
+ 因卡萨斯级埃拉斯多集团版
+
+
+ -
+
+ 33669
+
+
+ 因卡萨斯级短途物流版
+
+
+ -
+
+ 33673
+
+
+ 长尾蜥级
+
+
+ -
+
+ 33675
+
+
+ 变色龙级
+
+
+ -
+
+ 33677
+
+
+ 警察追击彗星级
+
+
+ -
+
+ 33683
+
+
+ 麦基诺级ORE开发版
+
+
+ -
+
+ 33685
+
+
+ 逆戟鲸级ORE开发版
+
+
+ -
+
+ 33687
+
+
+ 长须鲸级ORE开发版
+
+
+ -
+
+ 33689
+
+
+ 伊特龙级短途物流版
+
+
+ -
+
+ 33691
+
+
+ 狐鼬级维克米集团版
+
+
+ -
+
+ 33693
+
+
+ 猛犸级内凡达版
+
+
+ -
+
+ 33695
+
+
+ 恩赐者级塔什蒙贡版
+
+
+ -
+
+ 33697
+
+
+ 掘金者级
+
+
+ -
+
+ 33700
+
+
+ 林鼠移动式牵引装置
+
+
+ -
+
+ 33702
+
+
+ 喜鹊移动式牵引装置
+
+
+ -
+
+ 33816
+
+
+ 加姆级
+
+
+ -
+
+ 33818
+
+
+ 奥苏斯级
+
+
+ -
+
+ 33820
+
+
+ 巴盖斯级
+
+
+ -
+
+ 33869
+
+
+ 布鲁提克斯级天蛇版
+
+
+ -
+
+ 33871
+
+
+ 飓风级图克尔部族版
+
+
+ -
+
+ 33873
+
+
+ 猛鲑级古斯塔斯版
+
+
+ -
+
+ 33875
+
+
+ 先知级血袭者版
+
+
+ -
+
+ 33877
+
+
+ 促进级天蛇版
+
+
+ -
+
+ 33879
+
+
+ 强制者级血袭者版
+
+
+ -
+
+ 33881
+
+
+ 海燕级古斯塔斯版
+
+
+ -
+
+ 33883
+
+
+ 长尾鲛级图克尔部族版
+
+
+ -
+
+ 33990
+
+
+ 锦标赛微型跳跃装置
+
+
+ -
+
+ 34118
+
+
+ 万王宝座级酷菲版
+
+
+ -
+
+ 34120
+
+
+ Mobile Competitive Vault
+
+
+ -
+
+ 34151
+
+
+ 响尾蛇级胜利版
+
+
+ -
+
+ 34213
+
+
+ 灾难级血袭者版
+
+
+ -
+
+ 34215
+
+
+ 灾难级卡多尔版
+
+
+ -
+
+ 34217
+
+
+ 灾难级塔什蒙贡版
+
+
+ -
+
+ 34219
+
+
+ 帕拉丁级血袭者版
+
+
+ -
+
+ 34221
+
+
+ 帕拉丁级卡多尔版
+
+
+ -
+
+ 34223
+
+
+ 帕拉丁级塔什蒙贡版
+
+
+ -
+
+ 34225
+
+
+ 乌鸦级古斯塔斯版
+
+
+ -
+
+ 34227
+
+
+ 乌鸦级卡拉吉塔集团版
+
+
+ -
+
+ 34229
+
+
+ 乌鸦级纳基维版
+
+
+ -
+
+ 34231
+
+
+ 魔像级古斯塔斯版
+
+
+ -
+
+ 34233
+
+
+ 魔像级卡拉吉塔集团版
+
+
+ -
+
+ 34235
+
+
+ 魔像级纳基维版
+
+
+ -
+
+ 34237
+
+
+ 万王宝座级警察版
+
+
+ -
+
+ 34239
+
+
+ 万王宝座级短途物流版
+
+
+ -
+
+ 34241
+
+
+ 克洛诺斯级警察版
+
+
+ -
+
+ 34243
+
+
+ 克洛诺斯级酷菲版
+
+
+ -
+
+ 34245
+
+
+ 克洛诺斯短途物流版
+
+
+ -
+
+ 34247
+
+
+ 狂暴级司法局版
+
+
+ -
+
+ 34249
+
+
+ 狂暴级克鲁夏版
+
+
+ -
+
+ 34251
+
+
+ 狂暴级内凡达版
+
+
+ -
+
+ 34253
+
+
+ 恶狼级司法局版
+
+
+ -
+
+ 34255
+
+
+ 恶狼级克鲁夏版
+
+
+ -
+
+ 34257
+
+
+ 恶狼级内凡达版
+
+
+ -
+
+ 34317
+
+
+ 忏悔者级
+
+
+ -
+
+ 34328
+
+
+ 弓头鲸级
+
+
+ -
+
+ 34339
+
+
+ 莫洛级星际捷运版
+
+
+ -
+
+ 34341
+
+
+ 纳迦法级司法局版
+
+
+ -
+
+ 34343
+
+
+ 凤凰级维克米集团版
+
+
+ -
+
+ 34345
+
+
+ 神示级萨拉姆版
+
+
+ -
+
+ 34441
+
+
+ 多米尼克斯级酷菲版
+
+
+ -
+
+ 34443
+
+
+ 特里斯坦级酷菲版
+
+
+ -
+
+ 34445
+
+
+ 狂怒者级酷菲版
+
+
+ -
+
+ 34457
+
+
+ 末日沙场级YC117年特别版
+
+
+ -
+
+ 34459
+
+
+ 地狱天使级YC117年特别版
+
+
+ -
+
+ 34461
+
+
+ 马克瑞级YC117年特别版
+
+
+ -
+
+ 34463
+
+
+ 响尾蛇级YC117年特别版
+
+
+ -
+
+ 34465
+
+
+ 多米尼克斯级YC117年特别版
+
+
+ -
+
+ 34467
+
+
+ 万王宝座级YC117年特别版
+
+
+ -
+
+ 34469
+
+
+ 乌鸦级YC117年特别版
+
+
+ -
+
+ 34471
+
+
+ 灾难级YC117年特别版
+
+
+ -
+
+ 34473
+
+
+ 幼龙级YC117年特别版
+
+
+ -
+
+ 34475
+
+
+ 毒蜥级YC117年特别版
+
+
+ -
+
+ 34477
+
+
+ 银鹰级YC117年特别版
+
+
+ -
+
+ 34479
+
+
+ 伊什塔级YC117年特别版
+
+
+ -
+
+ 34496
+
+
+ 议会外交穿梭机
+
+
+ -
+
+ 34562
+
+
+ 斯威普级
+
+
+ -
+
+ 34590
+
+
+ 凯旋奢华游艇
+
+
+ -
+
+ 34828
+
+
+ 寒鸦级
+
+
+ -
+
+ 35683
+
+
+ 赫卡特级
+
+
+ -
+
+ 35779
+
+
+ 小鬼级
+
+
+ -
+
+ 35781
+
+
+ 恶魔级
+
+
+ -
+
+ 35825
+
+
+ 莱塔卢
+
+
+ -
+
+ 35826
+
+
+ 阿兹贝尔
+
+
+ -
+
+ 35827
+
+
+ 索迪约
+
+
+ -
+
+ 35828
+
+
+ 中型实验室
+
+
+ -
+
+ 35829
+
+
+ 大型实验室
+
+
+ -
+
+ 35830
+
+
+ 超大型实验室
+
+
+ -
+
+ 35832
+
+
+ 空堡
+
+
+ -
+
+ 35833
+
+
+ 铁壁
+
+
+ -
+
+ 35834
+
+
+ 星城
+
+
+ -
+
+ 35835
+
+
+ 阿塔诺
+
+
+ -
+
+ 35836
+
+
+ 塔塔拉
+
+
+ -
+
+ 35837
+
+
+ 自定义星门 1
+
+
+ -
+
+ 35838
+
+
+ 中型瞭望阵列
+
+
+ -
+
+ 35839
+
+
+ 大型瞭望阵列
+
+
+ -
+
+ 35841
+
+
+ 安塞波跳跃桥接
+
+
+ -
+
+ 35842
+
+
+ 中型行政中心
+
+
+ -
+
+ 35843
+
+
+ 大型行政中心
+
+
+ -
+
+ 35844
+
+
+ 超大型行政中心
+
+
+ -
+
+ 36523
+
+
+ Tournament Practice Unit
+
+
+ -
+
+ 37135
+
+
+ 永恒者级
+
+
+ -
+
+ 37453
+
+
+ 磨难级海军型
+
+
+ -
+
+ 37454
+
+
+ 守夜者级舰队型
+
+
+ -
+
+ 37455
+
+
+ 狮鹫级海军型
+
+
+ -
+
+ 37456
+
+
+ 毛鲁斯级海军型
+
+
+ -
+
+ 37457
+
+
+ 执事级
+
+
+ -
+
+ 37458
+
+
+ 麒麟级
+
+
+ -
+
+ 37459
+
+
+ 塔利亚级
+
+
+ -
+
+ 37460
+
+
+ 手术刀级
+
+
+ -
+
+ 37480
+
+
+ 天梯级
+
+
+ -
+
+ 37481
+
+
+ 教皇级
+
+
+ -
+
+ 37482
+
+
+ 鹳鸟级
+
+
+ -
+
+ 37483
+
+
+ 占星级
+
+
+ -
+
+ 37533
+
+
+ 超大型瞭望阵列
+
+
+ -
+
+ 37535
+
+
+ 昇威简易广告中心
+
+
+ -
+
+ 37536
+
+
+ 昇威高级广告中心
+
+
+ -
+
+ 37599
+
+
+ 修道士 I
+
+
+ -
+
+ 37604
+
+
+ 使徒级
+
+
+ -
+
+ 37605
+
+
+ 龙鸟级
+
+
+ -
+
+ 37606
+
+
+ 利夫级
+
+
+ -
+
+ 37607
+
+
+ 尼纳苏级
+
+
+ -
+
+ 40340
+
+
+ 昇威豪华星城
+
+
+ -
+
+ 40345
+
+
+ 圣甲虫 I
+
+
+ -
+
+ 40346
+
+
+ 塞壬 I
+
+
+ -
+
+ 40347
+
+
+ 德洛米 I
+
+
+ -
+
+ 40358
+
+
+ 骑士 I
+
+
+ -
+
+ 40359
+
+
+ 蚱蜢 I
+
+
+ -
+
+ 40360
+
+
+ 萨梯 I
+
+
+ -
+
+ 40361
+
+
+ 格拉墨 I
+
+
+ -
+
+ 40362
+
+
+ 阿米特 I
+
+
+ -
+
+ 40363
+
+
+ 白蚁 I
+
+
+ -
+
+ 40364
+
+
+ 安泰 I
+
+
+ -
+
+ 40365
+
+
+ 长枪 I
+
+
+ -
+
+ 40552
+
+
+ 骑士 II
+
+
+ -
+
+ 40553
+
+
+ 格拉墨 II
+
+
+ -
+
+ 40554
+
+
+ 蚱蜢 II
+
+
+ -
+
+ 40555
+
+
+ 萨梯 II
+
+
+ -
+
+ 40556
+
+
+ 圣殿骑士 II
+
+
+ -
+
+ 40557
+
+
+ 蜻蜓 II
+
+
+ -
+
+ 40558
+
+
+ 掷矛手 II
+
+
+ -
+
+ 40559
+
+
+ 因赫吉 II
+
+
+ -
+
+ 40560
+
+
+ 阿米特 II
+
+
+ -
+
+ 40561
+
+
+ 槌骨 II
+
+
+ -
+
+ 40562
+
+
+ 安泰 II
+
+
+ -
+
+ 40563
+
+
+ 独眼巨人 II
+
+
+ -
+
+ 40564
+
+
+ 长枪 II
+
+
+ -
+
+ 40565
+
+
+ 斩裂剑 II
+
+
+ -
+
+ 40566
+
+
+ 白蚁 II
+
+
+ -
+
+ 40567
+
+
+ 螳螂 II
+
+
+ -
+
+ 40568
+
+
+ 修道士 II
+
+
+ -
+
+ 40569
+
+
+ 圣甲虫 II
+
+
+ -
+
+ 40570
+
+
+ 塞壬 II
+
+
+ -
+
+ 40571
+
+
+ 德洛米 II
+
+
+ -
+
+ 42124
+
+
+ 猛烈级
+
+
+ -
+
+ 42125
+
+
+ 仇恨级
+
+
+ -
+
+ 42126
+
+
+ 征服者级
+
+
+ -
+
+ 42132
+
+
+ 先锋级
+
+
+ -
+
+ 42133
+
+
+ 尊者级
+
+
+ -
+
+ 42241
+
+
+ 摩洛克级
+
+
+ -
+
+ 42242
+
+
+ 大衮级
+
+
+ -
+
+ 42243
+
+
+ 基抹级
+
+
+ -
+
+ 42244
+
+
+ 海豚级
+
+
+ -
+
+ 42245
+
+
+ 拉比苏级
+
+
+ -
+
+ 42246
+
+
+ 凯帝斯级
+
+
+ -
+
+ 42685
+
+
+ 旭日级
+
+
+ -
+
+ 44993
+
+
+ 安抚者
+
+
+ -
+
+ 44995
+
+
+ 执法者级
+
+
+ -
+
+ 44996
+
+
+ 元帅级
+
+
+ -
+
+ 45006
+
+
+ ♦ 索迪约
+
+
+ -
+
+ 45530
+
+
+ 收藏家级
+
+
+ -
+
+ 45531
+
+
+ 胜利者级
+
+
+ -
+
+ 45534
+
+
+ 监视者级
+
+
+ -
+
+ 45645
+
+
+ 赤龟级
+
+
+ -
+
+ 45647
+
+
+ 凯门鳄级
+
+
+ -
+
+ 45649
+
+
+ 科莫多级
+
+
+ -
+
+ 45651
+
+
+ Able_PLACEHOLDER
+
+
+ -
+
+ 45669
+
+
+ Baker_PLACEHOLDER
+
+
+ -
+
+ 45671
+
+
+ Charlie_PLACEHOLDER
+
+
+ -
+
+ 45673
+
+
+ Dog_PLACEHOLDER
+
+
+ -
+
+ 45675
+
+
+ Easy_PLACEHOLDER
+
+
+ -
+
+ 46363
+
+
+ 古斯塔斯海盗要塞
+
+
+ -
+
+ 46364
+
+
+ 血袭者要塞
+
+
+ -
+
+ 47269
+
+
+ 达玛维克级
+
+
+ -
+
+ 47270
+
+
+ 维德马克级
+
+
+ -
+
+ 47271
+
+
+ 勒沙克级
+
+
+ -
+
+ 47466
+
+
+ 实践级
+
+
+ -
+
+ 47512
+
+
+ "莫罗"铁壁
+
+
+ -
+
+ 47513
+
+
+ "德拉库斯"铁壁
+
+
+ -
+
+ 47514
+
+
+ "地平线"铁壁
+
+
+ -
+
+ 47515
+
+
+ "马金尼斯"铁壁
+
+
+ -
+
+ 47516
+
+
+ "普罗米修斯"铁壁
+
+
+ -
+
+ 47727
+
+
+ GFX Test Vargur 1/2
+
+
+ -
+
+ 47728
+
+
+ GFX Test Vargur 2/2
+
+
+ -
+
+ 48635
+
+
+ 提亚玛特级
+
+
+ -
+
+ 48636
+
+
+ 九头蛇级
+
+
+ -
+
+ 49710
+
+
+ 奇奇莫拉级
+
+
+ -
+
+ 49711
+
+
+ 德雷卡瓦级
+
+
+ -
+
+ 49712
+
+
+ 洛迪瓦级
+
+
+ -
+
+ 49713
+
+
+ 扎玛德级
+
+
+ -
+
+ 52250
+
+
+ 涅伽尔级
+
+
+ -
+
+ 52252
+
+
+ 伊基图萨级
+
+
+ -
+
+ 52254
+
+
+ 德拉古级
+
+
+ -
+
+ 52267
+
+
+ 测试地点暴君级
+
+
+ -
+
+ 52907
+
+
+ 泽尼塔级
+
+
+ -
+
+ 54731
+
+
+ 破天级
+
+
+ -
+
+ 54732
+
+
+ 唤风级
+
+
+ -
+
+ 54733
+
+
+ 雷裔级
+
+
+ -
+
+ 56701
+
+
+ 移动式生物质收割者
+
+
+ -
+
+ 58745
+
+
+ 星空会民用阿斯特罗级
+
+
+ -
+
+ 60764
+
+
+ 猎獒级
+
+
+ -
+
+ 60765
+
+
+ 雷兽级
+
+
+ -
+
+ 64034
+
+
+ 鹰鸮级
+
+
+ -
+
+ 71116
+
+
+ 艾玛帝国要塞
+
+
+ -
+
+ 71117
+
+
+ 加达里合众国要塞
+
+
+ -
+
+ 71118
+
+
+ 盖伦特联邦要塞
+
+
+ -
+
+ 71119
+
+
+ 米玛塔尔共和国要塞
+
+
+ -
+
+ 72811
+
+
+ 飓风级舰队型
+
+
+ -
+
+ 72812
+
+
+ 猛鲑级海军型
+
+
+ -
+
+ 72869
+
+
+ 弥洱米顿级海军型
+
+
+ -
+
+ 72872
+
+
+ 先知级海军型
+
+
+ -
+
+ 72903
+
+
+ 探索级舰队型
+
+
+ -
+
+ 72904
+
+
+ 苍鹭级海军型
+
+
+ -
+
+ 72907
+
+
+ 富豪级海军型
+
+
+ -
+
+ 72913
+
+
+ 伊米卡斯级海军型
+
+
+ -
+
+ 73787
+
+
+ 纳迦法级舰队型
+
+
+ -
+
+ 73789
+
+
+ 强制者级海军型
+
+
+ -
+
+ 73790
+
+
+ 神示级海军型
+
+
+ -
+
+ 73792
+
+
+ 莫洛级海军型
+
+
+ -
+
+ 73793
+
+
+ 凤凰级海军型
+
+
+ -
+
+ 73794
+
+
+ 长尾鲛级舰队型
+
+
+ -
+
+ 73795
+
+
+ 海燕级海军型
+
+
+ -
+
+ 73796
+
+
+ 促进级海军型
+
+
+ -
+
+ 74141
+
+
+ 格里级
+
+
+ -
+
+ 74316
+
+
+ 贝斯特拉
+
+
+ -
+
+ 77114
+
+
+ 变形级
+
+
+ -
+
+ 77726
+
+
+ 西布勒级
+
+
+ -
+
+ 78333
+
+
+ 梅库巴尔级
+
+
+ -
+
+ 78366
+
+
+ 短吻鳄级
+
+
+ -
+
+ 78367
+
+
+ 曼巴级
+
+
+ -
+
+ 78369
+
+
+ 希兹里尔级
+
+
+ -
+
+ 78414
+
+
+ 沙帕什级
+
+
+ -
+
+ 78576
+
+
+ 阿扎里尔级
+
+
+ -
+
+ 81008
+
+
+ 狂风级
+
+
+ -
+
+ 81040
+
+
+ 雪崩级
+
+
+ -
+
+ 81046
+
+
+ 洪水级
+
+
+ -
+
+ 81047
+
+
+ 湍流级
+
+
+ -
+
+ 81951
+
+
+ 财团移动式牵引装置
+
+
+ -
+
+ 83579
+
+
+ 圣殿骑士级帝国海军
+
+
+ -
+
+ 83582
+
+
+ 蜻蜓级加达里海军
+
+
+ -
+
+ 83583
+
+
+ 联邦海军掷矛手舰载机
+
+
+ -
+
+ 83584
+
+
+ 共和舰队因赫吉舰载机
+
+
+ -
+
+ 83585
+
+
+ 帝国海军骑士
+
+
+ -
+
+ 83586
+
+
+ 加达里海军蚱蜢
+
+
+ -
+
+ 83587
+
+
+ 联邦海军萨梯
+
+
+ -
+
+ 83589
+
+
+ 共和舰队格拉墨
+
+
+ -
+
+ 83591
+
+
+ 帝国海军修道士
+
+
+ -
+
+ 83592
+
+
+ 加达里海军圣甲虫
+
+
+ -
+
+ 83593
+
+
+ 联邦海军塞壬
+
+
+ -
+
+ 83594
+
+
+ 共和舰队德洛米
+
+
+ -
+
+ 85062
+
+
+ 侧进蛇级
+
+
+ -
+
+ 85086
+
+
+ 纪念碑级
+
+
+ -
+
+ 85087
+
+
+ 穹顶级
+
+
+ -
+
+ 85229
+
+
+ 眼镜蛇级
+
+
+ -
+
+ 85236
+
+
+ 巨蟒级
+
+
+ -
+
+ 87381
+
+
+ 萨拉希尔
+
+
+ -
+
+ 88001
+
+
+ 巴巴罗加号
+
+
+ -
+
+ 89240
+
+
+ 开拓者级
+
+
+ -
+
+ 89607
+
+
+ 奥德修斯级
+
+
+ -
+
+ 89647
+
+
+ 开拓者级财团型
+
+
+ -
+
+ 89648
+
+
+ 冲锋者级财团型
+
+
+ -
+
+ 89649
+
+
+ 先驱级
+
+
+
diff --git a/SMT/App.xaml.cs b/SMT/App.xaml.cs
index 7f81fd93..7a2df03c 100644
--- a/SMT/App.xaml.cs
+++ b/SMT/App.xaml.cs
@@ -1,10 +1,7 @@
-using System.Windows;
+using System.Windows;
namespace SMT
{
- ///
- /// Interaction logic for App.xaml
- ///
public partial class App : Application
{
}
diff --git a/SMT/Languages/en-US.xaml b/SMT/Languages/en-US.xaml
index 3cc68f78..1909446b 100644
--- a/SMT/Languages/en-US.xaml
+++ b/SMT/Languages/en-US.xaml
@@ -110,10 +110,18 @@
Show NPC kill delta
Show the current route
Show the full region in hunter mode
+
+ ZKB Float Window
+ Background Opacity
+ Content Opacity
+ Max Kills to Display
+ Filter by Selected Region
+
Reset Colours
Characters
Overlay
+ ZKB Float Window
Exit
Data
Manage Infrastructure Upgrades...
diff --git a/SMT/Languages/zh-CN.xaml b/SMT/Languages/zh-CN.xaml
index 595d51c7..b5e7b706 100644
--- a/SMT/Languages/zh-CN.xaml
+++ b/SMT/Languages/zh-CN.xaml
@@ -110,10 +110,18 @@
显示 NPC 击杀数量的变化差值
在悬浮窗上画出设定的自动导航路线
猎手模式下强制显示整个星域地图
+
+ ZKB 浮动窗口设置
+ 背景不透明度
+ 内容不透明度
+ 最大显示击杀数
+ 仅显示当前星域
+
重置所有颜色为默认
角色管理
开启雷达悬浮窗
+ ZKB 浮动窗口
退出程序
数据工具
管理基础设施升级...
diff --git a/SMT/MainWindow.xaml b/SMT/MainWindow.xaml
index 719af8ee..8d7645df 100644
--- a/SMT/MainWindow.xaml
+++ b/SMT/MainWindow.xaml
@@ -54,6 +54,7 @@
+
@@ -578,7 +579,7 @@
-
+
diff --git a/SMT/MainWindow.xaml.cs b/SMT/MainWindow.xaml.cs
index ea7a3beb..adc3ae79 100644
--- a/SMT/MainWindow.xaml.cs
+++ b/SMT/MainWindow.xaml.cs
@@ -35,6 +35,7 @@ public partial class MainWindow : Window
public static MainWindow AppWindow;
private LogonWindow logonBrowserWindow;
private List overlayWindows = new();
+ private ZKBMonitor zkbMonitorWindow;
private bool overlayWindowsAreClickTrough = false;
public bool OverlayWindowsAreClickTrough
@@ -141,32 +142,7 @@ public MainWindow()
CharacterNameIDCache = new Dictionary();
CharacterIDNameCache = new Dictionary();
- InitializeComponent();
-
- Title = $"SMT : {EveAppConfig.SMT_TITLE} ({EveAppConfig.SMT_VERSION})";
-
- // Load the Dock Manager Layout file
- string dockManagerLayoutName = Path.Combine(EveAppConfig.StorageRoot, "Layout_" + WindowLayoutVersion + ".dat");
- if(File.Exists(dockManagerLayoutName) && OperatingSystem.IsWindows())
- {
- try
- {
- AvalonDock.Layout.Serialization.XmlLayoutSerializer ls = new(dockManager);
- using(var sr = new StreamReader(dockManagerLayoutName))
- {
- ls.Deserialize(sr);
- }
- }
- catch
- {
- }
- }
-
- // Due to bugs in the Dock manager patch up the content id's for the 2 main views
- RegionLayoutDoc = FindDocWithContentID(dockManager.Layout, "MapRegionContentID");
- UniverseLayoutDoc = FindDocWithContentID(dockManager.Layout, "FullUniverseViewID");
-
- // load any custom map settings off disk
+ // Load MapConfig BEFORE InitializeComponent so language can be applied
string mapConfigFileName = Path.Combine(EveAppConfig.StorageRoot, "MapConfig_" + MapConfig.SaveVersion + ".dat");
if(File.Exists(mapConfigFileName))
@@ -192,6 +168,55 @@ public MainWindow()
MapConf.SetDefaultColours();
}
+ // Apply persisted language before InitializeComponent resolves DynamicResource
+ if (MapConf != null && MapConf.Language == "zh-CN")
+ {
+ ResourceDictionary oldLangDict = null;
+ foreach (var dict in Application.Current.Resources.MergedDictionaries)
+ {
+ if (dict.Source != null && dict.Source.OriginalString.StartsWith("Languages/"))
+ {
+ oldLangDict = dict;
+ break;
+ }
+ }
+
+ ResourceDictionary newLangDict = new ResourceDictionary
+ {
+ Source = new Uri("Languages/zh-CN.xaml", UriKind.Relative)
+ };
+ Application.Current.Resources.MergedDictionaries.Add(newLangDict);
+ if (oldLangDict != null)
+ Application.Current.Resources.MergedDictionaries.Remove(oldLangDict);
+
+ EVEData.EveManager.CurrentLanguage = "zh-CN";
+ }
+
+ InitializeComponent();
+
+ Title = $"SMT : {EveAppConfig.SMT_TITLE} ({EveAppConfig.SMT_VERSION})";
+
+ // Load the Dock Manager Layout file
+ string dockManagerLayoutName = Path.Combine(EveAppConfig.StorageRoot, "Layout_" + WindowLayoutVersion + ".dat");
+ if(File.Exists(dockManagerLayoutName) && OperatingSystem.IsWindows())
+ {
+ try
+ {
+ AvalonDock.Layout.Serialization.XmlLayoutSerializer ls = new(dockManager);
+ using(var sr = new StreamReader(dockManagerLayoutName))
+ {
+ ls.Deserialize(sr);
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ // Due to bugs in the Dock manager patch up the content id's for the 2 main views
+ RegionLayoutDoc = FindDocWithContentID(dockManager.Layout, "MapRegionContentID");
+ UniverseLayoutDoc = FindDocWithContentID(dockManager.Layout, "FullUniverseViewID");
+
if(MapConf.AlwaysOnTop)
{
this.Topmost = true;
@@ -234,6 +259,18 @@ public MainWindow()
EVEManager.LoadFromDisk();
}
+ EVEManager.LoadShipTypesCNFromCache();
+ _ = EVEManager.FetchShipTypeChineseNamesAsync().ContinueWith(_ =>
+ {
+ Application.Current?.Dispatcher.Invoke(() =>
+ {
+ foreach (var item in EVEManager.ZKillFeed.KillStream)
+ {
+ item.RefreshShipTypeDisplay();
+ }
+ });
+ });
+
EVEManager.SetupIntelWatcher();
EVEManager.SetupGameLogWatcher();
EVEManager.SetupLogFileTriggers();
@@ -2528,6 +2565,20 @@ private void OverlayWindow_MenuItem_Click(object sender, RoutedEventArgs e)
overlayWindows.Add(newOverlayWindow);
}
+ private void ZKBFloatWindow_MenuItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (zkbMonitorWindow != null)
+ {
+ zkbMonitorWindow.Close();
+ zkbMonitorWindow = null;
+ return;
+ }
+
+ zkbMonitorWindow = new ZKBMonitor(this);
+ zkbMonitorWindow.Closing += (s, args) => { zkbMonitorWindow = null; };
+ zkbMonitorWindow.Show();
+ }
+
private void OverlayClickTroughToggle_MenuItem_Click(object sender, RoutedEventArgs e)
{
OverlayWindow_ToggleClickTrough();
diff --git a/SMT/MapConfig.cs b/SMT/MapConfig.cs
index dad2ae9b..c7c2c98e 100644
--- a/SMT/MapConfig.cs
+++ b/SMT/MapConfig.cs
@@ -12,6 +12,9 @@ public class MapConfig : INotifyPropertyChanged
[Browsable(false)]
public MapColours ActiveColourScheme;
+ [Browsable(false)]
+ private string m_Language = "en-US";
+
[Category("Navigation")]
private bool m_AlwaysOnTop;
@@ -111,6 +114,12 @@ public class MapConfig : INotifyPropertyChanged
private bool m_overlayIndividualCharacterWindows = false;
private string m_overlayAdditionalCharacterNamesDisplay = "All";
+ // ZKB float window settings
+ private float m_zkbFloatBackgroundOpacity = 0.2f;
+ private float m_zkbFloatContentOpacity = 0.85f;
+ private int m_zkbFloatMaxKills = 50;
+ private bool m_zkbFloatFilterByRegion = true;
+
public MapConfig()
{
SetDefaults();
@@ -118,6 +127,20 @@ public MapConfig()
public event PropertyChangedEventHandler PropertyChanged;
+ [Browsable(false)]
+ public string Language
+ {
+ get { return m_Language; }
+ set
+ {
+ if (m_Language != value)
+ {
+ m_Language = value;
+ OnPropertyChanged("Language");
+ }
+ }
+ }
+
[Category("General")]
[DisplayName("Always on top")]
public bool AlwaysOnTop
@@ -1219,6 +1242,38 @@ public float IntelHistoricTime
}
}
+ [Browsable(false)]
+ public float ZKBFloatBackgroundOpacity
+ {
+ get { return m_zkbFloatBackgroundOpacity; }
+ set { m_zkbFloatBackgroundOpacity = Math.Clamp(value, 0.05f, 1.0f); OnPropertyChanged("ZKBFloatBackgroundOpacity"); }
+ }
+
+ [Browsable(false)]
+ public float ZKBFloatContentOpacity
+ {
+ get { return m_zkbFloatContentOpacity; }
+ set { m_zkbFloatContentOpacity = Math.Clamp(value, 0.1f, 1.0f); OnPropertyChanged("ZKBFloatContentOpacity"); }
+ }
+
+ [Browsable(false)]
+ public int ZKBFloatMaxKills
+ {
+ get { return m_zkbFloatMaxKills; }
+ set { m_zkbFloatMaxKills = Math.Clamp(value, 10, 200); OnPropertyChanged("ZKBFloatMaxKills"); }
+ }
+
+ [Browsable(false)]
+ public bool ZKBFloatFilterByRegion
+ {
+ get { return m_zkbFloatFilterByRegion; }
+ set { m_zkbFloatFilterByRegion = value; OnPropertyChanged("ZKBFloatFilterByRegion"); }
+ }
+
+ [XmlIgnore]
+ [Browsable(false)]
+ public bool ZKBFloatWindowOpen { get; set; }
+
public int ZkillExpireTimeMinutes
{
get
diff --git a/SMT/Preferences.xaml b/SMT/Preferences.xaml
index 26ab6444..87d9bae2 100644
--- a/SMT/Preferences.xaml
+++ b/SMT/Preferences.xaml
@@ -400,6 +400,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SMT/Preferences.xaml.cs b/SMT/Preferences.xaml.cs
index 2f9e9bd2..b53e014d 100644
--- a/SMT/Preferences.xaml.cs
+++ b/SMT/Preferences.xaml.cs
@@ -482,9 +482,17 @@ private void LanguageComboBox_SelectionChanged(object sender, System.Windows.Con
Application.Current.Resources.MergedDictionaries.Remove(oldLangDict);
}
- // Update app language (static on EveManager; no Instance required)
SMT.EVEData.EveManager.CurrentLanguage = langCode;
+ if (MapConf != null)
+ MapConf.Language = langCode;
+
+ // Refresh ZKB ship type display for current language
+ foreach (var item in EVEData.EveManager.Instance.ZKillFeed.KillStream)
+ {
+ item.RefreshShipTypeDisplay();
+ }
+
// Redraw maps so labels use the new language
if (MainWindow.AppWindow != null)
{
diff --git a/SMT/Properties/Settings.Designer.cs b/SMT/Properties/Settings.Designer.cs
index 27145e12..f62fa891 100644
--- a/SMT/Properties/Settings.Designer.cs
+++ b/SMT/Properties/Settings.Designer.cs
@@ -46,5 +46,17 @@ public string OverlayWindow_placement {
this["OverlayWindow_placement"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string ZKBMonitorWindow_placement {
+ get {
+ return ((string)(this["ZKBMonitorWindow_placement"]));
+ }
+ set {
+ this["ZKBMonitorWindow_placement"] = value;
+ }
+ }
}
}
diff --git a/SMT/Properties/Settings.settings b/SMT/Properties/Settings.settings
index c7ce495f..cd62c7b5 100644
--- a/SMT/Properties/Settings.settings
+++ b/SMT/Properties/Settings.settings
@@ -8,5 +8,8 @@
+
+
+
\ No newline at end of file
diff --git a/SMT/ZKBMonitor.xaml b/SMT/ZKBMonitor.xaml
new file mode 100644
index 00000000..651be3e1
--- /dev/null
+++ b/SMT/ZKBMonitor.xaml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SMT/ZKBMonitor.xaml.cs b/SMT/ZKBMonitor.xaml.cs
new file mode 100644
index 00000000..091805ed
--- /dev/null
+++ b/SMT/ZKBMonitor.xaml.cs
@@ -0,0 +1,149 @@
+using System;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Input;
+using System.Windows.Interop;
+
+namespace SMT
+{
+ public partial class ZKBMonitor : Window
+ {
+ private MainWindow mainWindow;
+ private bool filterByRegion = true;
+ private int maxKills = 50;
+
+ public ZKBMonitor(MainWindow mw)
+ {
+ InitializeComponent();
+
+ mainWindow = mw;
+ if (mainWindow == null) return;
+
+ ZKBKillList.ItemsSource = mainWindow.EVEManager.ZKillFeed.KillStream;
+
+ CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(ZKBKillList.ItemsSource);
+ view.Filter = item => ZKillFilter(item);
+
+ filterByRegion = mw.MapConf.ZKBFloatFilterByRegion;
+ maxKills = mw.MapConf.ZKBFloatMaxKills;
+
+ this.Background.Opacity = mw.MapConf.ZKBFloatBackgroundOpacity;
+ ZKBKillList.Opacity = mw.MapConf.ZKBFloatContentOpacity;
+
+ mainWindow.EVEManager.ZKillFeed.KillsAddedEvent += OnKillsAdded;
+ mw.MapConf.PropertyChanged += MapConf_PropertyChanged;
+
+ Closing += ZKBMonitor_Closing;
+ }
+
+ protected override void OnSourceInitialized(EventArgs e)
+ {
+ base.OnInitialized(e);
+ LoadWindowPosition();
+ }
+
+ private void LoadWindowPosition()
+ {
+ string placement = Properties.Settings.Default.ZKBMonitorWindow_placement;
+ if (!string.IsNullOrEmpty(placement))
+ {
+ WindowPlacement.SetPlacement(new WindowInteropHelper(this).Handle, placement);
+ }
+ }
+
+ private void StoreWindowPosition()
+ {
+ Properties.Settings.Default.ZKBMonitorWindow_placement =
+ WindowPlacement.GetPlacement(new WindowInteropHelper(this).Handle);
+ Properties.Settings.Default.Save();
+ }
+
+ private void ZKBMonitor_Closing(object sender, CancelEventArgs e)
+ {
+ StoreWindowPosition();
+ mainWindow.EVEManager.ZKillFeed.KillsAddedEvent -= OnKillsAdded;
+ mainWindow.MapConf.PropertyChanged -= MapConf_PropertyChanged;
+ mainWindow.MapConf.ZKBFloatWindowOpen = false;
+ }
+
+ private void ZKBMonitor_Window_Move(object sender, MouseButtonEventArgs e)
+ {
+ if (e.ChangedButton == MouseButton.Left)
+ {
+ this.ResizeMode = ResizeMode.NoResize;
+ this.DragMove();
+ this.ResizeMode = ResizeMode.CanResizeWithGrip;
+ }
+ e.Handled = true;
+ }
+
+ private void ZKBMonitor_Window_Close(object sender, MouseButtonEventArgs e)
+ {
+ this.Close();
+ }
+
+ private void ContextMenu_ShowSystem_Click(object sender, RoutedEventArgs e)
+ {
+ dynamic zs = ZKBKillList.SelectedItem;
+ if (zs != null)
+ {
+ mainWindow.RegionUC.SelectSystem(zs.SystemName, true);
+ }
+ }
+
+ private void ContextMenu_OpenZKB_Click(object sender, RoutedEventArgs e)
+ {
+ dynamic zs = ZKBKillList.SelectedItem;
+ if (zs != null)
+ {
+ string url = "https://zkillboard.com/kill/" + zs.KillID + "/";
+ System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(url) { UseShellExecute = true });
+ }
+ }
+
+ private void ZKBKillList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
+ {
+ dynamic zs = ZKBKillList.SelectedItem;
+ if (zs != null)
+ {
+ string url = "https://zkillboard.com/kill/" + zs.KillID + "/";
+ System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(url) { UseShellExecute = true });
+ }
+ }
+
+ private void OnKillsAdded()
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ CollectionViewSource.GetDefaultView(ZKBKillList.ItemsSource)?.Refresh();
+ });
+ }
+
+ private bool ZKillFilter(object item)
+ {
+ if (!filterByRegion) return true;
+ dynamic zs = item;
+ if (zs != null)
+ {
+ return mainWindow.RegionUC?.Region?.IsSystemOnMap(zs.SystemName) ?? false;
+ }
+ return false;
+ }
+
+ private void MapConf_PropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == "ZKBFloatBackgroundOpacity")
+ this.Background.Opacity = mainWindow.MapConf.ZKBFloatBackgroundOpacity;
+ if (e.PropertyName == "ZKBFloatContentOpacity")
+ ZKBKillList.Opacity = mainWindow.MapConf.ZKBFloatContentOpacity;
+ if (e.PropertyName == "ZKBFloatFilterByRegion")
+ {
+ filterByRegion = mainWindow.MapConf.ZKBFloatFilterByRegion;
+ CollectionViewSource.GetDefaultView(ZKBKillList.ItemsSource)?.Refresh();
+ }
+ if (e.PropertyName == "ZKBFloatMaxKills")
+ maxKills = mainWindow.MapConf.ZKBFloatMaxKills;
+ }
+ }
+}
diff --git a/build-release.ps1 b/build-release.ps1
new file mode 100644
index 00000000..05566871
--- /dev/null
+++ b/build-release.ps1
@@ -0,0 +1,48 @@
+param(
+ [string]$OutputDir = "Release"
+)
+
+$ErrorActionPreference = "Stop"
+$PublishDir = "publish-single"
+
+Write-Host "=== 1. Clean ===" -ForegroundColor Cyan
+dotnet clean SMT.sln -c Release -p:Platform=x64 2>&1 | Out-Null
+if (Test-Path $PublishDir) { Remove-Item -Recurse -Force $PublishDir }
+
+Write-Host "=== 2. Publish single-file ===" -ForegroundColor Cyan
+dotnet publish SMT/SMT.csproj -c Release -p:Platform=x64 `
+ -p:PublishSingleFile=true `
+ -p:SelfContained=false `
+ -p:IncludeNativeLibrariesForSelfExtract=true `
+ -o $PublishDir
+if ($LASTEXITCODE -ne 0) { throw "Publish failed" }
+
+Write-Host "=== 3. Prepare output dir ===" -ForegroundColor Cyan
+if (Test-Path $OutputDir) { Remove-Item -Recurse -Force $OutputDir }
+New-Item -ItemType Directory -Path "$OutputDir/data" -Force | Out-Null
+New-Item -ItemType Directory -Path "$OutputDir/sounds" -Force | Out-Null
+
+Write-Host "=== 4. Copy files ===" -ForegroundColor Cyan
+Copy-Item "$PublishDir/*.exe" "$OutputDir/"
+Copy-Item "$PublishDir/*.pdb" "$OutputDir/"
+Copy-Item "EVEData/data/*" "$OutputDir/data/" -Exclude "SourceMaps"
+Copy-Item "SMT/Sounds/*" "$OutputDir/sounds/"
+Copy-Item "SMT/DefaultWindowLayout.dat" "$OutputDir/"
+
+# Cleanup publish temp dir
+Remove-Item -Recurse -Force $PublishDir
+
+Write-Host ""
+Write-Host "=== Done ===" -ForegroundColor Green
+$outFull = (Get-Item $OutputDir).FullName
+Write-Host "Output: $outFull"
+Write-Host ""
+
+Get-ChildItem $OutputDir -File | ForEach-Object {
+ $kb = "{0,8:N0} KB" -f ($_.Length / 1KB)
+ Write-Host " $($_.Name) $kb"
+}
+Get-ChildItem $OutputDir -Directory | ForEach-Object {
+ $cnt = (Get-ChildItem $_.FullName -Recurse -File).Count
+ Write-Host " $($_.Name)/ ($cnt files)"
+}