public ConnectWorld( IKernel kernel, I2DRenderUtilities twodRenderUtilities, IAssetManagerProvider assetManagerProvider, IBackgroundCubeEntityFactory backgroundCubeEntityFactory, ISkin skin, IProfiler profiler, IPersistentStorage persistentStorage, bool startServer, IPAddress address, int port) : base(twodRenderUtilities, assetManagerProvider, backgroundCubeEntityFactory, skin) { this.m_2DRenderUtilities = twodRenderUtilities; this.m_PersistentStorage = persistentStorage; this.m_DefaultFont = assetManagerProvider.GetAssetManager().Get<FontAsset>("font.Default"); this.m_Address = address; this.m_Port = port; TychaiaClient client = null; byte[] initial = null; Action cleanup = () => { kernel.Unbind<INetworkAPI>(); kernel.Unbind<IClientNetworkAPI>(); if (client != null) { client.Close(); } this.TerminateExistingProcess(); }; if (startServer) { this.m_Actions = new Action[] { () => this.m_Message = "Closing old process...", () => this.TerminateExistingProcess(), () => this.m_Message = "Starting server...", () => this.StartServer(), () => this.m_Message = "Creating client...", () => client = new TychaiaClient(port + 2, port + 3), () => client.AttachProfiler(profiler), () => this.m_Message = "Connecting to server...", () => client.Connect(new DualIPEndPoint(address, port, port + 1)), () => this.m_Message = "Binding node to kernel...", () => kernel.Bind<INetworkAPI>().ToMethod(x => client), () => kernel.Bind<IClientNetworkAPI>().ToMethod(x => client), () => this.m_Message = "Joining game...", () => this.m_UniqueClientIdentifier = this.JoinGame(client), () => this.m_Message = "Retrieving initial game state...", () => initial = client.LoadInitialState(), () => this.m_Message = "Starting client...", () => this.m_PerformFinalAction = true }; } else { this.m_Actions = new Action[] { () => this.m_Message = "Creating client...", () => client = new TychaiaClient(port + 2, port + 3), () => client.AttachProfiler(profiler), () => this.m_Message = "Connecting to server...", () => client.Connect(new DualIPEndPoint(address, port, port + 1)), () => this.m_Message = "Binding node to kernel...", () => kernel.Bind<INetworkAPI>().ToMethod(x => client), () => kernel.Bind<IClientNetworkAPI>().ToMethod(x => client), () => this.m_Message = "Joining game...", () => this.m_UniqueClientIdentifier = this.JoinGame(client), () => this.m_Message = "Retrieving initial game state...", () => initial = client.LoadInitialState(), () => this.m_Message = "Starting client...", () => this.m_PerformFinalAction = true }; } this.m_FinalAction = () => this.TargetWorld = this.GameContext.CreateWorld<IWorldFactory>(x => x.CreateTychaiaGameWorld(this.m_UniqueClientIdentifier, cleanup)); var thread = new Thread(this.Run) { IsBackground = true }; thread.Start(); AppDomain.CurrentDomain.ProcessExit += (sender, e) => { if (this.m_Process != null) { try { this.m_Process.Kill(); this.m_Process = null; } catch (InvalidOperationException) { } } }; AppDomain.CurrentDomain.UnhandledException += (sender, e) => { if (this.m_Process != null) { try { this.m_Process.Kill(); this.m_Process = null; } catch (InvalidOperationException) { } } }; }
public int JoinGame(TychaiaClient client) { if (this.m_PersistentStorage.Settings.Name == null) { var random = new Random(); var playerID = "player " + random.Next(); this.m_PersistentStorage.Settings.Name = playerID; } var hasJoinedGame = false; var uniqueClientIdentifier = -1; Console.WriteLine("You are '" + this.m_PersistentStorage.Settings.Name + "'"); client.ListenForMessage( "join confirm", (mcx, s) => { Console.WriteLine("Informed by server we have joined!"); hasJoinedGame = true; uniqueClientIdentifier = BitConverter.ToInt32(s, 0); }); while (!hasJoinedGame) { client.SendMessage("join", Encoding.ASCII.GetBytes(this.m_PersistentStorage.Settings.Name)); client.Update(); Thread.Sleep(1000 / 30); } return uniqueClientIdentifier; }