Exemple #1
0
        public void DeliverItems(Session User1, Session User2)
        {
            lock (mSyncRoot)
            {
                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    foreach (Item Item in mUserOneOffers.Values)
                    {
                        User1.InventoryCache.RemoveItem(Item.Id);
                        User2.InventoryCache.Add(Item);

                        Item.MoveToUserInventory(MySqlClient, User2.CharacterId);
                    }

                    foreach (Item Item in mUserTwoOffers.Values)
                    {
                        User2.InventoryCache.RemoveItem(Item.Id);
                        User1.InventoryCache.Add(Item);

                        Item.MoveToUserInventory(MySqlClient, User1.CharacterId);
                    }
                }

                User1.SendData(InventoryRefreshComposer.Compose());
                User2.SendData(InventoryRefreshComposer.Compose());

                mUserOneOffers.Clear();
                mUserTwoOffers.Clear();

                mTradeStage = TradeStage.Dead;
            }
        }
Exemple #2
0
        public bool AcceptTrade(bool User)
        {
            lock (mSyncRoot)
            {
                if (mTradeStage == Trading.TradeStage.Finalized)
                {
                    return(false);
                }

                if (User)
                {
                    mUserOneAccepted = true;
                }
                else
                {
                    mUserTwoAccepted = true;
                }

                if (mUserOneAccepted && mUserTwoAccepted)
                {
                    mTradeStage = mTradeStage == Trading.TradeStage.Finalizing ? TradeStage.Finalized :
                                  TradeStage.Finalizing;
                    mUserOneAccepted = false;
                    mUserTwoAccepted = false;
                }
            }

            return(true);
        }
Exemple #3
0
        private IEnumerator SetTradeStage(TradeStage newStage)
        {
            tradeStage = newStage;

            switch (tradeStage)
            {
            case TradeStage.ChoosingOffer:
                yield return(StartCoroutine(SetUIForChoosingOffer()));

                break;

            case TradeStage.ConfirmingOfferChoice:
                yield return(StartCoroutine(SetUIForConfirmingOfferChoice()));

                break;

            case TradeStage.WaitingForOtherUserOffer:
                yield return(StartCoroutine(SetUIForWaitingForOtherUserOffer()));

                break;

            case TradeStage.DecidingOnOffer:
                yield return(StartCoroutine(SetUIForDecidingOnOffer()));

                break;

            case TradeStage.WaitingForOtherUserDecisionOnOffer:
                yield return(StartCoroutine(SetUIForWaitingForOtherUserDecisionOnOffer()));

                break;

            case TradeStage.ConfirmingCancelTrade:
                yield return(StartCoroutine(SetUIForConfirmingCloseTrade()));

                break;

            default:
                Debug.LogError("Unknown trade stage: " + tradeStage);
                break;
            }
        }
Exemple #4
0
        public void DeliverItems(Session User1, Session User2)
        {
            lock (mSyncRoot)
            {
                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    foreach (Item Item in mUserOneOffers.Values)
                    {
                        User1.InventoryCache.RemoveItem(Item.Id);
                        User2.InventoryCache.Add(Item);

                        Item.MoveToUserInventory(MySqlClient, User2.CharacterId);
                    }

                    foreach (Item Item in mUserTwoOffers.Values)
                    {
                        User2.InventoryCache.RemoveItem(Item.Id);
                        User1.InventoryCache.Add(Item);

                        Item.MoveToUserInventory(MySqlClient, User1.CharacterId);
                    }
                }

                User1.SendData(InventoryRefreshComposer.Compose());
                User2.SendData(InventoryRefreshComposer.Compose());

                mUserOneOffers.Clear();
                mUserTwoOffers.Clear();

                mTradeStage = TradeStage.Dead;
            }
        }
Exemple #5
0
        public bool AcceptTrade(bool User)
        {
            lock (mSyncRoot)
            {
                if (mTradeStage == Trading.TradeStage.Finalized)
                {
                    return false;
                }

                if (User)
                {
                    mUserOneAccepted = true;
                }
                else
                {
                    mUserTwoAccepted = true;
                }

                if (mUserOneAccepted && mUserTwoAccepted)
                {
                    mTradeStage = mTradeStage == Trading.TradeStage.Finalizing ? TradeStage.Finalized :
                        TradeStage.Finalizing;
                    mUserOneAccepted = false;
                    mUserTwoAccepted = false;
                }
            }

            return true;
        }
