コード例 #1
0
        private void SendAttackCancel()
        {
            var data = Repository.GetData;
            //команда хосту
            var packet = new ModelMailAttackCancel()
            {
                From = data.PlayerSystem.Public,
                To   = Host.Public,
            };

            lock (Host)
            {
                Host.Mails.Add(packet);
            }
            //команда атакующему
            packet = new ModelMailAttackCancel()
            {
                From = data.PlayerSystem.Public,
                To   = Attacker.Public,
            };
            lock (Attacker)
            {
                Attacker.Mails.Add(packet);
            }
        }
コード例 #2
0
        /// <summary>
        /// Проверка и действия при сбоях.
        /// Если отключился атакующий до State == 10 или меньше 1 мин, то отмена.
        /// Если отключился атакующий при State == 10 и больше 1 мин, то уничтожение каравана, поселение остается как есть.
        /// Если отключился хост до State == 10, то уничтожение поселения хоста и отмена у атакующего.
        /// Если отключился хост после State == 10, то уничтожение поселения хоста и поселение переходит к атакующему.
        /// </summary>
        /// <param name="attacker">Это запрос атакующего, иначе хоста</param>
        /// <returns></returns>
        private bool CheckConnect(bool attacker)
        {
            if (!TestMode)
            {
                Host.Public.LastPVPTime = DateTime.UtcNow;
            }

            bool   fail       = false;
            bool   asTestMode = TestMode;
            string logDet;

            if (attacker)
            {
                logDet = " (is attacker)";
                fail   = !Host.Online;
            }
            else
            {
                logDet = " (is host)";
                //атакующий может подвиснуть при создании карты, но когда максимум ожидания (=пауза у хоста) кончилось, то всё равно проверяем
                if (StartTime != DateTime.MinValue ||
                    SetPauseOnTimeToHost != DateTime.MinValue && SetPauseOnTimeToHost < DateTime.UtcNow)
                {
                    fail = !Attacker.Online;
                }
            }
            if (!fail)
            {
                if (State < 10 && (DateTime.UtcNow - CreateTime).TotalSeconds > 8 * 60)
                {
                    fail       = true;
                    asTestMode = true;
                    logDet     = " Loading too long.";
                }
            }

            if (fail)
            {
                var data = Repository.GetData;

                if (asTestMode)
                {   //При тестовом режиме всех участников отключаем
                    if (TestMode)
                    {
                        Loger.Log("Server AttackServer Fail and back. TestMode" + logDet);
                    }
                    else
                    {
                        Loger.Log("Server AttackServer Fail and back. " + logDet);
                    }

                    SendAttackCancel();
                }
                else if (!attacker)
                {                                                                                          //Если отключился атакующий
                    //до State == 10 или меньше 1 мин, то отмена
                    if (StartTime == DateTime.MinValue || (DateTime.UtcNow - StartTime).TotalSeconds < 60) // State == 10 проверяется косвенно: StartTime устанавливается только при State == 10
                    {
                        Loger.Log("Server AttackServer Fail attacker off in start" + logDet);

                        SendAttackCancel();
                    }
                    //при State == 10 и больше 1 мин, то уничтожение каравана, поселение остается как есть.
                    else
                    {
                        Loger.Log("Server AttackServer Fail attacker off in progress" + logDet);

                        //команда хосту
                        ModelMail packet = new ModelMailAttackTechnicalVictory()
                        {
                            From = data.PlayerSystem.Public,
                            To   = Host.Public,
                        };
                        lock (Host)
                        {
                            Host.Mails.Add(packet);
                        }
                        //команда атакующему
                        packet = new ModelMailAttackCancel()
                        {
                            From = data.PlayerSystem.Public,
                            To   = Attacker.Public,
                        };
                        var packet2 = new ModelMailDeleteWO()
                        {
                            From          = data.PlayerSystem.Public,
                            To            = Attacker.Public,
                            PlaceServerId = InitiatorPlaceServerId,
                            Tile          = InitiatorPlaceTile,
                        };
                        lock (Attacker)
                        {
                            Attacker.Mails.Add(packet);
                            Attacker.Mails.Add(packet2);
                        }
                    }
                }
                else
                {   //Если отключился хост
                    //то уничтожение поселения хоста
                    var packet1 = new ModelMailAttackCancel()
                    {
                        From = data.PlayerSystem.Public,
                        To   = Host.Public,
                    };
                    var packet2 = new ModelMailDeleteWO()
                    {
                        From          = data.PlayerSystem.Public,
                        To            = Host.Public,
                        PlaceServerId = HostPlaceServerId,
                    };
                    lock (Host)
                    {
                        Host.Mails.Add(packet1);
                        Host.Mails.Add(packet2);
                    }

                    //до State == 10, отмена у атакующего
                    if (StartTime == DateTime.MinValue) // State == 10 проверяется косвенно: StartTime устанавливается только при State == 10
                    {
                        Loger.Log("Server AttackServer Fail host off in start" + logDet);

                        //команда атакующему
                        var packet = new ModelMailAttackCancel()
                        {
                            From = data.PlayerSystem.Public,
                            To   = Attacker.Public,
                        };
                        lock (Attacker)
                        {
                            Attacker.Mails.Add(packet);
                        }
                    }
                    //после State == 10, поселение переходит к атакующему
                    else
                    {
                        Loger.Log("Server AttackServer Fail host off in progress" + logDet);

                        //команда атакующему
                        var packet = new ModelMailAttackTechnicalVictory()
                        {
                            From = data.PlayerSystem.Public,
                            To   = Attacker.Public,
                        };
                        lock (Attacker)
                        {
                            Attacker.Mails.Add(packet);
                        }
                    }
                }
                Finish();
            }

            return(fail);
        }