private void OnSelectCard(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(msg.Message); int player = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write(msg.Reader.ReadBytes(3)); int count = msg.Reader.ReadByte(); packet.Write((byte)count); for (int i = 0; i < count; i++) { int code = msg.Reader.ReadInt32(); int pl = msg.Reader.ReadByte(); int loc = msg.Reader.ReadByte(); int seq = msg.Reader.ReadByte(); int pos = msg.Reader.ReadByte(); packet.Write(pl == player ? code : 0); packet.Write((byte)pl); packet.Write((byte)loc); packet.Write((byte)seq); packet.Write((byte)pos); } Game.WaitForResponse(player); Game.CurPlayers[player].Send(packet); }
private void OnMove(CoreMessage msg) { byte[] raw = msg.Reader.ReadBytes(16); int pc = raw[4]; int pl = raw[5]; int cc = raw[8]; int cl = raw[9]; int cs = raw[10]; int cp = raw[11]; SendToPlayer(msg, cc); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(raw); if (!Convert.ToBoolean((cl & ((int)CardLocation.Grave + (int)CardLocation.Overlay))) && Convert.ToBoolean((cl & ((int)CardLocation.Deck + (int)CardLocation.Hand))) || Convert.ToBoolean((cp & (int)CardPosition.FaceDown))) { packet.SetPosition(2); packet.Write(0); } Game.SendToAllBut(packet, cc); if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc)) { Game.RefreshSingle(cc, cl, cs); } }
private void OnDraw(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(msg.Message); int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write((byte)count); for (int i = 0; i < count; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) { packet.Write(code); } else { packet.Write(0); } } SendToPlayer(msg, player); Game.SendToAllBut(packet, player); }
private void LobbyError(string message) { GameServerPacket join = new GameServerPacket(StocMessage.JoinGame); join.Write(0U); join.Write((byte)0); join.Write((byte)0); join.Write(0); join.Write(0); join.Write(0); // C++ padding: 5 bytes + 3 bytes = 8 bytes for (int i = 0; i < 3; i++) { join.Write((byte)0); } join.Write(0); join.Write((byte)0); join.Write((byte)0); join.Write((short)0); Send(join); GameServerPacket enter = new GameServerPacket(StocMessage.HsPlayerEnter); enter.Write("[" + message + "]", 20); enter.Write((byte)0); Send(enter); }
public void SendTypeChange() { if(Game==null)return; GameServerPacket packet = new GameServerPacket(StocMessage.TypeChange); packet.Write((byte)(Type + (Game.HostPlayer.Equals(this) ? (int)PlayerType.Host : 0))); Send(packet); }
public void SendTypeChange() { GameServerPacket packet = new GameServerPacket(StocMessage.TypeChange); packet.Write((byte)(Type + (Game.HostPlayer != null && Game.HostPlayer.Equals(this) ? (int)PlayerType.Host : 0))); Send(packet); }
private void OnRetry() { int player = Game.WaitForResponse(); Game.CurPlayers[player].Send(GameServerPacket.EmtryMessage(GameMessage.Retry)); Game.Replay.End(); //File.WriteAllBytes("error_" + DateTime.UtcNow.ToString("yyyy-MM-dd_HH-mm-ss") + ".yrp", Game.Replay.GetFile()); }
private void SendToAll(CoreMessage msg) { byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); Game.SendToAll(packet); }
private void ServerMessage(string msg) { string finalmsg = "[Server] " + msg; GameServerPacket packet = new GameServerPacket(StocMessage.Chat); packet.Write((short)PlayerType.Yellow); packet.Write(finalmsg, finalmsg.Length + 1); Send(packet); }
public void ServerMessage(string msg, PlayerType type = PlayerType.Yellow, string head = "[Server] ") { string finalmsg = head + msg; GameServerPacket packet = new GameServerPacket(StocMessage.Chat); packet.Write((short)type); packet.WriteUnicode(finalmsg, finalmsg.Length + 1); Send(packet); }
private void OnTagSwap(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(GameMessage.TagSwap); int player = msg.Reader.ReadByte(); int mcount = msg.Reader.ReadByte(); int ecount = msg.Reader.ReadByte(); int epcount = msg.Reader.ReadByte(); int hcount = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write((byte)mcount); packet.Write((byte)ecount); packet.Write((byte)epcount); packet.Write((byte)hcount); uint id = msg.Reader.ReadUInt32(); packet.Write(id); for (int i = 0; i < hcount; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) { packet.Write(code); } else { packet.Write(0); } } for (int i = 0; i < ecount; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) { packet.Write(code); } else { packet.Write(0); } } SendToPlayer(msg, player); Game.SendToAllBut(packet, player); Game.RefreshExtra(player); Game.RefreshMonsters(0, 0x81fff, false); Game.RefreshMonsters(1, 0x81fff, false); Game.RefreshSpells(0, 0x681fff, false); Game.RefreshSpells(1, 0x681fff, false); Game.RefreshHand(0, 0x181fff, false); Game.RefreshHand(1, 0x181fff, false); }
private void OnSet(CoreMessage msg) { msg.Reader.ReadBytes(4); byte[] raw = msg.Reader.ReadBytes(4); GameServerPacket packet = new GameServerPacket(GameMessage.Set); packet.Write(0); packet.Write(raw); Game.SendToAll(packet); }
private void SendToPlayer(CoreMessage msg, int player) { if (player != 0 && player != 1) { return; } byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); Game.CurPlayers[player].Send(packet); }
private void SendToAll(CoreMessage msg, int length) { if (length == 0) { using (GameServerPacket p = new GameServerPacket(msg.Message)){ Game.SendToAll(p); } return; } msg.Reader.ReadBytes(length); SendToAll(msg); }
private void OnUpdateDeck(GameClientPacket packet) { if (Type == (int)PlayerType.Observer) { return; } Deck deck = new Deck(); int main = packet.ReadInt32(); int side = packet.ReadInt32(); for (int i = 0; i < main; i++) { deck.AddMain(packet.ReadInt32()); } for (int i = 0; i < side; i++) { deck.AddSide(packet.ReadInt32()); } if (Game.State == GameState.Lobby) { Deck = deck; Game.IsReady[Type] = false; } else if (Game.State == GameState.Side) { if (Game.IsReady[Type]) { return; } if (!Deck.Check(deck)) { GameServerPacket error = new GameServerPacket(StocMessage.ErrorMsg); error.Write((byte)3); error.Write(0); Send(error); return; } Deck = deck; Game.IsReady[Type] = true; Game.ServerMessage(Name + " is ready."); Send(new GameServerPacket(StocMessage.DuelStart)); Game.MatchSide(); } }
private void OnShuffleHand(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(msg.Message); int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write((byte)count); msg.Reader.ReadBytes(count * 4); for (int i = 0; i < count; i++) { packet.Write(0); } SendToPlayer(msg, player); Game.SendToAllBut(packet, player); Game.RefreshHand(player, 0x181fff, false); }
private void OnConfirmCards(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 7); byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); if ((CardLocation)buffer[7] == CardLocation.Hand) { Game.SendToAll(packet); } else { Game.CurPlayers[player].Send(packet); } }
private void OnHint(CoreMessage msg) { int type = msg.Reader.ReadByte(); int player = msg.Reader.ReadByte(); msg.Reader.ReadInt32(); byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); switch (type) { case 1: case 2: case 3: case 4: case 5: Game.CurPlayers[player].Send(packet); break; case 6: case 7: case 8: case 9: Game.SendToAllBut(packet, player); break; case 10: if (Game.IsTag) { Game.CurPlayers[player].Send(packet); } else { Game.SendToAll(packet); } break; } }
public void ServerMessage(string msg, PlayerType type=PlayerType.Yellow, string head="[Server] ") { string finalmsg = head + msg; GameServerPacket packet = new GameServerPacket(StocMessage.Chat); packet.Write((short)type); packet.WriteUnicode(finalmsg, finalmsg.Length + 1); Send(packet); }
public void Surrender(Player player, int reason, bool force = false) { if (!force) if (State != GameState.Duel) return; if (player.Type == (int)PlayerType.Observer) return; GameServerPacket win = new GameServerPacket(GameMessage.Win); // if (Program.Config.STDOUT == true) // Console.WriteLine("Surrender - {0}", player.Name); //Need API int team = player.Type; if (IsTag) team = player.Type >= 2 ? 1 : 0; win.Write((byte)(1 - team)); win.Write((byte)reason); SendToAll(win); MatchSaveResult(1 - team); RecordWin(1 - team, reason, force); EndDuel(reason == 4); }
public static GameServerPacket getMessage(string finalmsg,PlayerType type=PlayerType.Yellow){ GameServerPacket packet = new GameServerPacket(StocMessage.Chat); packet.Write((short)type); packet.WriteUnicode(finalmsg, finalmsg.Length + 1); return packet; }
public void RefreshGrave(int player, int flag = 0x81fff, bool useCache = true) { byte[] result = m_duel.QueryFieldCard(player, CardLocation.Grave, flag, useCache); GameServerPacket update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Grave); update.Write(result); SendToAll(update); }
private void LobbyError(string message) { GameServerPacket join = new GameServerPacket(StocMessage.JoinGame); join.Write(0U); join.Write((byte)0); join.Write((byte)0); join.Write(0); join.Write(0); join.Write(0); // C++ padding: 5 bytes + 3 bytes = 8 bytes for (int i = 0; i < 3; i++) join.Write((byte)0); join.Write(0); join.Write((byte)0); join.Write((byte)0); join.Write((short)0); Send(join); GameServerPacket enter = new GameServerPacket(StocMessage.HsPlayerEnter); enter.Write("[" + message + "]", 20); enter.Write((byte)0); Send(enter); }
public void HandResult(Player player, int result) { if (State != GameState.Hand) return; if (player.Type == (int)PlayerType.Observer) return; if (result < 1 || result > 3) return; if (IsTag && player.Type != 0 && player.Type != 2) return; int type = player.Type; if (IsTag && player.Type == 2) type = 1; if (m_handResult[type] != 0) return; m_handResult[type] = result; if (m_handResult[0] != 0 && m_handResult[1] != 0) { GameServerPacket packet = new GameServerPacket(StocMessage.HandResult); packet.Write((byte)m_handResult[0]); packet.Write((byte)m_handResult[1]); SendToTeam(packet, 0); SendToObservers(packet); packet = new GameServerPacket(StocMessage.HandResult); packet.Write((byte)m_handResult[1]); packet.Write((byte)m_handResult[0]); SendToTeam(packet, 1); if (m_handResult[0] == m_handResult[1]) { m_handResult[0] = 0; m_handResult[1] = 0; SendHand(); return; } if ((m_handResult[0] == 1 && m_handResult[1] == 2) || (m_handResult[0] == 2 && m_handResult[1] == 3) || (m_handResult[0] == 3 && m_handResult[1] == 1)) m_startplayer = IsTag ? 2 : 1; else m_startplayer = 0; State = GameState.Starting; Players[m_startplayer].Send(new GameServerPacket(StocMessage.SelectTp)); } }
public void RefreshSingle(int player, int location, int sequence, int flag = 0x781fff) { byte[] result = m_duel.QueryCard(player, location, sequence, flag); if (location == (int)CardLocation.Removed && (result[15] & (int)CardPosition.FaceDown) != 0) return; GameServerPacket update = new GameServerPacket(GameMessage.UpdateCard); update.Write((byte)player); update.Write((byte)location); update.Write((byte)sequence); update.Write(result); CurPlayers[player].Send(update); if (IsTag) { if ((location & (int)CardLocation.Onfield) != 0) { SendToTeam(update, player); if ((result[15] & (int)CardPosition.FaceUp) != 0) SendToTeam(update, 1 - player); } else { CurPlayers[player].Send(update); if ((location & 0x90) != 0) SendToAllBut(update, player); } } else { if ((location & 0x90) != 0 || ((location & 0x2c) != 0 && (result[15] & (int)CardPosition.FaceUp) != 0)) SendToAllBut(update, player); } }
private void OnMove(CoreMessage msg) { byte[] raw = msg.Reader.ReadBytes(16); int pc = raw[4]; int pl = raw[5]; int cc = raw[8]; int cl = raw[9]; int cs = raw[10]; int cp = raw[11]; SendToPlayer(msg, cc); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(raw); if (!Convert.ToBoolean((cl & ((int)CardLocation.Grave + (int)CardLocation.Overlay))) && Convert.ToBoolean((cl & ((int)CardLocation.Deck + (int)CardLocation.Hand))) || Convert.ToBoolean((cp & (int)CardPosition.FaceDown))) { packet.SetPosition(2); packet.Write(0); } Game.SendToAllBut(packet, cc); if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc)) Game.RefreshSingle(cc, cl, cs); }
private void OnShuffleHand(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(msg.Message); int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write((byte)count); msg.Reader.ReadBytes(count * 4); for (int i = 0; i < count; i++) packet.Write(0); SendToPlayer(msg, player); Game.SendToAllBut(packet, player); Game.RefreshHand(player, 0x181fff, false); }
private void OnConfirmCards(CoreMessage msg) { int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); msg.Reader.ReadBytes(count * 7); byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); if ((CardLocation)buffer[7] == CardLocation.Hand) Game.SendToAll(packet); else Game.CurPlayers[player].Send(packet); }
private void OnHint(CoreMessage msg) { int type = msg.Reader.ReadByte(); int player = msg.Reader.ReadByte(); msg.Reader.ReadInt32(); byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); switch (type) { case 1: case 2: case 3: case 4: case 5: Game.CurPlayers[player].Send(packet); break; case 6: case 7: case 8: case 9: Game.SendToAllBut(packet, player); break; case 10: if (Game.IsTag) Game.CurPlayers[player].Send(packet); else Game.SendToAll(packet); break; } }
public void WaitForResponse(int player) { m_lastresponse = player; CurPlayers[player].State = PlayerState.Response; SendToAllBut(new GameServerPacket(GameMessage.Waiting), player); TimeStart(); GameServerPacket packet = new GameServerPacket(StocMessage.TimeLimit); packet.Write((byte)player); packet.Write((byte)0); // C++ padding packet.Write((short)m_timelimit[player]); SendToPlayers(packet); }
public void EndDuel(bool force) { if (State == GameState.Duel) { if (!Replay.Disabled) { Replay.End(); byte[] replayData = Replay.GetFile(); GameServerPacket packet = new GameServerPacket(StocMessage.Replay); packet.Write(replayData); SendToAll(packet); } State = GameState.End; m_duel.End(); } if (m_swapped) { m_swapped = false; Player temp = Players[0]; Players[0] = Players[1]; Players[1] = temp; Players[0].Type = 0; Players[1].Type = 1; } if (IsMatch && !force && !MatchIsEnd()) { IsReady[0] = false; IsReady[1] = false; ServerMessage("You have 120 seconds to side!"); SideTimer = DateTime.UtcNow; State = GameState.Side; SendToPlayers(new GameServerPacket(StocMessage.ChangeSide)); SendToObservers(new GameServerPacket(StocMessage.WaitingSide)); } else End(); }
public void RefreshExtra(int player, int flag = 0x81fff, bool useCache = true) { byte[] result = m_duel.QueryFieldCard(player, CardLocation.Extra, flag, useCache); GameServerPacket update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Extra); update.Write(result); CurPlayers[player].Send(update); }
public void Send(GameServerPacket packet) { m_client.Send(packet.GetContent()); }
public void SendToAll(GameServerPacket packet) { SendToPlayers(packet); SendToObservers(packet); }
private void OnUpdateDeck(GameClientPacket packet) { if (Type == (int)PlayerType.Observer) return; Deck deck = new Deck(); int main = packet.ReadInt32(); int side = packet.ReadInt32(); for (int i = 0; i < main; i++) deck.AddMain(packet.ReadInt32()); for (int i = 0; i < side; i++) deck.AddSide(packet.ReadInt32()); if (Game.State == GameState.Lobby) { Deck = deck; Game.IsReady[Type] = false; } else if (Game.State == GameState.Side) { if (Game.IsReady[Type]) return; if (!Deck.Check(deck)) { GameServerPacket error = new GameServerPacket(StocMessage.ErrorMsg); error.Write((byte)3); error.Write(0); Send(error); return; } Deck = deck; Game.IsReady[Type] = true; Game.ServerMessage(Name + " is ready."); Send(new GameServerPacket(StocMessage.DuelStart)); Game.MatchSide(); } }
public void RefreshHand(int player, int flag = 0x181fff, bool useCache = true) { byte[] result = m_duel.QueryFieldCard(player, CardLocation.Hand, flag | 0x100000, useCache); GameServerPacket update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Hand); update.Write(result); CurPlayers[player].Send(update); update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.Hand); 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; byte[] raw = reader.ReadBytes(len - 4); if (raw[len - 8] == 0) { ms.Position = pos; writer.Write(new byte[len - 4]); } } update.Write(result); SendToAllBut(update, player); }
public static List<string> SendMessage(GameServerPacket msg, string name=null){ List<string> playernames=new List<string>(); GameRoom[] rooms; //MutexRooms.WaitOne(); rooms = new GameRoom[m_rooms.Count]; m_rooms.Values.CopyTo(rooms, 0); //MutexRooms.ReleaseMutex(); foreach (GameRoom room in rooms) { if (room.IsOpen){ try{ if(string.IsNullOrEmpty(name)){ playernames.AddRange(room.Game.SendToAll(msg).ToArray()); }else{ foreach(Player pl in room.Game.Players){ if(pl!=null && pl.Name==name){ playernames.Add(pl.Name); pl.Send(msg); } } foreach(Player pl in room.Game.Observers){ if(pl!=null && pl.Name==name){ playernames.Add(pl.Name); pl.Send(msg); } } } }catch(Exception){ } } } return playernames; }
public void TpResult(Player player, bool result) { if (State != GameState.Starting) return; if (player.Type != m_startplayer) return; m_swapped = false; if (result && player.Type == (IsTag ? 2 : 1) || !result && player.Type == 0) { m_swapped = true; if (IsTag) { Player temp = Players[0]; Players[0] = Players[2]; Players[2] = temp; temp = Players[1]; Players[1] = Players[3]; Players[3] = temp; Players[0].Type = 0; Players[1].Type = 1; Players[2].Type = 2; Players[3].Type = 3; } else { Player temp = Players[0]; Players[0] = Players[1]; Players[1] = temp; Players[0].Type = 0; Players[1].Type = 1; } } CurPlayers[0] = Players[0]; CurPlayers[1] = Players[IsTag ? 3 : 1]; State = GameState.Duel; int seed = Environment.TickCount; m_duel = Duel.Create((uint)seed); Random rand = new Random(seed); m_duel.SetAnalyzer(m_analyser.Analyse); m_duel.SetErrorHandler(HandleError); m_duel.InitPlayers(Config.StartLp, Config.StartHand, Config.DrawCount); int opt = 0; if (Config.EnablePriority) opt += 0x08; if (Config.NoShuffleDeck) opt += 0x10; if (IsTag) opt += 0x20; Replay = new Replay((uint)seed, IsTag); Replay.Writer.WriteUnicode(Players[0].Name, 20); Replay.Writer.WriteUnicode(Players[1].Name, 20); if (IsTag) { Replay.Writer.WriteUnicode(Players[2].Name, 20); Replay.Writer.WriteUnicode(Players[3].Name, 20); } Replay.Writer.Write(Config.StartLp); Replay.Writer.Write(Config.StartHand); Replay.Writer.Write(Config.DrawCount); Replay.Writer.Write(opt); for (int i = 0; i < Players.Length; i++) { Player dplayer = Players[i == 2 ? 3 : (i == 3 ? 2 : i)]; int pid = i; if (IsTag) pid = i >= 2 ? 1 : 0; if (!Config.NoShuffleDeck) { IList<int> cards = ShuffleCards(rand, dplayer.Deck.Main); Replay.Writer.Write(cards.Count); foreach (int id in cards) { if (IsTag && (i == 1 || i == 3)) m_duel.AddTagCard(id, pid, CardLocation.Deck); else m_duel.AddCard(id, pid, CardLocation.Deck); Replay.Writer.Write(id); } } else { Replay.Writer.Write(dplayer.Deck.Main.Count); for (int j = dplayer.Deck.Main.Count - 1; j >= 0; j--) { int id = dplayer.Deck.Main[j]; if (IsTag && (i == 1 || i == 3)) m_duel.AddTagCard(id, pid, CardLocation.Deck); else m_duel.AddCard(id, pid, CardLocation.Deck); Replay.Writer.Write(id); } } Replay.Writer.Write(dplayer.Deck.Extra.Count); foreach (int id in dplayer.Deck.Extra) { if (IsTag && (i == 1 || i == 3)) m_duel.AddTagCard(id, pid, CardLocation.Extra); else m_duel.AddCard(id, pid, CardLocation.Extra); Replay.Writer.Write(id); } } GameServerPacket packet = new GameServerPacket(GameMessage.Start); packet.Write((byte)0); packet.Write(Config.StartLp); packet.Write(Config.StartLp); packet.Write((short)m_duel.QueryFieldCount(0, CardLocation.Deck)); packet.Write((short)m_duel.QueryFieldCount(0, CardLocation.Extra)); packet.Write((short)m_duel.QueryFieldCount(1, CardLocation.Deck)); packet.Write((short)m_duel.QueryFieldCount(1, CardLocation.Extra)); SendToTeam(packet, 0); packet.SetPosition(2); packet.Write((byte)1); SendToTeam(packet, 1); packet.SetPosition(2); if (m_swapped) packet.Write((byte)0x11); else packet.Write((byte)0x10); SendToObservers(packet); RefreshExtra(0); RefreshExtra(1); m_duel.Start(opt); TurnCount = 0; LifePoints[0] = Config.StartLp; LifePoints[1] = Config.StartLp; Process(); }
private void OnTagSwap(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(GameMessage.TagSwap); int player = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write(msg.Reader.ReadBytes(2)); int count = msg.Reader.ReadByte(); packet.Write((byte)count); packet.Write(msg.Reader.ReadBytes(4)); for (int i = 0; i < count; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) packet.Write(code); else packet.Write(0); } SendToPlayer(msg, player); Game.SendToAllBut(packet, player); Game.RefreshExtra(player); Game.RefreshMonsters(0, 0x81fff, false); Game.RefreshMonsters(1, 0x81fff, false); Game.RefreshSpells(0, 0x681fff, false); Game.RefreshSpells(1, 0x681fff, false); Game.RefreshHand(0, 0x181fff, false); Game.RefreshHand(1, 0x181fff, false); }
public void SendToAllBut(GameServerPacket packet, Player except) { foreach (Player player in Players) if (player != null && !player.Equals(except)) player.Send(packet); foreach (Player player in Observers) if (!player.Equals(except)) player.Send(packet); }
private void SendToPlayer(CoreMessage msg, int player) { if (player != 0 && player != 1) return; byte[] buffer = msg.CreateBuffer(); GameServerPacket packet = new GameServerPacket(msg.Message); packet.Write(buffer); Game.CurPlayers[player].Send(packet); }
private void OnDraw(CoreMessage msg) { GameServerPacket packet = new GameServerPacket(msg.Message); int player = msg.Reader.ReadByte(); int count = msg.Reader.ReadByte(); packet.Write((byte)player); packet.Write((byte)count); for (int i = 0; i < count; i++) { uint code = msg.Reader.ReadUInt32(); if ((code & 0x80000000) != 0) packet.Write(code); else packet.Write(0); } SendToPlayer(msg, player); Game.SendToAllBut(packet, player); }
public void RefreshSpells(int player, int flag = 0x681fff, bool useCache = true) { byte[] result = m_duel.QueryFieldCard(player, CardLocation.SpellZone, flag, useCache); GameServerPacket update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.SpellZone); update.Write(result); SendToTeam(update, player); update = new GameServerPacket(GameMessage.UpdateData); update.Write((byte)player); update.Write((byte)CardLocation.SpellZone); MemoryStream ms = new MemoryStream(result); BinaryReader reader = new BinaryReader(ms); BinaryWriter writer = new BinaryWriter(ms); for (int i = 0; i < 8; i++) { int len = reader.ReadInt32(); if (len == 4) continue; long pos = ms.Position; byte[] raw = reader.ReadBytes(len - 4); if ((raw[11] & (int)CardPosition.FaceDown) != 0) { ms.Position = pos; writer.Write(new byte[len - 4]); } } update.Write(result); SendToTeam(update, 1 - player); SendToObservers(update); }