using System.Collections.Generic; using System.ComponentModel; using System.Net; namespace ET { public partial class StartSceneConfigCategory { public MultiMap Gates = 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 List Robots = new List(); public List AllMaps = new List(); public Dictionary UnitCaches = new Dictionary(); public Dictionary Mails = 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); return UnitCaches[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); switch (startSceneConfig.Type) { case SceneType.Account: this.AccountConfig = startSceneConfig; break; case SceneType.LoginCenter: this.LoginCenterConfig = 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); break; case SceneType.Robot: this.Robots.Add(startSceneConfig); break; case SceneType.Map: this.AllMaps.Add(startSceneConfig); break; case SceneType.Mail: this.Mails.Add(startSceneConfig.Zone, 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(); } } }