public static byte[] CreateInitPacket(ulong tickId, int id, int i, int j) { var builder = new FlatBufferBuilder(1); Packet.StartDataVector(builder, 1); ObjectChange.CreateObjectChange(builder, id, ObjectType.Player, i, j); var dataOffset = builder.EndVector(); Packet.StartPacket(builder); Packet.AddTickId(builder, tickId); Packet.AddType(builder, SuperPvp.Core.Transport.PacketType.Initialize); Packet.AddData(builder, dataOffset); var packet = Packet.EndPacket(builder); builder.Finish(packet.Value); return(builder.SizedByteArray()); }
public static byte[] CreateCommandPacket(ulong tickId, ServerGameObject targetState) { var builder = new FlatBufferBuilder(1); Packet.StartDataVector(builder, 1); ObjectChange.CreateObjectChange(builder, targetState.Id, ObjectType.Player, targetState.Position.I, targetState.Position.J); var dataOffset = builder.EndVector(); Packet.StartPacket(builder); Packet.AddTickId(builder, tickId); Packet.AddType(builder, SuperPvp.Core.Transport.PacketType.Command); Packet.AddData(builder, dataOffset); var packet = Packet.EndPacket(builder); builder.Finish(packet.Value); return(builder.SizedByteArray()); }
public static byte[] CreateUpdatePacket(ulong tickId, List <ServerGameObject> changes) { var builder = new FlatBufferBuilder(1); Packet.StartDataVector(builder, changes.Count); foreach (var change in changes) { var type = change.Type == GameObjectType.Player ? ObjectType.Player : ObjectType.Drug; ObjectChange.CreateObjectChange(builder, change.Id, type, change.Position.I, change.Position.J); } var dataOffset = builder.EndVector(); Packet.StartPacket(builder); Packet.AddTickId(builder, tickId); Packet.AddType(builder, SuperPvp.Core.Transport.PacketType.Update); Packet.AddData(builder, dataOffset); var packet = Packet.EndPacket(builder); builder.Finish(packet.Value); return(builder.SizedByteArray()); }
public override void Update(GameTime gameTime) { KeyboardState state = Keyboard.GetState(); if (state.IsKeyDown(Keys.Escape) && !PreviousState.IsKeyDown(Keys.Escape)) { FXCollection.SoundEffects[SoundEffects.Select].Play(); AnglerGame.GamePaused = !AnglerGame.GamePaused; } if (!AnglerGame.GamePaused && state.IsKeyDown(Keys.Enter) && !PreviousState.IsKeyDown(Keys.Enter)) { if (AnglerGame.ShowChatPrompt) ChatBoxClosing(null, null); AnglerGame.ShowChatPrompt = !AnglerGame.ShowChatPrompt; } if (state.IsKeyDown(Keys.OemTilde) && !PreviousState.IsKeyDown(Keys.OemTilde)) { AnglerGame.ShowChatMessages = !AnglerGame.ShowChatMessages; if (RemoveTilde != null) RemoveTilde(); } Keys directionKey = Keys.E; // Start with some random key (this will change) if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.BackGraphicIndex) directionKey = Keys.Up; if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.FrontGraphicIndex) directionKey = Keys.Down; if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.RightGraphicIndex) directionKey = Keys.Right; if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.LeftGraphicIndex) directionKey = Keys.Left; if (allowMove) { // Enqueue a key in the recent key presses if it's been pressed foreach (Keys key in arrowKeys) { Direction d = (Direction)Enum.Parse(typeof(Direction), key.ToString()); int pos = 0; switch (d) { case Direction.Up: pos = World.MainPlayer.Y - 1; break; case Direction.Down: pos = World.MainPlayer.Y + 1; break; case Direction.Left: pos = World.MainPlayer.X - 1; break; case Direction.Right: pos = World.MainPlayer.X + 1; break; } if (state.IsKeyDown(key) && !AnglerGame.GamePaused && World.MainPlayer.NextMoves.Count < 2 && !World.MainPlayer.NextMoves.Contains(key) && !World.MainPlayer.PendingResponse && (key != directionKey || !World.MainPlayer.MovementBlocked) && World.MainPlayer.CheckPosition(d, pos)) { World.MainPlayer.NextMoves.Enqueue(key); break; } } } // Handle recently pressed keys // We can't send a response if we're already waiting for one or if the game is paused if (!World.MainPlayer.PendingResponse && // We can move if we're holding the same direction we're already going and our movement isn't blocked ((!World.MainPlayer.MovementBlocked && World.MainPlayer.NextMoves.Count > 0 && World.MainPlayer.NextMoves.Peek() == directionKey) // We can move if we're not already moving || (World.MainPlayer.OffsetX == 0 && World.MainPlayer.OffsetY == 0))) { Keys? key; int dist = World.MainPlayer.GetMove(World.CurrentMap, out key); bool move = true; if (key == Keys.Up && (World.CurrentMap.GetTile(World.MainPlayer.X, World.MainPlayer.Y - 1, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.BackGraphicIndex; } else if (key == Keys.Down && (World.CurrentMap.GetTile(World.MainPlayer.X, World.MainPlayer.Y + 1, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.FrontGraphicIndex; } else if (key == Keys.Right && (World.CurrentMap.GetTile(World.MainPlayer.X + 1, World.MainPlayer.Y, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.RightGraphicIndex; } else if (key == Keys.Left && (World.CurrentMap.GetTile(World.MainPlayer.X - 1, World.MainPlayer.Y, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.LeftGraphicIndex; } // Send walk command to server if (dist != 0 && key != null && move) World.MainPlayer.SendToServer(ServerAction.Walk, new WalkData((Direction)Enum.Parse(typeof(Direction), key.ToString()), dist)); if (World.MainPlayer.X == 30 && World.MainPlayer.Y == 0 && firstDialog == true) { XNAControls.XNADialog YouWinDialog = new XNAControls.XNADialog(Game, "You've successfully escaped the treacherous labyrinth of deep sea trenches!", "You win!"); firstDialog = false; Game.IsMouseVisible = true; allowMove = false; YouWinDialog.DialogClosing += (sender, args) => { firstDialog = true; Game.IsMouseVisible = false; Packet pack = new Packet(ServerAction.Warp); pack.AddData<byte>((byte)ServerAction.Warp); World.MainPlayer.SendData(pack); allowMove = true; }; } } PreviousState = state; base.Update(gameTime); }
public override void Update(GameTime gameTime) { KeyboardState state = Keyboard.GetState(); if (state.IsKeyDown(Keys.Escape) && !PreviousState.IsKeyDown(Keys.Escape)) { FXCollection.SoundEffects[SoundEffects.Select].Play(); AnglerGame.GamePaused = !AnglerGame.GamePaused; } if (!AnglerGame.GamePaused && state.IsKeyDown(Keys.Enter) && !PreviousState.IsKeyDown(Keys.Enter)) { if (AnglerGame.ShowChatPrompt) { ChatBoxClosing(null, null); } AnglerGame.ShowChatPrompt = !AnglerGame.ShowChatPrompt; } if (state.IsKeyDown(Keys.OemTilde) && !PreviousState.IsKeyDown(Keys.OemTilde)) { AnglerGame.ShowChatMessages = !AnglerGame.ShowChatMessages; if (RemoveTilde != null) { RemoveTilde(); } } Keys directionKey = Keys.E; // Start with some random key (this will change) if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.BackGraphicIndex) { directionKey = Keys.Up; } if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.FrontGraphicIndex) { directionKey = Keys.Down; } if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.RightGraphicIndex) { directionKey = Keys.Right; } if (World.MainPlayer.CurrentGraphicIndex == World.MainPlayer.LeftGraphicIndex) { directionKey = Keys.Left; } if (allowMove) { // Enqueue a key in the recent key presses if it's been pressed foreach (Keys key in arrowKeys) { Direction d = (Direction)Enum.Parse(typeof(Direction), key.ToString()); int pos = 0; switch (d) { case Direction.Up: pos = World.MainPlayer.Y - 1; break; case Direction.Down: pos = World.MainPlayer.Y + 1; break; case Direction.Left: pos = World.MainPlayer.X - 1; break; case Direction.Right: pos = World.MainPlayer.X + 1; break; } if (state.IsKeyDown(key) && !AnglerGame.GamePaused && World.MainPlayer.NextMoves.Count < 2 && !World.MainPlayer.NextMoves.Contains(key) && !World.MainPlayer.PendingResponse && (key != directionKey || !World.MainPlayer.MovementBlocked) && World.MainPlayer.CheckPosition(d, pos)) { World.MainPlayer.NextMoves.Enqueue(key); break; } } } // Handle recently pressed keys // We can't send a response if we're already waiting for one or if the game is paused if (!World.MainPlayer.PendingResponse && // We can move if we're holding the same direction we're already going and our movement isn't blocked ((!World.MainPlayer.MovementBlocked && World.MainPlayer.NextMoves.Count > 0 && World.MainPlayer.NextMoves.Peek() == directionKey) // We can move if we're not already moving || (World.MainPlayer.OffsetX == 0 && World.MainPlayer.OffsetY == 0))) { Keys?key; int dist = World.MainPlayer.GetMove(World.CurrentMap, out key); bool move = true; if (key == Keys.Up && (World.CurrentMap.GetTile(World.MainPlayer.X, World.MainPlayer.Y - 1, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.BackGraphicIndex; } else if (key == Keys.Down && (World.CurrentMap.GetTile(World.MainPlayer.X, World.MainPlayer.Y + 1, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.FrontGraphicIndex; } else if (key == Keys.Right && (World.CurrentMap.GetTile(World.MainPlayer.X + 1, World.MainPlayer.Y, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.RightGraphicIndex; } else if (key == Keys.Left && (World.CurrentMap.GetTile(World.MainPlayer.X - 1, World.MainPlayer.Y, LAYERS.Special) as SpecialTile).Type == SpecialTileSpec.WALL) { move = false; World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.LeftGraphicIndex; } // Send walk command to server if (dist != 0 && key != null && move) { World.MainPlayer.SendToServer(ServerAction.Walk, new WalkData((Direction)Enum.Parse(typeof(Direction), key.ToString()), dist)); } if (World.MainPlayer.X == 30 && World.MainPlayer.Y == 0 && firstDialog == true) { XNAControls.XNADialog YouWinDialog = new XNAControls.XNADialog(Game, "You've successfully escaped the treacherous labyrinth of deep sea trenches!", "You win!"); firstDialog = false; Game.IsMouseVisible = true; allowMove = false; YouWinDialog.CloseAction = (bool t) => { firstDialog = true; Game.IsMouseVisible = false; Packet pack = new Packet(ServerAction.Warp); pack.AddData <byte>((byte)ServerAction.Warp); World.MainPlayer.SendData(pack); allowMove = true; }; } } PreviousState = state; base.Update(gameTime); }