public override bool MoveStep() { if (Program.NrPlayers == 1) return base.MoveStep(); else if (this.playerNr == 1) { int X = this.x; int Y = this.y; bool Result = base.MoveStep(); if (this.x != X || this.y != Y || Result) { BinaryOutput Output = new BinaryOutput(); Output.WriteByte(8); Output.WriteInt(this.x); Output.WriteInt(this.y); Output.WriteInt(this.vx); Output.WriteInt(this.vy); Output.WriteBool(Result); Program.MPE.SendUdpToAll(Output.GetPacket(), 3); } return Result; } else return false; }
public override void AfterMove() { Color DestPixel = RetroApplication.Raster[this.x, this.y]; if (DestPixel.ToArgb() != Color.Black.ToArgb()) { if (DestPixel.R == 255 && DestPixel.B == 0) { RetroApplication.FillFlood(this.x, this.y, Color.Black); if (this.playerNr == 1) { BinaryOutput Output = new BinaryOutput(); int Gift = RetroApplication.Random(0, 31); Output.WriteByte(7); Output.WriteInt(Gift); this.GetGift(1, Gift, Output, null); if (Program.NrPlayers > 1) Program.MPE.SendUdpToAll(Output.GetPacket(), 3); } } else if (!this.immortal) { this.Die(); return; } } if (!this.invisible || this.playerNr == 2) RetroApplication.Raster[this.x, this.y] = this.headColor; if (this.immortal) { int SecondsLeft = 10 - (int)(DateTime.Now - this.immortalStart).TotalSeconds; if (SecondsLeft != this.immortalSecondsLeft) { if (SecondsLeft < 0) { this.immortal = false; Program.PlayerMsg(this.playerNr, string.Empty); } else { this.immortalSecondsLeft = SecondsLeft; Program.PlayerMsg(this.playerNr, "Immortal " + SecondsLeft.ToString()); } } } }
public static void Main(string[] args) { Initialize(); try { DateTime Start = DateTime.Now; Guid PlayerId = Guid.NewGuid(); string Name; Console.Out.WriteLine("Hello. What is your name?"); Name = Console.ReadLine(); using (MultiPlayerEnvironment MPE = new MultiPlayerEnvironment("MultiPlayerSetup", true, "iot.eclipse.org", 1883, false, string.Empty, string.Empty, "RetroSharp/Examples/Networking/MultiPlayerSetup", 5, PlayerId, new KeyValuePair<string, string>("NAME", Name))) { MPE.OnStateChange += (sender, newstate) => Console.Out.WriteLine(newstate.ToString()); MPE.OnPlayerAvailable += (sender, player) => { Console.Out.WriteLine("New player available: " + player["NAME"]); if (sender.PlayerCount >= 5 || (DateTime.Now - Start).TotalSeconds >= 20) MPE.ConnectPlayers(); }; MPE.OnPlayerConnected += (sender, player) => Console.Out.WriteLine("Player connected: " + player["NAME"]); MPE.OnGameDataReceived += (sender, e) => Console.Out.WriteLine(e.FromPlayer["NAME"] + ": " + e.Data.ReadString()); MPE.OnPlayerDisconnected += (sender, player) => Console.Out.WriteLine("Player disconnected: " + player["NAME"]); if (!MPE.Wait(20000)) { if (MPE.State == MultiPlayerState.FindingPlayers) MPE.ConnectPlayers(); else throw new Exception("Unable to setup multi-player environment."); } Console.Out.WriteLine(MPE.PlayerCount.ToString() + " player(s) now connected."); Console.Out.WriteLine("Write anything and send it to the others."); Console.Out.WriteLine("An empty row will quit the application."); Console.Out.WriteLine(); string s = Console.In.ReadLine(); while (!string.IsNullOrEmpty(s)) { BinaryOutput Msg = new BinaryOutput(); Msg.WriteString(s); MPE.SendTcpToAll(Msg.GetPacket()); s = Console.In.ReadLine(); } } } catch (Exception ex) { Console.Out.WriteLine(ex.Message); Console.In.ReadLine(); } Terminate(); }
public void GetGift(int PlayerIndex, int GiftIndex, BinaryOutput Output, BinaryInput Input) { switch (GiftIndex) { case 0: this.framesPerPixel = 4; this.stepsPerFrame = 1; Program.PlayerMsg(this.playerNr, "Slow speed"); break; case 1: this.framesPerPixel = 5; this.stepsPerFrame = 1; Program.PlayerMsg(this.playerNr, "Slower speed"); break; case 2: this.framesPerPixel = 6; this.stepsPerFrame = 1; Program.PlayerMsg(this.playerNr, "Slowest speed"); break; case 3: this.framesPerPixel = 2; this.stepsPerFrame = 1; Program.PlayerMsg(this.playerNr, "Fast speed"); break; case 4: this.framesPerPixel = 1; this.stepsPerFrame = 1; Program.PlayerMsg(this.playerNr, "Faster speed"); break; case 5: this.framesPerPixel = 1; this.stepsPerFrame = 2; if (this.shotSpeed < 2) this.shotSpeed = 2; Program.PlayerMsg(this.playerNr, "Fastest speed"); break; case 6: this.framesPerPixel = 3; this.stepsPerFrame = 1; Program.PlayerMsg(this.playerNr, "Normal speed"); break; case 7: this.shotPower = 5; Program.PlayerMsg(this.playerNr, "Tiny bullets"); break; case 8: this.shotPower = 10; Program.PlayerMsg(this.playerNr, "Small bullets"); break; case 9: this.shotPower = 15; Program.PlayerMsg(this.playerNr, "Normal bullets"); break; case 10: this.shotPower = 20; Program.PlayerMsg(this.playerNr, "Large bullets"); break; case 11: this.shotPower = 25; Program.PlayerMsg(this.playerNr, "Huge bullets"); break; case 12: this.shotPower = 30; Program.PlayerMsg(this.playerNr, "Humongous bullets"); break; case 13: this.shotPower = 50; Program.PlayerMsg(this.playerNr, "Peace-maker bullets"); break; case 14: this.tail = false; Program.PlayerMsg(this.playerNr, "No tail"); break; case 15: this.tail = true; Program.PlayerMsg(this.playerNr, "Tail"); break; case 16: this.shotSpeed = Math.Max(1, this.stepsPerFrame); Program.PlayerMsg(this.playerNr, "Slow bullets"); break; case 17: this.shotSpeed = Math.Max(2, this.stepsPerFrame); Program.PlayerMsg(this.playerNr, "Fast bullets"); break; case 18: this.shotSpeed = Math.Max(3, this.stepsPerFrame); Program.PlayerMsg(this.playerNr, "Faster bullets"); break; case 19: this.shotSpeed = Math.Max(4, this.stepsPerFrame); Program.PlayerMsg(this.playerNr, "Fastest bullets"); break; case 20: int X, Y; int dx, dy; bool Ok; int TriesLeft = 100; int Black = Color.Black.ToArgb(); if (Input != null) { this.x = 319 - (int)Input.ReadInt(); this.y = 207 - (int)Input.ReadInt(); } else { Ok = false; while (TriesLeft-- > 0 && !Ok) { X = RetroApplication.Random(30, 290); Y = RetroApplication.Random(38, 170); Ok = true; for (dy = -5; dy < 5; dy++) { for (dx = -5; dx < 5; dx++) { if (RetroApplication.Raster[X + dx, Y + dy].ToArgb() != Black) { Ok = false; dy = 5; break; } } } if (Ok) { Output.WriteInt(X); Output.WriteInt(Y); this.x = X; this.y = Y; } } if (!Ok && Output != null) { Output.WriteInt(this.x); Output.WriteInt(this.y); } } Program.PlayerMsg(this.playerNr, "Teleport"); break; case 21: this.gun = Gun.WurstScheibe; Program.PlayerMsg(this.playerNr, "Wurst scheibe"); break; case 22: this.gun = Gun.Homing; Program.PlayerMsg(this.playerNr, "Homing Missile"); break; case 23: this.shotPower = 15; this.shotSpeed = 1; this.tail = true; this.gun = Gun.Normal; this.invisible = false; this.immortal = false; this.wrappingShots = false; this.wrap = true; this.opponent.wrap = true; Program.BorderColor = Color.FromKnownColor(KnownColor.DimGray); Program.PlayerMsg(this.playerNr, "Reset"); break; case 24: int X1, Y1, X2, Y2; bool Inside; if (Input != null) { X2 = 319 - (int)Input.ReadInt(); Y2 = 207 - (int)Input.ReadInt(); X1 = 319 - (int)Input.ReadInt(); Y1 = 207 - (int)Input.ReadInt(); } else { do { X1 = RetroApplication.Random(30, 290); X2 = RetroApplication.Random(30, 290); Y1 = RetroApplication.Random(38, 170); Y2 = RetroApplication.Random(38, 170); if (X2 < X1) { X = X1; X1 = X2; X2 = X; } if (Y2 < Y1) { Y = Y1; Y1 = Y2; Y2 = Y; } Inside = (this.x >= X1 - 20 && this.x <= X2 + 20 && this.y >= Y1 - 20 && this.y <= Y2 + 20) || (this.opponent.x >= X1 - 20 && this.opponent.x <= X2 + 20 && this.opponent.y >= Y1 - 20 && this.opponent.y <= Y2 + 20); } while (Inside || Math.Abs(X1 - X2) < 20 || Math.Abs(Y1 - Y2) < 20); if (Output != null) { Output.WriteInt(X1); Output.WriteInt(Y1); Output.WriteInt(X2); Output.WriteInt(Y2); } } RetroApplication.FillRoundedRectangle(X1, Y1, X2, Y2, 8, 8, (x, y, DestinationColor) => { int i = ((x - X1) + (y - Y1)) % 6; if (i < 3) return Color.Cyan; else return RetroApplication.Blend(Color.Cyan, DestinationColor, 0.5); }); RetroApplication.DrawRoundedRectangle(X1, Y1, X2, Y2, 8, 8, Color.Cyan); Program.PlayerMsg(this.playerNr, "Obstacle"); break; case 25: this.invisible = true; Program.PlayerMsg(this.playerNr, "Invisibility"); break; case 26: this.gun = Gun.BouncingBalls; Program.PlayerMsg(this.playerNr, "Bouncing balls"); break; case 27: this.shotPower = 200; Program.PlayerMsg(this.playerNr, "Atomic Bomb"); break; case 28: this.immortalStart = DateTime.Now; this.immortal = true; this.immortalSecondsLeft = 10; Program.PlayerMsg(this.playerNr, "Immortal 10"); break; case 29: this.wrappingShots = true; Program.PlayerMsg(this.playerNr, "Wrapping shots"); break; case 30: this.wrap = false; this.opponent.wrap = false; Program.BorderColor = Color.FromArgb(40, 40, 40); Program.PlayerMsg(this.playerNr, "Lock Border"); break; case 31: this.wrap = true; this.opponent.wrap = true; Program.BorderColor = Color.FromKnownColor(KnownColor.DimGray); Program.PlayerMsg(this.playerNr, "Open Border"); break; } }
public static void Main(string[] args) { Initialize(); Console.Out.Write("Host Name (default iot.eclipse.org): "); string Host = Console.In.ReadLine(); if (string.IsNullOrEmpty(Host)) { Console.Out.WriteLine("Using iot.eclipse.org."); Host = "iot.eclipse.org"; } Console.Out.WriteLine(); Console.Out.Write("Port Number (default 1883): "); string s = Console.In.ReadLine(); int Port; if (string.IsNullOrEmpty(s)) { Console.Out.WriteLine("Using port 1883."); Port = 1883; } else Port = int.Parse(s); Console.Out.WriteLine(); BinaryOutput Payload; int PacketsLeft = NrTestsPerQoS; using (MqttConnection MqttConnection = ConnectToMqttServer("iot.eclipse.org", Port, string.Empty, string.Empty)) { WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen); MqttConnection.TrustServer = true; MqttConnection.OnConnectionError += (sender, ex) => { WriteLine("Unable to connect:", C64Colors.Red); }; MqttConnection.OnError += (sender, ex) => { WriteLine(ex.Message, C64Colors.Red); }; MqttConnection.OnContentReceived += (sender, Content) => { string ClientId = Content.DataInput.ReadString(); if (ClientId == sender.ClientId) { DateTime TP = Content.DataInput.ReadDateTime(); MqttQualityOfService QoS = (MqttQualityOfService)Content.DataInput.ReadByte(); Console.Out.WriteLine("Latency: " + (DateTime.Now - TP).TotalMilliseconds + " ms (" + QoS.ToString() + ")"); bool Resend; if (--PacketsLeft > 0) Resend = true; else if (QoS < MqttQualityOfService.ExactlyOne) { QoS = (MqttQualityOfService)((int)QoS + 1); PacketsLeft = NrTestsPerQoS; Resend = true; } else Resend = false; if (Resend) { Payload = new BinaryOutput(); Payload.WriteString(MqttConnection.ClientId); Payload.WriteDateTime(DateTime.Now); Payload.WriteByte((byte)QoS); MqttConnection.PUBLISH("RetroSharp/Examples/Networking/Latency", QoS, false, Payload); } else Console.Out.WriteLine("Press ENTER to continue."); } }; MqttConnection.OnStateChanged += (sender, state) => { WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen); if (state == MqttState.Connected) { MqttConnection.SUBSCRIBE("RetroSharp/Examples/Networking/Latency"); Payload = new BinaryOutput(); Payload.WriteString(MqttConnection.ClientId); Payload.WriteDateTime(DateTime.Now); Payload.WriteByte((byte)MqttQualityOfService.AtMostOne); MqttConnection.PUBLISH("RetroSharp/Examples/Networking/Latency", MqttQualityOfService.AtMostOne, false, Payload); } }; Console.In.ReadLine(); } Terminate(); }
public static void Main(string[] args) { ManualResetEvent Terminated = new ManualResetEvent(false); Initialize(); Console.Out.WriteLine("Move the mouse to move the pointer on the screen."); Console.Out.WriteLine("Press left mouse button while moving to draw."); Console.Out.WriteLine("Press the ESC key to close the application."); Console.Out.WriteLine("You will be able to see what others draw as well."); OnKeyDown += (sender, e) => { if (e.Key == Key.Escape || (e.Key == Key.C && e.Control)) Terminated.Set(); }; FillRectangle(0, 0, ScreenWidth, ScreenHeight, C64Colors.Blue); int PointerTexture = AddSpriteTexture(GetResourceBitmap("Pointer.png"), System.Drawing.Color.FromArgb(0, 0, 255), true); Point P = GetMousePointer(); Point LastP = P; Sprite Pointer = CreateSprite(P.X, P.Y, PointerTexture); Random Rnd = new System.Random(); int R = Rnd.Next(128, 255); int G = Rnd.Next(128, 255); int B = Rnd.Next(128, 255); Color Color = Color.FromArgb(R, G, B); bool Draw = false; BinaryOutput Payload; using (MqttConnection MqttConnection = ConnectToMqttServer("iot.eclipse.org", false, string.Empty, string.Empty)) { WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen); MqttConnection.TrustServer = true; MqttConnection.OnConnectionError += (sender, ex) => { WriteLine("Unable to connect:", C64Colors.Red); }; MqttConnection.OnError += (sender, ex) => { WriteLine(ex.Message, C64Colors.Red); }; MqttConnection.OnStateChanged += (sender, state) => { WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen); if (state == MqttState.Connected) MqttConnection.SUBSCRIBE("RetroSharp/Examples/Networking/MultiUserDraw"); }; OnMouseMove += (sender, e) => { P = e.Position; Pointer.SetPosition(P); int DX = P.X - RasterWidth / 2; int DY = P.Y - RasterHeight / 2; Pointer.Angle = 90 + 22.5 + System.Math.Atan2(DY, DX) * 180 / System.Math.PI; if (Draw) { Payload = new BinaryOutput(); Payload.WriteString(MqttConnection.ClientId); Payload.WriteInt(LastP.X); Payload.WriteInt(LastP.Y); Payload.WriteInt(P.X); Payload.WriteInt(P.Y); Payload.WriteColor(Color); MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserDraw", MqttQualityOfService.AtMostOne, false, Payload); DrawLine(LastP.X, LastP.Y, P.X, P.Y, Color); } LastP = P; }; OnMouseDown += (sender, e) => { Draw = e.LeftButton; }; OnMouseUp += (sender, e) => { Draw = e.LeftButton; }; MqttConnection.OnContentReceived += (sender, Content) => { BinaryInput Input = Content.DataInput; string ClientId = Input.ReadString(); if (ClientId != MqttConnection.ClientId) { int X1 = (int)Input.ReadInt(); int Y1 = (int)Input.ReadInt(); int X2 = (int)Input.ReadInt(); int Y2 = (int)Input.ReadInt(); Color cl = Input.ReadColor(); DrawLine(X1, Y1, X2, Y2, cl); } }; while (!Terminated.WaitOne(1000)) ; } Terminate(); }
private void Connection_OnReceived(object Sender, byte[] Packet) { PeerConnection Connection = (PeerConnection)Sender; Guid PlayerId; IPAddress PlayerRemoteAddress; IPEndPoint PlayerRemoteEndpoint; try { BinaryInput Input = new BinaryInput(Packet); PlayerId = Input.ReadGuid(); PlayerRemoteAddress = IPAddress.Parse(Input.ReadString()); PlayerRemoteEndpoint = new IPEndPoint(PlayerRemoteAddress, Input.ReadUInt16()); } catch (Exception) { Connection.Dispose(); return; } Player Player = (Player)Connection.StateObject; Player Player2; lock (this.remotePlayersByEndpoint) { if (!this.playersById.TryGetValue(PlayerId, out Player2) || Player2.PlayerId != Player.PlayerId) { Connection.Dispose(); return; } Player.Connection = Connection; } Connection.RemoteEndpoint = Player.GetExpectedEndpoint(this.p2pNetwork); Connection.OnReceived -= new BinaryEventHandler(Connection_OnReceived); Connection.OnReceived += new BinaryEventHandler(Peer_OnReceived); Connection.OnSent += new BinaryEventHandler(Connection_OnSent); BinaryOutput Output = new BinaryOutput(); Output.WriteGuid(this.localPlayer.PlayerId); Output.WriteString(this.ExternalAddress.ToString()); Output.WriteUInt16((ushort)this.ExternalEndpoint.Port); Connection.SendTcp(Output.GetPacket()); MultiPlayerEnvironmentPlayerInformationEventHandler h = this.OnPlayerConnected; if (!(h is null)) { try { h(this, Player); } catch (Exception ex) { Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace.ToString()); } } }
public static void Main(string[] args) { Initialize(); Guid PlayerId = Guid.NewGuid(); string Player1Name; string Player2Name; Console.Out.WriteLine("Welcome to Mask! (Worms/Tron)"); Console.Out.WriteLine(new string('-', 70)); Console.Out.WriteLine("You control the work using the cursor keys."); Console.Out.WriteLine("Fire, using SPACE."); Console.Out.WriteLine("If you die, press ENTER to restart the game."); Console.Out.WriteLine("You can chat during the game."); Console.Out.WriteLine("Remember to try to fetch the gifts. You do that by moving into them."); Console.Out.WriteLine(); Console.Out.WriteLine("Hello. What is your name?"); Player1Name = Player2Name = Console.ReadLine(); using (MPE = new MultiPlayerEnvironment("Mask", false, "iot.eclipse.org", 1883, false, string.Empty, string.Empty, "RetroSharp/Examples/Games/Mask", 2, PlayerId, new KeyValuePair<string, string>("NAME", Player1Name))) { MPE.OnStateChange += (sender, state) => { switch (state) { case MultiPlayerState.SearchingForGateway: Console.Out.WriteLine("Searching for Internet Gateway."); break; case MultiPlayerState.RegisteringApplicationInGateway: Console.Out.WriteLine("Registering game in gateway."); break; case MultiPlayerState.FindingPlayers: Console.Out.WriteLine("Waiting for another player to connect."); Console.Out.WriteLine("Press ESC to play in single player mode."); OnKeyDown += new KeyEventHandler(MPE_Wait_OnKeyDown); break; case MultiPlayerState.ConnectingPlayers: Console.Out.WriteLine("Connecting to players."); break; } }; MPE.OnPlayerAvailable += (sender, player) => { Console.Out.WriteLine("New player available: " + player["NAME"]); MPE.ConnectPlayers(); }; MPE.OnPlayerConnected += (sender, player) => { Player2Name = player["NAME"]; }; MPE.OnPlayerDisconnected += (sender, player) => { PlayerMsg(2, "Disconnected"); NrPlayers = 1; LocalMachineIsGameServer = true; }; if (MPE.Wait(int.MaxValue)) { NrPlayers = MPE.PlayerCount; LocalMachineIsGameServer = MPE.LocalPlayerIsFirst; } else { PlayerMsg(2, "Network error"); NrPlayers = 1; } OnKeyDown -= new KeyEventHandler(MPE_Wait_OnKeyDown); ManualResetEvent Done = new ManualResetEvent(false); LinkedList<Shot> Shots = new LinkedList<Shot>(); LinkedList<Explosion> Explosions = new LinkedList<Explosion>(); LinkedList<Present> Presents = new LinkedList<Present>(); LinkedList<PlayerPosition> Player2Positions = new LinkedList<PlayerPosition>(); Player Player1 = new Player(1, 20, 28, 1, 0, 3, Color.Green, Color.LightGreen, 15); Player Player2 = new Player(2, 299, 179, -1, 0, 3, Color.Blue, Color.LightBlue, 15); bool Player1Up = false; bool Player1Down = false; bool Player1Left = false; bool Player1Right = false; bool Player1Fire = false; bool Player2Up = false; bool Player2Down = false; bool Player2Left = false; bool Player2Right = false; bool Player2Fire = false; Player1.Opponent = Player2; Player2.Opponent = Player1; Clear(); FillRectangle(0, 0, 319, 7, Color.FromKnownColor(KnownColor.DimGray)); SetClipArea(0, 8, 319, 199); string s = Player1Name.Length <= 10 ? Player1Name : Player1Name.Substring(0, 10); Console.Out.Write(s); s = Player2Name.Length <= 10 ? Player2Name : Player2Name.Substring(0, 10); GotoXY(ConsoleWidth - s.Length, 0); Console.Out.Write(s); OnKeyDown += (sender, e) => { switch (e.Key) { case Key.Escape: if (MPE.State == MultiPlayerState.FindingPlayers) MPE.ConnectPlayers(); else Done.Set(); break; case Key.C: if (e.Control) Done.Set(); break; case Key.Up: if (!Player1.Dead && Player1.VY != 1) { Player1Up = true; if (NrPlayers == 1) { if (!Player2.Dead) Player2Down = true; } else MPE.SendUdpToAll(new byte[] { 0 }, 3); } break; case Key.Down: if (!Player1.Dead && Player1.VY != -1) { Player1Down = true; if (NrPlayers == 1) { if (!Player2.Dead) Player2Up = true; } else MPE.SendUdpToAll(new byte[] { 1 }, 3); } break; case Key.Left: if (!Player1.Dead && Player1.VX != 1) { Player1Left = true; if (NrPlayers == 1) { if (!Player2.Dead) Player2Right = true; } else MPE.SendUdpToAll(new byte[] { 2 }, 3); } break; case Key.Right: if (!Player1.Dead && Player1.VX != -1) { Player1Right = true; if (NrPlayers == 1) { if (!Player2.Dead) Player2Left = true; } else MPE.SendUdpToAll(new byte[] { 3 }, 3); } break; case Key.Space: if (!Player1.Dead) { Player1Fire = true; if (NrPlayers == 1) { if (!Player2.Dead) Player2Fire = true; } else MPE.SendUdpToAll(new byte[] { 4 }, 3); } break; case Key.Enter: if (Player1.Dead) { if (NrPlayers > 1) MPE.SendUdpToAll(new byte[] { 5 }, 3); else { lock (Player2Positions) { Player2Positions.Clear(); } Shots.Clear(); Explosions.Clear(); Presents.Clear(); Player1 = new Player(1, 20, 28, 1, 0, 3, Color.Green, Color.LightGreen, 15); Player2 = new Player(2, 299, 179, -1, 0, 3, Color.Blue, Color.LightBlue, 15); Player1Up = false; Player1Down = false; Player1Left = false; Player1Right = false; Player1Fire = false; Player1.Opponent = Player2; Player2.Opponent = Player1; FillRectangle(0, 8, 319, 199, Color.Black); PlayerMsg(1, string.Empty); PlayerMsg(2, string.Empty); } } break; } }; OnKeyPressed += (sender, e) => { ChatCharacter(1, e.Character); MPE.SendTcpToAll(new byte[] { 10, (byte)(e.Character >> 8), (byte)(e.Character) }); }; OnUpdateModel += (sender, e) => { if (LocalMachineIsGameServer && Random() < 0.005) { int x1, y1; do { x1 = Random(30, 285); y1 = Random(38, 165); } while (!Present.CanPlace(x1, y1, x1 + 5, y1 + 5)); Presents.AddLast(new Present(x1, y1, x1 + 5, y1 + 5)); if (NrPlayers > 1) { BinaryOutput Output = new BinaryOutput(); Output.WriteByte(6); Output.WriteInt(x1); Output.WriteInt(y1); MPE.SendUdpToAll(Output.GetPacket(), 3); } } LinkedListNode<Present> PresentObj, NextPresentObj; PresentObj = Presents.First; while (PresentObj != null) { NextPresentObj = PresentObj.Next; if (PresentObj.Value.Move()) Presents.Remove(PresentObj); PresentObj = NextPresentObj; } if (Player1Up) { Player1.Up(); Player1Up = false; } else if (Player1Down) { Player1.Down(); Player1Down = false; } else if (Player1Left) { Player1.Left(); Player1Left = false; } else if (Player1Right) { Player1.Right(); Player1Right = false; } if (Player2Up) { Player2.Up(); Player2Up = false; } else if (Player2Down) { Player2.Down(); Player2Down = false; } else if (Player2Left) { Player2.Left(); Player2Left = false; } else if (Player2Right) { Player2.Right(); Player2Right = false; } if (!Player1.Dead && Player1.Move()) Explosions.AddLast(new Explosion(Player1.X, Player1.Y, 30, Color.White)); if (!Player2.Dead) { if (NrPlayers == 1) { if (Player2.Move()) Explosions.AddLast(new Explosion(Player2.X, Player2.Y, 30, Color.White)); } else { lock (Player2Positions) { try { foreach (PlayerPosition P in Player2Positions) { Player2.BeforeMove(); Player2.SetPosition(P.X, P.Y, P.VX, P.VY); Player2.AfterMove(); if (P.Dead) { Player2.Die(); Explosions.AddLast(new Explosion(Player2.X, Player2.Y, 30, Color.White)); } } } finally { Player2Positions.Clear(); } } } } if (Player1Fire) { Player1.Fire(Shots); Player1Fire = false; } if (Player2Fire) { Player2.Fire(Shots); Player2Fire = false; } LinkedListNode<Shot> ShotObj, NextShotObj; ShotObj = Shots.First; while (ShotObj != null) { NextShotObj = ShotObj.Next; if (ShotObj.Value.Move()) { Shots.Remove(ShotObj); Explosions.AddLast(new Explosion(ShotObj.Value.X, ShotObj.Value.Y, ShotObj.Value.Power, Color.White)); } ShotObj = NextShotObj; } LinkedListNode<Explosion> ExplosionObj, NextExplosionObj; ExplosionObj = Explosions.First; while (ExplosionObj != null) { NextExplosionObj = ExplosionObj.Next; if (ExplosionObj.Value.Move()) Explosions.Remove(ExplosionObj); ExplosionObj = NextExplosionObj; } }; MPE.OnGameDataReceived += (sender, e) => { byte Command = e.Data.ReadByte(); switch (Command) { case 0: // Remote player presses UP if (!Player2.Dead) Player2Down = true; break; case 1: // Remote player presses DOWN if (!Player2.Dead) Player2Up = true; break; case 2: // Remote player presses LEFT if (!Player2.Dead) Player2Right = true; break; case 3: // Remote player presses RIGHT if (!Player2.Dead) Player2Left = true; break; case 4: // Remote player presses SPACE (Fire) if (!Player2.Dead) Player2Fire = true; break; case 5: // Remote player presses ENTER (Restart) case 9: // Acknowledgement of remote player presses ENTER (Restart) if (Command == 5) MPE.SendUdpToAll(new byte[] { 9 }, 3); lock (Player2Positions) { Player2Positions.Clear(); } Shots.Clear(); Explosions.Clear(); Presents.Clear(); Player1 = new Player(1, 20, 28, 1, 0, 3, Color.Green, Color.LightGreen, 15); Player2 = new Player(2, 299, 179, -1, 0, 3, Color.Blue, Color.LightBlue, 15); Player1Up = false; Player1Down = false; Player1Left = false; Player1Right = false; Player1Fire = false; Player1.Opponent = Player2; Player2.Opponent = Player1; FillRectangle(0, 8, 319, 199, Color.Black); PlayerMsg(1, string.Empty); PlayerMsg(2, string.Empty); BorderColor = Color.FromKnownColor(KnownColor.DimGray); break; case 6: // New Present int x1 = 315 - (int)e.Data.ReadInt(); int y1 = 203 - (int)e.Data.ReadInt(); Presents.AddLast(new Present(x1, y1, x1 + 5, y1 + 5)); break; case 7: // Gift x1 = (int)e.Data.ReadInt(); Player2.GetGift(2, x1, null, e.Data); break; case 8: // Move player 2 lock (Player2Positions) { Player2Positions.AddLast(new PlayerPosition(e.Data)); } break; case 10: // chat character char ch = (char)e.Data.ReadUInt16(); ChatCharacter(2, ch); break; } }; while (!Done.WaitOne(1000)) ; } Terminate(); }
/// <summary> /// Creates inter-player peer-to-peer connections between known players. /// </summary> public void ConnectPlayers() { if (this.state != MultiPlayerState.FindingPlayers) throw new Exception("The multiplayer environment is not in the state of finding players."); this.State = MultiPlayerState.ConnectingPlayers; int Index = 0; BinaryOutput Output = new BinaryOutput(); Output.WriteByte(1); Output.WriteString(this.applicationName); this.localPlayer.Index = Index++; this.Serialize(this.localPlayer, Output); #if LineListener Console.Out.Write("Tx: INTERCONNECT(" + this.localPlayer.ToString()); #endif lock (this.remotePlayersByEndpoint) { Output.WriteUInt((uint)this.remotePlayersByEndpoint.Count); foreach (Player Player in this.remotePlayersByEndpoint.Values) { Player.Index = Index++; this.Serialize(Player, Output); #if LineListener Console.Out.Write("," + Player.ToString()); #endif } } this.mqttTerminatedPacketIdentifier = this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output); this.mqttConnection.OnPublished += new PacketAcknowledgedEventHandler(mqttConnection_OnPublished); #if LineListener Console.Out.WriteLine(")"); #endif this.StartConnecting(); }
private void Connection_OnReceived(object Sender, byte[] Packet) { PeerConnection Connection = (PeerConnection)Sender; Guid PlayerId; IPAddress PlayerRemoteAddress; IPEndPoint PlayerRemoteEndpoint; try { BinaryInput Input = new BinaryInput(Packet); PlayerId = Input.ReadGuid(); PlayerRemoteAddress = IPAddress.Parse(Input.ReadString()); PlayerRemoteEndpoint = new IPEndPoint(PlayerRemoteAddress, Input.ReadUInt16()); } catch (Exception) { Connection.Dispose(); return; } Player Player = (Player)Connection.StateObject; Player Player2; lock (this.remotePlayersByEndpoint) { if (!this.playersById.TryGetValue(PlayerId, out Player2) || Player2.PlayerId != Player.PlayerId) { Connection.Dispose(); return; } Player.Connection = Connection; } Connection.RemoteEndpoint = Player.GetExpectedEndpoint(this.p2pNetwork); Connection.OnReceived -= new BinaryEventHandler(Connection_OnReceived); Connection.OnReceived += new BinaryEventHandler(Peer_OnReceived); Connection.OnSent += new BinaryEventHandler(Connection_OnSent); BinaryOutput Output = new BinaryOutput(); Output.WriteGuid(this.localPlayer.PlayerId); Output.WriteString(this.ExternalAddress.ToString()); Output.WriteUInt16((ushort)this.ExternalEndpoint.Port); Connection.SendTcp(Output.GetPacket()); MultiPlayerEnvironmentPlayerInformationEventHandler h = this.OnPlayerConnected; if (h != null) { try { h(this, Player); } catch (Exception ex) { Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace.ToString()); } } }
private void p2pNetwork_OnPeerConnected(PeerToPeerNetwork Listener, PeerConnection Peer) { IPEndPoint Endpoint = (IPEndPoint)Peer.Tcp.Client.RemoteEndPoint; #if LineListener Console.Out.WriteLine("Receiving connection from " + Endpoint.ToString()); #endif lock (this.remotePlayersByEndpoint) { if (!this.remotePlayerIPs.ContainsKey(Endpoint.Address)) { Peer.Dispose(); return; } } Peer.OnClosed += new EventHandler(Peer_OnClosed); Peer.OnReceived += new BinaryEventHandler(Peer_OnReceived); BinaryOutput Output = new BinaryOutput(); Output.WriteGuid(this.localPlayer.PlayerId); Output.WriteString(this.ExternalEndpoint.Address.ToString()); Output.WriteUInt16((ushort)this.ExternalEndpoint.Port); Peer.SendTcp(Output.GetPacket()); }
private void Serialize(Player Player, BinaryOutput Output) { Output.WriteString(Player.PublicEndpoint.Address.ToString()); Output.WriteUInt16((ushort)Player.PublicEndpoint.Port); Output.WriteString(Player.LocalEndpoint.Address.ToString()); Output.WriteUInt16((ushort)Player.LocalEndpoint.Port); Output.WriteGuid(Player.PlayerId); Output.WriteUInt((uint)Player.Count); foreach (KeyValuePair<string, string> P in Player) { Output.WriteString(P.Key); Output.WriteString(P.Value); } }
private void mqttConnection_OnStateChanged(MqttConnection Sender, MqttState NewState) { if (NewState == MqttState.Connected) { this.mqttConnection.SUBSCRIBE(this.mqttNegotiationTopic); BinaryOutput Output = new BinaryOutput(); Output.WriteByte(0); Output.WriteString(this.applicationName); this.localPlayer.SetEndpoints(this.p2pNetwork.ExternalEndpoint, this.p2pNetwork.LocalEndpoint); this.Serialize(this.localPlayer, Output); this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output); #if LineListener Console.Out.WriteLine("Tx: HELLO(" + this.localPlayer.ToString() + ")"); #endif } }
private void CloseMqtt() { if (this.mqttConnection != null) { if (this.mqttConnection.State == MqttState.Connected) { BinaryOutput Output = new BinaryOutput(); Output.WriteByte(2); Output.WriteString(this.applicationName); Output.WriteGuid(this.localPlayer.PlayerId); this.mqttTerminatedPacketIdentifier = this.mqttConnection.PUBLISH(this.mqttNegotiationTopic, MqttQualityOfService.AtLeastOne, false, Output); this.mqttConnection.OnPublished += new PacketAcknowledgedEventHandler(mqttConnection_OnPublished); #if LineListener Console.Out.WriteLine("Tx: BYE(" + this.localPlayer.ToString() + ")"); #endif } else { this.mqttConnection.Dispose(); this.mqttConnection = null; } } }
public static void Main(string[] args) { Initialize(); WriteLine("What is your name?", C64Colors.LightBlue); string Name = Console.In.ReadLine(); BinaryOutput Payload; WriteLine("Hello " + Name + ".", C64Colors.LightBlue); WriteLine("Strings entered below will be seen by everybody running the application.", C64Colors.LightBlue); WriteLine("Enter an empty string to close the application.", C64Colors.LightBlue); WriteLine(new string('-', ConsoleWidth), C64Colors.LightBlue); using (MqttConnection MqttConnection = ConnectToMqttServer("iot.eclipse.org", true, string.Empty, string.Empty)) { WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen); MqttConnection.TrustServer = true; MqttConnection.OnConnectionError += (sender, ex) => { WriteLine("Unable to connect:", C64Colors.Red); }; MqttConnection.OnError += (sender, ex) => { WriteLine(ex.Message, C64Colors.Red); }; MqttConnection.OnStateChanged += (sender, state) => { WriteLine("<" + MqttConnection.State.ToString() + ">", C64Colors.LightGreen); if (state == MqttState.Connected) { MqttConnection.SUBSCRIBE("RetroSharp/Examples/Networking/MultiUserChat"); Payload = new BinaryOutput(); Payload.WriteString(MqttConnection.ClientId); Payload.WriteString(Name); Payload.WriteByte(0); MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserChat", MqttQualityOfService.AtLeastOne, false, Payload); } }; MqttConnection.OnContentReceived += (sender, Content) => { string ClientId = Content.DataInput.ReadString(); if (ClientId != sender.ClientId) { string Author = Content.DataInput.ReadString(); byte Command = Content.DataInput.ReadByte(); switch (Command) { case 0: WriteLine("<" + Author + " enters the room.>", C64Colors.LightGreen); break; case 1: string Text = Content.DataInput.ReadString(); WriteLine(Author + ": " + Text, C64Colors.LightBlue); break; case 2: WriteLine("<" + Author + " left the room.>", C64Colors.LightGreen); break; } } }; while (true) { string s = Console.In.ReadLine(); if (string.IsNullOrEmpty(s)) break; Payload = new BinaryOutput(); Payload.WriteString(MqttConnection.ClientId); Payload.WriteString(Name); Payload.WriteByte(1); Payload.WriteString(s); MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserChat", MqttQualityOfService.AtLeastOne, false, Payload); } MqttConnection.UNSUBSCRIBE("RetroSharp/Examples/Networking/MultiUserChat"); int PacketIdentifier = 0; ManualResetEvent Terminated = new ManualResetEvent(false); MqttConnection.OnPublished += (sender, e) => { if (PacketIdentifier == e) Terminated.Set(); }; Payload = new BinaryOutput(); Payload.WriteString(MqttConnection.ClientId); Payload.WriteString(Name); Payload.WriteByte(2); PacketIdentifier = MqttConnection.PUBLISH("RetroSharp/Examples/Networking/MultiUserChat", MqttQualityOfService.AtLeastOne, false, Payload); Terminated.WaitOne(5000); } Terminate(); }