Exemple #6
0
        private IEnumerator MainTradeSceneCoroutine()
        {
            #region Initial Setup

            waitingForPlayerChoice = false;
            tradeReadyToExecute    = false;

            //Check arguments are set
            if (!TradeEntranceArguments.argumentsSet)
            {
                Debug.LogError("Trade entrance arguments not set");
                GameSceneManager.CloseTradeScene();
                yield break;
            }

            //Set up trade stage
            tradeStage = 0;

            //Read entrance arguments
            networkStream = TradeEntranceArguments.networkStream;
            otherUserName = TradeEntranceArguments.otherUserName;
            disallowedSendPokemonGuids = TradeEntranceArguments.disallowedSendPokemonGuids;

            //Set the other user's displayed name according to newly-read-from-entrance-arguments name
            tradeUIController.RefreshOtherUserName();

            //Initialise offered pokemon
            playerOfferedPokemonLocator = null;
            otherUserOfferedPokemon     = null;

            //Create comms manager
            commsManager = new Connection.NetworkTradeCommsManager(
                stream: networkStream,
                serializer: Serialize.DefaultSerializer);

            //Start listening
            commsManager.StartListening();

            #endregion

            #region Trade Decision Loop

            tradeUIController.SetInteractionEnabled(true);

            while (true)
            {
                #region Comm Receiving

                Connection.NetworkCommsManager.Comm comm = commsManager.GetNextComm();

                if (comm != null)
                {
                    yield return(StartCoroutine(HandleTradeComm(comm)));
                }

                #endregion

                #region Actions Needing To Be Taken

                if (locatorToBeConfirmed != null)
                {
                    if (tradeStage != TradeStage.ChoosingOffer && tradeStage != TradeStage.ConfirmingOfferChoice)
                    {
                        Debug.LogError("Locator to be confirmed has been set when not in correct trade stage");
                    }
                    else if (tradeStage == TradeStage.ChoosingOffer)
                    {
                        yield return(StartCoroutine(SetTradeStage(TradeStage.ConfirmingOfferChoice)));
                    }
                }
                else if (tryingToConfirmCloseTrade)
                {
                    if (tradeStage != TradeStage.ChoosingOffer)
                    {
                        Debug.LogError("Trying to close trade when not in correct trade stage");
                    }
                    else
                    {
                        tryingToConfirmCloseTrade = false;
                        yield return(StartCoroutine(SetTradeStage(TradeStage.ConfirmingCancelTrade)));
                    }
                }
                else if (needToNotifyPlayerDisallowedTrade)
                {
                    if (tradeStage != TradeStage.ChoosingOffer && tradeStage != TradeStage.ConfirmingOfferChoice)
                    {
                        Debug.LogError("Trying to notify player of disallowed offer when not choosing offer pokemon");
                    }
                    else
                    {
                        needToNotifyPlayerDisallowedTrade = false;

                        textBoxController.Show();
                        yield return(StartCoroutine(
                                         textBoxController.RevealText(otherUserName + disallowedOfferPokemonMessageSuffix, true)
                                         ));

                        textBoxController.Hide();
                    }
                }

                #endregion

                #region Other user making decision being waited for

                //Waiting for other user's offer and other user's offer has been set
                if (tradeStage == TradeStage.WaitingForOtherUserOffer && otherUserOfferedPokemon != null)
                {
                    yield return(StartCoroutine(SetTradeStage(TradeStage.DecidingOnOffer)));
                }

                //Waiting for other user decision on offer and other user has accepted trade
                if (tradeStage == TradeStage.WaitingForOtherUserDecisionOnOffer && otherUserAcceptedTrade)
                {
                    tradeReadyToExecute = true;
                    break; //Break loop to execute trade
                }

                #endregion

                #region User Making Choices during Trade Stages

                if (waitingForPlayerChoice)
                {
                    if (textBoxController.userChoiceIndexSelected >= 0) //If choice has been made
                    {
                        switch (tradeStage)
                        {
                        case TradeStage.ConfirmingOfferChoice:
                            yield return(StartCoroutine(ConfirmOfferChoiceMade()));

                            break;

                        case TradeStage.WaitingForOtherUserOffer:
                            yield return(StartCoroutine(CancelOfferedPokemon()));

                            break;

                        case TradeStage.DecidingOnOffer:
                            yield return(StartCoroutine(DecisionOnOfferChoiceMade()));

                            break;

                        case TradeStage.ConfirmingCancelTrade:
                            yield return(StartCoroutine(ConfirmCancelTradeChoiceMade()));

                            break;

                        default:
                            Debug.LogError("Text box waiting for user choice when not on selection trade stage");
                            break;
                        }
                    }
                }

                #endregion

                if (commsManager.CommsConnErrorOccured)
                {
                    break;
                }

                yield return(new WaitForFixedUpdate());
            }

            #endregion

            #region Dealing with Circumstances of Loop Breaking

            if (tradeReadyToExecute) //Trade decided successfully
            {
                CloseNetworking();

                tradeUIController.Hide();

                yield return(StartCoroutine(ExecuteTrade()));

                CloseTradeScene();
            }
            else if (commsManager.CommsConnErrorOccured) //Connection error occured
            {
                yield return(StartCoroutine(
                                 textBoxController.RevealText(connErrorOccuredMessage, true)
                                 ));

                CloseTradeScene();
            }
            else //Unknown reason
            {
                Debug.LogError("Main trade scene loop closed for unknown reason");
                GameSceneManager.CloseTradeScene();
            }

            #endregion
        }