private void handleDiscardMessage(DiscardMessage m, ServerPlayer p) { if (!p.MyTurn) { //invalid request! p.Send(new ErrorMessage("It is not your turn to discard!")); return; //client sent invalid request! } if (!p.PickedUpCard) { //invalid request p.Send(new ErrorMessage("You did not yet pick up a card from the discard pile or deck!")); return; } if (p.GetHand().RemoveCardWithId(m.CardObj.Id) == null) { //invalid request //send cards back, biotches! p.AddHandCard(m.CardObj); p.Send(new ErrorMessage("You do not have the discard in your hand. Returning card. [" + m.CardObj.Id + "]")); p.Send(new HandMessage(p.GetHand(), true)); return; } //make sure we can't pick any skip cards up _firstDiscard = false; if (p.GetHand().Count == 0) { endTurn(p, false); SendAll(new WentOutMessage(p.PlayerID)); EndHand(p, m.CardObj); return; } _discard.AddTopCard(m.CardObj); SendAll(new UpdateDiscardMessage(m.CardObj, p, true)); updateClientsStatuses(); Thread.Sleep(TimingDefinitions.pxcpArtificalWait); endTurn(p, true); }
public void AddMessageToProcess(ServerPlayer sp, byte [] b) { if (b.Length < 1) { PhazeXLog.LogError ( new Exception("Attempted to process 0 byte message!") , GameLibraryVersion.ProgramIdentifier , 0 ); } byte start = b[0]; try { Message msg = null; switch (start) { case (byte)pxMessages.Heartbeat: msg = new HeartBeatMessage(b); break; case (byte)pxMessages.SystemMessage: msg = new SystemMessage(b); break; case (byte)pxMessages.Chat: msg = new ChatMessage(b, this.getIDs()); break; case (byte)pxMessages.Ready: msg = new ReadyMessage(b, this.getIDs()); break; case (byte)pxMessages.ChangeName: msg = new ChangeNameMessage(b, this.getIDs()); break; case (byte)pxMessages.PlayOnGroup: msg = new PlayOnGroupMessage(b, this.rules); break; case (byte)pxMessages.Meld: msg = new MeldMessage(b, this.rules); break; case (byte)pxMessages.GetTopDiscard: msg = new GetTopDiscardMessage(b); break; case (byte)pxMessages.GetTopDeckCard: msg = new GetTopDeckCardMessage(b); break; case (byte)pxMessages.DiscardSkip: msg = new DiscardSkipMessage(b, this.getIDs(), this.rules); break; case (byte)pxMessages.Discard: msg = new DiscardMessage(b, this.rules); break; case (byte)pxMessages.RequestHand: msg = new RequestHandMessage(b); break; case (byte)pxMessages.RequestTable: msg = new RequestTableMessage(b); break; default: msg = new UnknownMessage(b); break; } lock (this) { _messagesToProcess.Add(new PlayerMessage(sp, msg)); } } catch (BadMessageException bme) { PhazeXLog.LogError ( bme , GameLibraryVersion.ProgramIdentifier , 109 ); string info = ""; foreach (byte tmp in b) { info += ((int)tmp).ToString() + " "; } PhazeXLog.LogInformation(info, pid); } }