using System.Net; using System.Net.Sockets; namespace ET.Server { public static class SceneFactory { public static async ETTask<Scene> CreateServerScene(Entity parent, long id, long instanceId, int zone, string name, SceneType sceneType, StartSceneConfig startSceneConfig = null) { await ETTask.CompletedTask; Scene scene = EntitySceneFactory.CreateScene(id, instanceId, zone, sceneType, name, parent); scene.AddComponent<MailBoxComponent, MailboxType>(MailboxType.UnOrderMessageDispatcher); switch (scene.SceneType) { case SceneType.Router: // 云服务器中,一般来说router要单独部署,不过大家经常放在一起,那么下面要修改 // startSceneConfig.OuterIPPort改成startSceneConfig.InnerIPOutPort // 然后云服务器防火墙把端口映射过来 scene.AddComponent<RouterComponent, IPEndPoint, string, NetworkProtocol>( startSceneConfig.InnerIPOutPort, startSceneConfig.StartProcessConfig.InnerIP, NetworkProtocol.TCP ); break; case SceneType.RouterManager: // 正式发布请用CDN代替RouterManager // 云服务器在防火墙那里做端口映射 scene.AddComponent<HttpComponent, string>($"http://+:{startSceneConfig.OuterPort}/"); break; case SceneType.Realm: scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP); scene.AddComponent<UserSessionComponent>(); break; case SceneType.Game: ConstGame.GameServerId = startSceneConfig.Id; ConstGame.GameServerUUID = System.Guid.NewGuid().ToString(); scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP); scene.AddComponent<GameTokenInfoComponent>(); scene.AddComponent<GamePlayerComponent>(); scene.AddComponent<GameMapComponent>(); // 抖音组件 scene.AddComponent<GameDouyinComponent>(); // 战斗服的Ice会话组件 scene.AddComponent<BattleIceAgentComponent>(); scene.AddComponent<ObjectWait>(); break; case SceneType.Location: scene.AddComponent<LocationComponent>(); break; case SceneType.Robot: scene.AddComponent<RobotManagerComponent>(); break; case SceneType.BenchmarkServer: scene.AddComponent<BenchmarkServerComponent>(); scene.AddComponent<NetServerComponent, IPEndPoint, NetworkProtocol>(startSceneConfig.InnerIPOutPort, NetworkProtocol.KCP); break; case SceneType.BenchmarkClient: scene.AddComponent<BenchmarkClientComponent>(); break; } return scene; } } }