using System.Collections.Generic; using System.ComponentModel; using System.Net; namespace ET { public partial class StartSceneConfigCategory { public MultiMap Games = new MultiMap(); public MultiMap ProcessScenes = new MultiMap(); public Dictionary> ClientScenesByName = new Dictionary>(); public StartSceneConfig LocationConfig; public List Realms = new List(); public List Routers = new List(); public List Robots = new List(); public StartSceneConfig BenchmarkServer; public List GetByProcess(int process) { return this.ProcessScenes[process]; } public StartSceneConfig GetBySceneName(int zone, string name) { return this.ClientScenesByName[zone][name]; } public override void AfterEndInit() { foreach (StartSceneConfig startSceneConfig in this.GetAll().Values) { this.ProcessScenes.Add(startSceneConfig.Process, startSceneConfig); if (!this.ClientScenesByName.ContainsKey(startSceneConfig.Zone)) { this.ClientScenesByName.Add(startSceneConfig.Zone, new Dictionary()); } this.ClientScenesByName[startSceneConfig.Zone].Add(startSceneConfig.Name, startSceneConfig); switch (startSceneConfig.Type) { case SceneType.Realm: this.Realms.Add(startSceneConfig); break; case SceneType.Game: this.Games.Add(startSceneConfig.Zone, startSceneConfig); break; case SceneType.Location: this.LocationConfig = startSceneConfig; break; case SceneType.Robot: this.Robots.Add(startSceneConfig); break; case SceneType.Router: this.Routers.Add(startSceneConfig); break; case SceneType.BenchmarkServer: this.BenchmarkServer = 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; // 外网地址外网端口 public IPEndPoint OuterIPPort { get { if (this.outerIPPort == null) { this.outerIPPort = NetworkHelper.ToIPEndPoint($"{this.StartProcessConfig.OuterIP}:{this.OuterPort}"); } return this.outerIPPort; } } public override void AfterEndInit() { this.Type = EnumHelper.FromString(this.SceneType); InstanceIdStruct instanceIdStruct = new InstanceIdStruct(this.Process, (uint) this.Id); this.InstanceId = instanceIdStruct.ToLong(); } } }