using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Net; namespace ET { public partial class StartSceneConfigCategory { public MultiMap Gates = new MultiMap(); public MultiMap Maps = new MultiMap(); public Dictionary Realms = new Dictionary(); public MultiMap ProcessScenes = new MultiMap(); public Dictionary> ZoneScenesByName = new Dictionary>(); public Dictionary LocationConfigs = new Dictionary(); public StartSceneConfig AccountConfig; public StartSceneConfig LoginCenterConfig; public StartSceneConfig NoticeConfig; // public StartSceneConfig LogConfig; public StartSceneConfig HttpConfig; public StartSceneConfig OrderConfig; public StartSceneConfig QueueConfig; public List Robots = new List(); public List AllMaps = new List(); public MultiMap AllUnitCaches = new MultiMap(); // public Dictionary UnitCaches = new Dictionary(); public Dictionary Mails = new Dictionary(); //SceneType -> SceneName 只适用于只有一个服务在的场景 public Dictionary SingleSceneType2Name = new Dictionary(); public List GetByProcess(int process) { return this.ProcessScenes[process]; } public StartSceneConfig GetBySceneName(int zone, string name) { return this.ZoneScenesByName[zone][name]; } public StartSceneConfig GetUnitCacheConfig(long unitId) { int zone = UnitIdStruct.GetUnitZone(unitId); int n = unitId.GetHashCode() % AllUnitCaches[zone].Count; return this.AllUnitCaches[zone][n]; } public StartSceneConfig GetBySceneBySceneType(int zone, SceneType sceneType) { SingleSceneType2Name.TryGetValue(sceneType, out var name); return name == null ? null : ZoneScenesByName[zone][name]; } public List GetMapsByZone(int zone) { return this.Maps[zone]; } public List GetGatesByZone(int zone) { return this.Gates[zone]; } public override void AfterEndInit() { foreach (StartSceneConfig startSceneConfig in this.GetAll().Values) { this.ProcessScenes.Add(startSceneConfig.Process, startSceneConfig); if (!this.ZoneScenesByName.ContainsKey(startSceneConfig.Zone)) { this.ZoneScenesByName.Add(startSceneConfig.Zone, new Dictionary()); } this.ZoneScenesByName[startSceneConfig.Zone].Add(startSceneConfig.Name, startSceneConfig); if (!SingleSceneType2Name.ContainsKey(startSceneConfig.Type)) { SingleSceneType2Name.Add(startSceneConfig.Type, startSceneConfig.Name); } switch (startSceneConfig.Type) { case SceneType.Account: this.AccountConfig = startSceneConfig; break; case SceneType.LoginCenter: this.LoginCenterConfig = startSceneConfig; break; case SceneType.Http: this.HttpConfig = startSceneConfig; break; case SceneType.Notice: this.NoticeConfig = startSceneConfig; break; // case SceneType.Log: // this.LogConfig = startSceneConfig; // break; case SceneType.Gate: this.Gates.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.Location: this.LocationConfigs.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.Realm: this.Realms.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.UnitCache: //this.UnitCaches.Add(startSceneConfig.Zone, startSceneConfig); this.AllUnitCaches.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.Robot: this.Robots.Add(startSceneConfig); break; case SceneType.Map: this.AllMaps.Add(startSceneConfig); this.Maps.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.Mail: this.Mails.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.Order: this.OrderConfig = startSceneConfig; break; case SceneType.Queue: this.QueueConfig = startSceneConfig; break; } } } } public partial class StartSceneConfig : ISupportInitialize { public long InstanceId; public SceneType Type; public StartProcessConfig StartProcessConfig { get { return StartProcessConfigCategory.Instance.Get(this.Process); } } public StartZoneConfig StartZoneConfig { get { return StartZoneConfigCategory.Instance.Get(this.Zone); } } // 内网地址外网端口,通过防火墙映射端口过来 private IPEndPoint innerIPOutPort; public IPEndPoint InnerIPOutPort { get { if (innerIPOutPort == null) { this.innerIPOutPort = NetworkHelper.ToIPEndPoint($"{this.StartProcessConfig.InnerIP}:{this.OuterPort}"); } return this.innerIPOutPort; } } private IPEndPoint outerIPPort; private IPEndPoint startIPPort; private string httpIPPort; // 外网地址外网端口 public IPEndPoint OuterIPPort { get { if (this.outerIPPort == null) { this.outerIPPort = NetworkHelper.ToIPEndPoint($"{this.StartProcessConfig.OuterIP}:{this.OuterPort}"); } return this.outerIPPort; } } // 起服 public IPEndPoint StartIPPort { get { if (this.startIPPort == null) { this.startIPPort = NetworkHelper.ToIPEndPoint($"0.0.0.0:{this.OuterPort}"); } return this.startIPPort; } } public string HttpIPPort { get { if (string.IsNullOrEmpty(this.httpIPPort)) { this.httpIPPort = $"http://*:{this.OuterPort}/"; } return this.httpIPPort; } } public override void BeginInit() { } public override void EndInit() { this.Type = EnumHelper.FromString(this.SceneType); InstanceIdStruct instanceIdStruct = new InstanceIdStruct(this.Process, (uint)this.Id); this.InstanceId = instanceIdStruct.ToLong(); } } }