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)" +}