Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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"
            });
        }
Exemple #3
0
        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"
            });
        }
Exemple #4
0
        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);
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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());
        }
Exemple #9
0
        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));
            }
        }
Exemple #10
0
        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);
            }
        }
Exemple #11
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);

                        //команда хосту
                        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);
        }