public void RefreshGrave(int player, int flag = 0x81fff, Player observer = null) { byte[] result = _duel.QueryFieldCard(player, CardLocation.Grave, flag, false); GamePacketWriter update = GamePacketFactory.Create(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Grave); update.Write(result); if (observer == null) { SendToAll(update); } else { observer.Send(update); } }
public void AddPlayer(Player player) { if (State != GameState.Lobby) { player.Type = (int)PlayerType.Observer; if (State != GameState.End) { SendJoinGame(player); player.SendTypeChange(); player.Send(GamePacketFactory.Create(StocMessage.DuelStart)); Observers.Add(player); if (State == GameState.Duel) { InitNewSpectator(player); } } if (OnPlayerJoin != null) { OnPlayerJoin(this, new PlayerEventArgs(player)); } return; } if (HostPlayer == null) { HostPlayer = player; } int pos = GetAvailablePlayerPos(); if (pos != -1) { BinaryWriter enter = GamePacketFactory.Create(StocMessage.HsPlayerEnter); enter.WriteUnicode(player.Name, 20); enter.Write((byte)pos); //padding enter.Write((byte)0); SendToAll(enter); Players[pos] = player; IsReady[pos] = false; player.Type = pos; } else { BinaryWriter watch = GamePacketFactory.Create(StocMessage.HsWatchChange); watch.Write((short)(Observers.Count + 1)); SendToAll(watch); player.Type = (int)PlayerType.Observer; Observers.Add(player); } SendJoinGame(player); player.SendTypeChange(); for (int i = 0; i < Players.Length; i++) { if (Players[i] != null) { BinaryWriter enter = GamePacketFactory.Create(StocMessage.HsPlayerEnter); enter.WriteUnicode(Players[i].Name, 20); enter.Write((byte)i); //padding enter.Write((byte)0); player.Send(enter); if (IsReady[i]) { BinaryWriter change = GamePacketFactory.Create(StocMessage.HsPlayerChange); change.Write((byte)((i << 4) + (int)PlayerChange.Ready)); player.Send(change); } } } if (Observers.Count > 0) { BinaryWriter nwatch = GamePacketFactory.Create(StocMessage.HsWatchChange); nwatch.Write((short)Observers.Count); player.Send(nwatch); } if (OnPlayerJoin != null) { OnPlayerJoin(this, new PlayerEventArgs(player)); } }
public void RefreshHand(int player, int flag = 0x181fff, Player observer = null) { byte[] result = _duel.QueryFieldCard(player, CardLocation.Hand, flag | 0x100000, false); GamePacketWriter update = GamePacketFactory.Create(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Hand); update.Write(result); if (observer == null) CurPlayers[player].Send(update); update = GamePacketFactory.Create(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Hand); MemoryStream ms = new MemoryStream(result); BinaryReader reader = new BinaryReader(ms); while (ms.Position < ms.Length) { int len = reader.ReadInt32(); if (len == 4) { update.Write(4); continue; } byte[] raw = reader.ReadBytes(len - 4); if (raw[len - 8] == 0) { update.Write(8); update.Write(0); } else { update.Write(len); update.Write(raw); } } if (observer == null) SendToAllBut(update, player); else observer.Send(update); }
public void RefreshGrave(int player, int flag = 0x81fff, Player observer = null) { byte[] result = _duel.QueryFieldCard(player, CardLocation.Grave, flag, false); GamePacketWriter update = GamePacketFactory.Create(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Grave); update.Write(result); if (observer == null) SendToAll(update); else observer.Send(update); }
public void SetReady(Player player, bool ready) { if (State != GameState.Lobby) return; if (player.Type == (int)PlayerType.Observer) return; if (IsReady[player.Type] == ready) return; if (ready) { int rule = Config.GetInt("Rule"); bool ocg = rule == 0 || rule == 2; bool tcg = rule == 1 || rule == 2; int result = 1; if (player.Deck != null) { result = Config.GetBool("NoCheckDeck") ? 0 : player.Deck.Check(Banlist, ocg, tcg); } if (result != 0) { GamePacketWriter rechange = new GamePacketWriter(StocMessage.HsPlayerChange); rechange.Write((byte)((player.Type << 4) + (int)(PlayerChange.NotReady))); player.Send(rechange); GamePacketWriter error = new GamePacketWriter(StocMessage.ErrorMsg); error.Write((byte)2); // ErrorMsg.DeckError // C++ padding: 1 byte + 3 bytes = 4 bytes for (int i = 0; i < 3; i++) error.Write((byte)0); error.Write(result); player.Send(error); return; } } IsReady[player.Type] = ready; GamePacketWriter change = new GamePacketWriter(StocMessage.HsPlayerChange); change.Write((byte)((player.Type << 4) + (int)(ready ? PlayerChange.Ready : PlayerChange.NotReady))); SendToAll(change); if (OnPlayerReady != null) { OnPlayerReady(this, new PlayerEventArgs(player)); } }
public void RefreshSpells(int player, int flag = 0x681fff, Player observer = null) { byte[] result = _duel.QueryFieldCard(player, CardLocation.SpellZone, flag, false); GamePacketWriter update = GamePacketFactory.Create(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.SpellZone); update.Write(result); if (observer == null) SendToTeam(update, player); update = GamePacketFactory.Create(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.SpellZone); MemoryStream ms = new MemoryStream(result); BinaryReader reader = new BinaryReader(ms); for (int i = 0; i < 8; i++) { int len = reader.ReadInt32(); if (len == 4) { update.Write(4); continue; } byte[] raw = reader.ReadBytes(len - 4); if ((raw[11] & (int)CardPosition.FaceDown) != 0) { update.Write(8); update.Write(0); } else { update.Write(len); update.Write(raw); } } if (observer == null) { SendToTeam(update, 1 - player); SendToObservers(update); } else { observer.Send(update); } }
private void InitNewSpectator(Player player) { GamePacketWriter packet = GamePacketFactory.Create(GameMessage.Start); packet.Write((byte)(_swapped ? 0x11 : 0x10)); packet.Write(LifePoints[0]); packet.Write(LifePoints[1]); packet.Write((short)0); // deck packet.Write((short)0); // extra packet.Write((short)0); // deck packet.Write((short)0); // extra player.Send(packet); GamePacketWriter turn = GamePacketFactory.Create(GameMessage.NewTurn); turn.Write((byte)0); player.Send(turn); if (CurrentPlayer == 1) { turn = GamePacketFactory.Create(GameMessage.NewTurn); turn.Write((byte)0); player.Send(turn); } GamePacketWriter reload = GamePacketFactory.Create(GameMessage.ReloadField); byte[] fieldInfo = _duel.QueryFieldInfo(); reload.Write(fieldInfo, 1, fieldInfo.Length - 1); player.Send(reload); RefreshAllObserver(player); }
public void AddPlayer(Player player) { if (State != GameState.Lobby) { player.Type = (int)PlayerType.Observer; if (State != GameState.End) { SendJoinGame(player); player.SendTypeChange(); player.Send(new GamePacketWriter(StocMessage.DuelStart)); Observers.Add(player); if (State == GameState.Duel) InitNewSpectator(player); } if (OnPlayerJoin != null) { OnPlayerJoin(this, new PlayerEventArgs(player)); } return; } if (HostPlayer == null) HostPlayer = player; int pos = GetAvailablePlayerPos(); if (pos != -1) { GamePacketWriter enter = new GamePacketWriter(StocMessage.HsPlayerEnter); enter.Write(player.Name, 20); enter.Write((byte)pos); //padding enter.Write((byte)0); SendToAll(enter); Players[pos] = player; IsReady[pos] = false; player.Type = pos; } else { GamePacketWriter watch = new GamePacketWriter(StocMessage.HsWatchChange); watch.Write((short)(Observers.Count + 1)); SendToAll(watch); player.Type = (int)PlayerType.Observer; Observers.Add(player); } SendJoinGame(player); player.SendTypeChange(); for (int i = 0; i < Players.Length; i++) { if (Players[i] != null) { GamePacketWriter enter = new GamePacketWriter(StocMessage.HsPlayerEnter); enter.Write(Players[i].Name, 20); enter.Write((byte)i); //padding enter.Write((byte)0); player.Send(enter); if (IsReady[i]) { GamePacketWriter change = new GamePacketWriter(StocMessage.HsPlayerChange); change.Write((byte)((i << 4) + (int)PlayerChange.Ready)); player.Send(change); } } } if (Observers.Count > 0) { GamePacketWriter nwatch = new GamePacketWriter(StocMessage.HsWatchChange); nwatch.Write((short)Observers.Count); player.Send(nwatch); } if (OnPlayerJoin != null) { OnPlayerJoin(this, new PlayerEventArgs(player)); } }
private void SendJoinGame(Player player) { GamePacketWriter join = new GamePacketWriter(StocMessage.JoinGame); join.Write(Banlist == null ? 0U : Banlist.Hash); join.Write((byte)Config.GetInt("Rule")); join.Write((byte)Config.GetInt("Mode")); join.Write(Config.GetBool("EnablePriority")); join.Write(Config.GetBool("NoCheckDeck")); join.Write(Config.GetBool("NoShuffleDeck")); // C++ padding: 5 bytes + 3 bytes = 8 bytes for (int i = 0; i < 3; i++) join.Write((byte)0); join.Write(Config.GetInt("StartLp", DEFAULT_LIFEPOINTS)); join.Write((byte)Config.GetInt("StartHand", DEFAULT_START_HAND)); join.Write((byte)Config.GetInt("DrawCount", DEFAULT_DRAW_COUNT)); join.Write((short)Config.GetInt("GameTimer", DEFAULT_TIMER)); player.Send(join); if (State != GameState.Lobby) SendDuelingPlayers(player); }
private void SendDuelingPlayers(Player player) { for (int i = 0; i < Players.Length; i++) { GamePacketWriter enter = new GamePacketWriter(StocMessage.HsPlayerEnter); int id = i; if (_swapped) { if (IsTag) { if (i == 0 || id == 1) id = i + 2; else id = i - 2; } else id = 1 - i; } enter.Write(Players[id].Name, 20); enter.Write((byte)i); //padding enter.Write((byte)0); player.Send(enter); } }
private void SendJoinGame(Player player) { BinaryWriter join = GamePacketFactory.Create(StocMessage.JoinGame); join.Write(Banlist == null ? 0U : Banlist.Hash); join.Write((byte)Rule); join.Write((byte)Mode); join.Write(EnablePriority); join.Write(NoCheckDeck); join.Write(NoShuffleDeck); // C++ padding: 5 bytes + 3 bytes = 8 bytes for (int i = 0; i < 3; i++) join.Write((byte)0); join.Write(StartLp); join.Write((byte)StartHand); join.Write((byte)DrawCount); join.Write((short)Timer); player.Send(join); if (State != GameState.Lobby) SendDuelingPlayers(player); }
private void InitNewSpectator(Player player) { int deck1 = _duel.QueryFieldCount(0, CardLocation.Deck); int deck2 = _duel.QueryFieldCount(1, CardLocation.Deck); int hand1 = _duel.QueryFieldCount(0, CardLocation.Hand); int hand2 = _duel.QueryFieldCount(1, CardLocation.Hand); GameServerPacket packet = new GameServerPacket(GameMessage.Start); packet.Write((byte)(_swapped ? 0x11 : 0x10)); packet.Write(LifePoints[0]); packet.Write(LifePoints[1]); packet.Write((short)(deck1 + hand1)); packet.Write((short)_duel.QueryFieldCount(0, CardLocation.Extra)); packet.Write((short)(deck2 + hand2)); packet.Write((short)_duel.QueryFieldCount(1, CardLocation.Extra)); player.Send(packet); GameServerPacket draw = new GameServerPacket(GameMessage.Draw); draw.Write((byte)0); draw.Write((byte)hand1); for (int i = 0; i < hand1; i++) draw.Write(0); player.Send(draw); draw = new GameServerPacket(GameMessage.Draw); draw.Write((byte)1); draw.Write((byte)hand2); for (int i = 0; i < hand2; i++) draw.Write(0); player.Send(draw); GameServerPacket turn = new GameServerPacket(GameMessage.NewTurn); turn.Write((byte)0); player.Send(turn); if (CurrentPlayer == 1) { turn = new GameServerPacket(GameMessage.NewTurn); turn.Write((byte)0); player.Send(turn); } InitSpectatorLocation(player, CardLocation.MonsterZone); InitSpectatorLocation(player, CardLocation.SpellZone); InitSpectatorLocation(player, CardLocation.Grave); InitSpectatorLocation(player, CardLocation.Removed); }
private void SendJoinGame(Player player) { GameServerPacket join = new GameServerPacket(StocMessage.JoinGame); join.Write(Banlist == null ? 0U : Banlist.Hash); join.Write((byte)Config.Rule); join.Write((byte)Config.Mode); join.Write(Config.EnablePriority); join.Write(Config.NoCheckDeck); join.Write(Config.NoShuffleDeck); // C++ padding: 5 bytes + 3 bytes = 8 bytes for (int i = 0; i < 3; i++) join.Write((byte)0); join.Write(Config.StartLp); join.Write((byte)Config.StartHand); join.Write((byte)Config.DrawCount); join.Write((short)Config.GameTimer); player.Send(join); if (State != GameState.Lobby) SendDuelingPlayers(player); }
private void InitSpectatorLocation(Player player, CardLocation loc) { for (int index = 0; index < 2; index++) { int flag = loc == CardLocation.MonsterZone ? 0x91fff : 0x81fff; byte[] result = _duel.QueryFieldCard(index, loc, flag, false); MemoryStream ms = new MemoryStream(result); BinaryReader reader = new BinaryReader(ms); BinaryWriter writer = new BinaryWriter(ms); while (ms.Position < ms.Length) { int len = reader.ReadInt32(); if (len == 4) continue; long pos = ms.Position; reader.ReadBytes(len - 4); long endPos = ms.Position; ms.Position = pos; ClientCard card = new ClientCard(); card.Update(reader); ms.Position = endPos; bool facedown = ((card.Position & (int)CardPosition.FaceDown) != 0); GameServerPacket move = new GameServerPacket(GameMessage.Move); move.Write(facedown ? 0 : card.Code); move.Write(0); move.Write((byte)card.Controler); move.Write((byte)card.Location); move.Write((byte)card.Sequence); move.Write((byte)card.Position); move.Write(0); player.Send(move); foreach (ClientCard material in card.Overlay) { GameServerPacket xyzcreate = new GameServerPacket(GameMessage.Move); xyzcreate.Write(material.Code); xyzcreate.Write(0); xyzcreate.Write((byte)index); xyzcreate.Write((byte)CardLocation.Grave); xyzcreate.Write((byte)0); xyzcreate.Write((byte)0); xyzcreate.Write(0); player.Send(xyzcreate); GameServerPacket xyzmove = new GameServerPacket(GameMessage.Move); xyzmove.Write(material.Code); xyzmove.Write((byte)index); xyzmove.Write((byte)CardLocation.Grave); xyzmove.Write((byte)0); xyzmove.Write((byte)0); xyzmove.Write((byte)material.Controler); xyzmove.Write((byte)material.Location); xyzmove.Write((byte)material.Sequence); xyzmove.Write((byte)material.Position); xyzmove.Write(0); player.Send(xyzmove); } if (facedown) { ms.Position = pos; writer.Write(new byte[len - 4]); } } if (loc == CardLocation.MonsterZone) { result = _duel.QueryFieldCard(index, loc, 0x81fff, false); ms = new MemoryStream(result); reader = new BinaryReader(ms); writer = new BinaryWriter(ms); while (ms.Position < ms.Length) { int len = reader.ReadInt32(); if (len == 4) continue; long pos = ms.Position; byte[] raw = reader.ReadBytes(len - 4); bool facedown = ((raw[11] & (int)CardPosition.FaceDown) != 0); if (facedown) { ms.Position = pos; writer.Write(new byte[len - 4]); } } } GameServerPacket update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)index); update.Write((byte)loc); update.Write(result); player.Send(update); } }
private void InitSpectatorLocation(Player player, CardLocation loc) { for (int index = 0; index < 2; index++) { int flag = loc == CardLocation.MonsterZone ? 0x91fff : 0x81fff; byte[] result = _duel.QueryFieldCard(index, loc, flag, false); MemoryStream ms = new MemoryStream(result); BinaryReader reader = new BinaryReader(ms); BinaryWriter writer = new BinaryWriter(ms); while (ms.Position < ms.Length) { int len = reader.ReadInt32(); if (len == 4) { continue; } long pos = ms.Position; reader.ReadBytes(len - 4); long endPos = ms.Position; ms.Position = pos; ClientCard card = new ClientCard(); card.Update(reader); ms.Position = endPos; bool facedown = ((card.Position & (int)CardPosition.FaceDown) != 0); GameServerPacket move = new GameServerPacket(GameMessage.Move); move.Write(facedown ? 0 : card.Code); move.Write(0); move.Write((byte)card.Controler); move.Write((byte)card.Location); move.Write((byte)card.Sequence); move.Write((byte)card.Position); move.Write(0); player.Send(move); foreach (ClientCard material in card.Overlay) { GameServerPacket xyzcreate = new GameServerPacket(GameMessage.Move); xyzcreate.Write(material.Code); xyzcreate.Write(0); xyzcreate.Write((byte)index); xyzcreate.Write((byte)CardLocation.Grave); xyzcreate.Write((byte)0); xyzcreate.Write((byte)0); xyzcreate.Write(0); player.Send(xyzcreate); GameServerPacket xyzmove = new GameServerPacket(GameMessage.Move); xyzmove.Write(material.Code); xyzmove.Write((byte)index); xyzmove.Write((byte)CardLocation.Grave); xyzmove.Write((byte)0); xyzmove.Write((byte)0); xyzmove.Write((byte)material.Controler); xyzmove.Write((byte)material.Location); xyzmove.Write((byte)material.Sequence); xyzmove.Write((byte)material.Position); xyzmove.Write(0); player.Send(xyzmove); } if (facedown) { ms.Position = pos; writer.Write(new byte[len - 4]); } } if (loc == CardLocation.MonsterZone) { result = _duel.QueryFieldCard(index, loc, 0x81fff, false); ms = new MemoryStream(result); reader = new BinaryReader(ms); writer = new BinaryWriter(ms); while (ms.Position < ms.Length) { int len = reader.ReadInt32(); if (len == 4) { continue; } long pos = ms.Position; byte[] raw = reader.ReadBytes(len - 4); bool facedown = ((raw[11] & (int)CardPosition.FaceDown) != 0); if (facedown) { ms.Position = pos; writer.Write(new byte[len - 4]); } } } GameServerPacket update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)index); update.Write((byte)loc); update.Write(result); player.Send(update); } }