Пример #1
0
        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);
        }
Пример #2
0
        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
            });
        }