public bool Run(ServiceContext context) { ///Определяем прошел ли срок с момента запуска последнего события if (!AlreadyStart) { /* * var currentIncident = context.Player.FunctionMails * .Any(m => (m as FMailIncident)?.AlreadyStart ?? false * && (m as FMailIncident)?.NumberOrder == NumberOrder); */ var currentIncident = context.Player.FunctionMails .Where(m => m is FMailIncident) .Cast <FMailIncident>() .Where(m => m.AlreadyStart && m.NumberOrder == NumberOrder) .Any(); if (currentIncident) { return(false); } ///Перед нами в очереди никого. Начинает операцию! ///Проверяем нужно ли перед наподением предупредить var delay = Mail.IncidentMult >= 5 ? CalcDelayStart() : 0; SendTick = context.Player.Public.LastTick + delay; if (delay > 0) { Loger.Log($"IncidentLod FMailIncident.Run 1 NO={NumberOrder} SendTick={SendTick} MailSended={MailSended} EndTick={EndTick}"); context.Player.Mails.Add(GetWarningMail(context)); return(false); } } ///Если ожидание перед атакой прошло, то отправляем основное письмо с инциндентом if (context.Player.Public.LastTick < SendTick) { return(false); } if (!MailSended) { Loger.Log($"IncidentLod FMailIncident.Run 2 NO={NumberOrder} SendTick={SendTick} MailSended={MailSended} EndTick={EndTick}"); var countInOrder_ = context.Player.FunctionMails.Count(m => m != this && (m as FMailIncident)?.NumberOrder == NumberOrder).ToString(); context.Player.Mails.Add(Mail); SendTick = context.Player.Public.LastTick; MailSended = true; WorthBefore = GetWorthTarget(context.Player); context.Player.AttacksWonCount++; //не прибавлять положительные инцинденты! CallIncident.IncidentLogAppend("SendMail", Mail, $"{(int)WorthBefore};;{NumberOrder};{countInOrder_}"); return(false); } ///Уже отправили письмо. Проверяем прошла ли минимальная задержка. if (context.Player.Public.LastTick - SendTick < ServerManager.ServerSettings.GeneralSettings.IncidentTickDelayBetween) { return(false); } ///После суток оцениваем задержку и устанавливаем поле EndTick. if (EndTick == 0) { Loger.Log($"IncidentLod FMailIncident.Run 3 NO={NumberOrder} SendTick={SendTick} MailSended={MailSended} EndTick={EndTick}"); var countInOrder_ = context.Player.FunctionMails.Count(m => m != this && (m as FMailIncident)?.NumberOrder == NumberOrder).ToString(); WorthAfter = GetWorthTarget(context.Player); var delayAfterMail = CalcDelayEnd(); EndTick = SendTick + delayAfterMail; if (MainHelper.DebugMode) { context.Player.Mails.Add(new ModelMailMessadge() { From = Repository.GetData.PlayerSystem.Public, To = context.Player.Public, type = ModelMailMessadge.MessadgeTypes.Neutral, label = "Dev: Сутки после инциндента", text = "Прошли сутки после инциндента. Начато ожидание на восстановление перед разблокированием очереди №" + NumberOrder.ToString() + " дней: " + (delayAfterMail / 60000f).ToString("N2") + ". Всего ещё в этой очереди: " + countInOrder_ }); } CallIncident.IncidentLogAppend("DayAfterMail", Mail, $"{(int)WorthBefore}->{(int)WorthAfter}({(int)(WorthAfter - WorthBefore)});" + $"{(delayAfterMail / 60000f).ToString("N2")};{NumberOrder};{countInOrder_}"); } ///Просто ждем окончания EndTick и убираем себя, чтобы очистить очередь ожидания. if (context.Player.Public.LastTick < EndTick) { return(false); } Loger.Log($"IncidentLod FMailIncident.Run 4 NO={NumberOrder} SendTick={SendTick} MailSended={MailSended} EndTick={EndTick}"); var countInOrder = context.Player.FunctionMails.Count(m => m != this && (m as FMailIncident)?.NumberOrder == NumberOrder).ToString(); if (MainHelper.DebugMode) { context.Player.Mails.Add(new ModelMailMessadge() { From = Repository.GetData.PlayerSystem.Public, To = context.Player.Public, type = ModelMailMessadge.MessadgeTypes.Neutral, label = "Dev: Инциндент разблокировал очередь", text = "Инциндент разблокировал очередь №" + NumberOrder.ToString() + ". Всего ещё в этой очереди: " + countInOrder }); } var worth = GetWorthTarget(context.Player); CallIncident.IncidentLogAppend("End", Mail, $"{(int)WorthBefore}->{(int)WorthAfter}->{(int)worth}({(int)(worth - WorthBefore)});;{NumberOrder};{countInOrder}"); return(true); }
public ModelStatus Execute(ref PlayerServer player, Chat chat, List <string> argsM) { Loger.Log("IncidentLod CallIncidentCmd Execute 1"); var ownLogin = player.Public.Login; //базовая проверка аргументов if (argsM.Count < 2) { return(_chatManager.PostCommandPrivatPostActivChat(ChatCmdResult.IncorrectSubCmd, ownLogin, chat, "OC_Incidents_CallIncidents_Err1")); } //собираем данные var type = CallIncident.ParseIncidentTypes(argsM[0]); PlayerServer targetPlayer = Repository.GetPlayerByLogin(argsM[1]); if (targetPlayer == null) { return(_chatManager.PostCommandPrivatPostActivChat(ChatCmdResult.UserNotFound, ownLogin, chat, "User " + argsM[1] + " not found")); } long serverId = 0; if (argsM.Count > 2) { serverId = Int64.Parse(argsM[2]); } int mult = 1; if (argsM.Count > 3) { mult = Int32.Parse(argsM[3]); } // walk, random, air IncidentArrivalModes?arrivalMode = null; if (argsM.Count > 4) { arrivalMode = CallIncident.ParseArrivalMode(argsM[4]); } string faction = null; if (argsM.Count > 5) { faction = CallIncident.ParseFaction(argsM[5]); } Loger.Log("IncidentLod CallIncidentCmd Execute 2"); var error = CallIncident.CreateIncident(player, targetPlayer, serverId, type, mult, arrivalMode, faction); if (error != null) { Loger.Log("IncidentLod CallIncidentCmd Execute error: " + error); return(_chatManager.PostCommandPrivatPostActivChat(ChatCmdResult.IncorrectSubCmd, ownLogin, chat, error)); } //var msg = argsM[0] + " lvl " + mult + " for user " + targetPlayer.Public.Login + " from " + ownLogin; //_chatManager.AddSystemPostToPublicChat(msg); Loger.Log("IncidentLod CallIncidentCmd Execute 3"); return(new ModelStatus() { Status = 0 }); }