private void SendAttackCancel() { var data = Repository.GetData; //команда хосту var packet = new ModelMailTrade() { Type = ModelMailTradeType.AttackCancel, From = data.PlayersAll[0].Public, To = Host.Public, }; lock (Host) { Host.Mails.Add(packet); } //команда атакующему packet = new ModelMailTrade() { Type = ModelMailTradeType.AttackCancel, From = data.PlayersAll[0].Public, To = Attacker.Public, }; lock (Attacker) { Attacker.Mails.Add(packet); } }
public ModelStatus sendThings(ModelMailTrade packet, ServiceContext context) { PlayerServer toPlayer; lock (context.Player) { var data = Repository.GetData; toPlayer = data.PlayersAll.FirstOrDefault(p => p.Public.Login == packet.To.Login); if (toPlayer == null) { return(new ModelStatus() { Status = 1, Message = "Destination not found" }); } packet.From = data.PlayersAll.Select(p => p.Public).FirstOrDefault(p => p.Login == packet.From.Login); packet.To = toPlayer.Public; } lock (toPlayer) { toPlayer.Mails.Add(packet); } return(new ModelStatus() { Status = 0, Message = "Load shipped" }); }
public ModelStatus sendThings(ModelMailTrade packet, ServiceContext context) { PlayerServer toPlayer; lock (context.Player) { var data = Repository.GetData; toPlayer = data.PlayersAll.FirstOrDefault(p => p.Public.Login == packet.To.Login); if (toPlayer == null) { return(new ModelStatus() { Status = 1, Message = "Destination not found" }); } packet.From = data.PlayersAll.Select(p => p.Public).FirstOrDefault(p => p.Login == packet.From.Login); packet.To = toPlayer.Public; packet.Created = DateTime.UtcNow; packet.NeedSaveGame = true; } lock (toPlayer) { toPlayer.Mails.Add(packet); } Loger.Log($"Mail SendThings {packet.From.Login}->{packet.To.Login} {packet.ContentString()}"); return(new ModelStatus() { Status = 0, Message = "Load shipped" }); }
public static void MailArrived(ModelMailTrade mail) { try { if (mail.To == null || mail.To.Login != SessionClientController.My.Login) { return; } Action <ModelMailTrade> action; if (TypeMailProcessing.TryGetValue(mail.Type, out action)) { action(mail); } else { Loger.Log("Mail fail: error type " + mail.Type); } } catch (Exception e) { Loger.Log("Mail Exception: " + e.ToString()); } }
public bool SendThings(List <ThingEntry> sendThings, string myLogin, string onlinePlayerLogin, long serverId, int tile) { Loger.Log("Client SendThings"); var packet = new ModelMailTrade() { From = new Player() { Login = myLogin }, To = new Player() { Login = onlinePlayerLogin }, Tile = tile, PlaceServerId = serverId, Things = sendThings }; var stat = TransObject <ModelStatus>(packet, (int)PackageType.Request15, (int)PackageType.Response16); if (stat != null && stat.Status != 0) { ErrorMessage = stat.Message; return(false); } return(stat != null); }
public static void MailProcessAttackTechnicalVictory(ModelMailTrade mail) { Loger.Log("Client MailProcessAttackTechnicalVictory"); if (SessionClientController.Data.AttackModule != null) { SessionClientController.Data.AttackModule.Finish(true); } if (SessionClientController.Data.AttackUsModule != null) { SessionClientController.Data.AttackUsModule.Finish(false); } }
private static WorldObject GetPlace(ModelMailTrade mail, bool softSettlement = true, bool softNewCaravan = false) { if (mail.PlaceServerId <= 0) { Loger.Log("Mail fail: no data"); return(null); } //находим наш объект, кому пришла передача var placeId = UpdateWorldController.GetLocalIdByServerId(mail.PlaceServerId); Loger.Log("Mail " + placeId + " " + (mail.From == null ? "-" : mail.From.Login) + "->" + (mail.To == null ? "-" : mail.To.Login) + ":" + mail.ContentString()); WorldObject place = null; if (placeId == 0) { if (softNewCaravan) { Loger.Log($"Mail softNewCaravan Tile={mail.Tile}"); //если нет, и нужен караван, то возможно он был пересоздан: ищим в той же точке новый place = Find.WorldObjects.AllWorldObjects .Where(o => o is Caravan && o.Tile == mail.Tile && o.Faction == Faction.OfPlayer) .OrderByDescending(o => o.ID) .FirstOrDefault(); } else if (softSettlement) { Loger.Log("Mail softSettlement"); //если нет, и какой-то сбой, посылаем в первый поселек place = Find.WorldObjects.Settlements .FirstOrDefault(f => f.Faction == Faction.OfPlayer && f is MapParent && ((MapParent)f).Map.IsPlayerHome); } } else { place = Find.WorldObjects.AllWorldObjects .FirstOrDefault(o => o.ID == placeId && o.Faction == Faction.OfPlayer); } //создаем объекты if (place == null) { Loger.Log("Mail fail: place is null"); return(null); } return(place); }
public static void MailProcessAttackCancel(ModelMailTrade mail) { Loger.Log("Client MailProcessAttackCancel"); GameAttackTrigger_Patch.ForceSpeed = -1f; //на всякий случай if (SessionClientController.Data.AttackModule != null) { SessionClientController.Data.AttackModule.Clear(); } if (SessionClientController.Data.AttackUsModule != null) { SessionClientController.Data.AttackUsModule.Clear(); } SessionClientController.Disconnected("OCity_GameAttacker_Dialog_ErrorMessage".Translate()); }
public static void MailProcessCreateThings(ModelMailTrade mail) { if (mail.Things == null || mail.Things.Count == 0 || mail.PlaceServerId <= 0) { Loger.Log("Mail fail: no data"); return; } var place = GetPlace(mail); if (place != null) { DropToWorldObject(place, mail.Things, (mail.From == null ? "-" : mail.From.Login)); } }
public static void MailProcessDeleteByServerId(ModelMailTrade mail) { Loger.Log("Client MailProcessDeleteByServerId " + mail.PlaceServerId); if (mail.PlaceServerId <= 0) { Loger.Log("Mail fail: no data"); return; } var place = GetPlace(mail, false, true); if (place != null) { Find.WorldObjects.Remove(place); //автосейв с единым сохранением SessionClientController.SaveGameNow(true); } }
/// <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); //команда хосту var packet = new ModelMailTrade() { Type = ModelMailTradeType.AttackTechnicalVictory, From = data.PlayersAll[0].Public, To = Host.Public, }; lock (Host) { Host.Mails.Add(packet); } //команда атакующему packet = new ModelMailTrade() { Type = ModelMailTradeType.AttackCancel, From = data.PlayersAll[0].Public, To = Attacker.Public, }; var packet2 = new ModelMailTrade() { Type = ModelMailTradeType.DeleteByServerId, From = data.PlayersAll[0].Public, To = Attacker.Public, PlaceServerId = InitiatorPlaceServerId, Tile = InitiatorPlaceTile, }; lock (Attacker) { Attacker.Mails.Add(packet); Attacker.Mails.Add(packet2); } } } else { //Если отключился хост //то уничтожение поселения хоста var packet1 = new ModelMailTrade() { Type = ModelMailTradeType.AttackCancel, From = data.PlayersAll[0].Public, To = Host.Public, }; var packet2 = new ModelMailTrade() { Type = ModelMailTradeType.DeleteByServerId, From = data.PlayersAll[0].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 ModelMailTrade() { Type = ModelMailTradeType.AttackCancel, From = data.PlayersAll[0].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 ModelMailTrade() { Type = ModelMailTradeType.AttackTechnicalVictory, From = data.PlayersAll[0].Public, To = Attacker.Public, }; lock (Attacker) { Attacker.Mails.Add(packet); } } } Finish(); } return(fail); }