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); } }
/// <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); }