Exemplo n.º 1
0
        public AttackInitiatorFromSrv AttackOnlineInitiator(AttackInitiatorToSrv fromClient)
        {
            Loger.Log("Client AttackOnlineInitiator " + fromClient.State);
            var stat = TransObject <AttackInitiatorFromSrv>(fromClient, 27, 28);

            return(stat);
        }
Exemplo n.º 2
0
        public AttackInitiatorFromSrv AttackOnlineInitiator(AttackInitiatorToSrv fromClient)
        {
            //Loger.Log("Client AttackOnlineInitiator " + fromClient.State);
            var stat = TransObject <AttackInitiatorFromSrv>(fromClient, (int)PackageType.Request27, (int)PackageType.Response28);

            return(stat);
        }
Exemplo n.º 3
0
        public AttackInitiatorFromSrv AttackOnlineInitiator(AttackInitiatorToSrv fromClient)
        {
            if (Player == null)
            {
                return(null);
            }

            lock (Player)
            {
                var timeNow = DateTime.UtcNow;
                var data    = Repository.GetData;
                var res     = new AttackInitiatorFromSrv()
                {
                };

                //инициализируем общий объект
                if (fromClient.StartHostPlayer != null)
                {
                    if (Player.AttackData != null)
                    {
                        res.ErrorText = "There is an active attack";
                        return(res);
                    }
                    var hostPlayer = data.PlayersAll.FirstOrDefault(p => p.Public.Login == fromClient.StartHostPlayer);

                    if (hostPlayer == null)
                    {
                        res.ErrorText = "Player not found";
                        return(res);
                    }
                    if (hostPlayer.AttackData != null)
                    {
                        res.ErrorText = "The player participates in the attack";
                        return(res);
                    }

                    var att = new AttackServer();
                    var err = att.New(Player, hostPlayer, fromClient);
                    if (err != null)
                    {
                        res.ErrorText = err;
                        return(res);
                    }
                }
                if (Player.AttackData == null)
                {
                    res.ErrorText = "Unexpected error, no data";
                    return(res);
                }

                //передаем управление общему объекту
                res = Player.AttackData.RequestInitiator(fromClient);

                return(res);
            }
        }
Exemplo n.º 4
0
        public string New(PlayerServer player, PlayerServer hostPlayer, AttackInitiatorToSrv fromClient, bool testMode)
        {
            if (ServerManager.ServerSettings.GeneralSettings.EnablePVP)
            {
                return("PVP online disable on this server");
            }
            if (!player.Online || !hostPlayer.Online)
            {
                Loger.Log($"Server AttackServer {Attacker.Public.Login} -> {Host.Public.Login} canceled: Attack not possible: player offline");
                return("Attack not possible: player offline");
            }
            var err = AttackUtils.CheckPossibilityAttack(player, hostPlayer, fromClient.InitiatorPlaceServerId, fromClient.HostPlaceServerId
                                                         , ServerManager.ServerSettings.ProtectingNovice);

            if (err != null)
            {
                Loger.Log($"Server AttackServer {Attacker.Public.Login} -> {Host.Public.Login} canceled: {err}");
                return(err);
            }

            TestMode               = testMode;
            Attacker               = player;
            Host                   = hostPlayer;
            Attacker.AttackData    = this;
            Host.AttackData        = this;
            HostPlaceServerId      = fromClient.HostPlaceServerId;
            InitiatorPlaceServerId = fromClient.InitiatorPlaceServerId;
            var data = Repository.GetData;
            var woip = data.WorldObjects.FirstOrDefault(wo => wo.ServerId == InitiatorPlaceServerId);

            if (woip != null)
            {
                InitiatorPlaceTile = woip.Tile;
            }

            NewPawns        = new List <ThingEntry>();
            NewPawnsId      = new List <int>();
            NewThings       = new List <ThingTrade>();
            NewThingsId     = new List <int>();
            NewCorpses      = new List <AttackCorpse>();
            Delete          = new List <int>();
            UpdateState     = new Dictionary <int, AttackThingState>();
            UpdateCommand   = new Dictionary <int, AttackPawnCommand>();
            NeedNewThingIDs = new HashSet <int>();

            CreateTime       = DateTime.UtcNow;
            AttackUpdateTick = 0;

            if (!TestMode)
            {
                Host.Public.LastPVPTime = DateTime.UtcNow;
            }

            Loger.Log($"Server AttackServer {Attacker.Public.Login} -> {Host.Public.Login} New");
            return(null);
        }
Exemplo n.º 5
0
        public string New(PlayerServer player, PlayerServer hostPlayer, AttackInitiatorToSrv fromClient)
        {
            Attacker               = player;
            Host                   = hostPlayer;
            Attacker.AttackData    = this;
            Host.AttackData        = this;
            InitiatorPlaceServerId = fromClient.InitiatorPlaceServerId;
            HostPlaceServerId      = fromClient.HostPlaceServerId;

            NewPawns      = new List <ThingEntry>();
            NewPawnsId    = new List <int>();
            NewThings     = new List <ThingEntry>();
            NewThingsId   = new List <int>();
            Delete        = new List <int>();
            UpdateState   = new Dictionary <int, AttackThingState>();
            UpdateCommand = new Dictionary <int, AttackPawnCommand>();
            return(null);
        }
Exemplo n.º 6
0
        public AttackInitiatorFromSrv RequestInitiator(AttackInitiatorToSrv fromClient)
        {
            lock (SyncObj)
            {
                //первые 5 минут не проверяем на отключения, т.к. загрузка может быть долгой (а дисконектит уже после 10 сек)
                if ((fromClient.State == 10 || (DateTime.UtcNow - CreateTime).TotalSeconds > 8 * 60) &&
                    CheckConnect(true))
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State
                    });
                }
                if (fromClient.State == 0 && fromClient.StartHostPlayer != null)
                {
                    State    = 1;
                    TestMode = fromClient.TestMode;
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State
                    });
                }
                if (fromClient.State == 1)
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State
                    });
                }
                if (fromClient.State == 2 && State >= 2 && fromClient.Pawns != null && fromClient.Pawns.Count > 0)
                {
                    Pawns = fromClient.Pawns;
                    //После передачи своих пешек, в ответ передаются данные карты и начинается её длительное создание
                    //в это время включаем на хосте обязательную паузу
                    //После загрузки пауза обновлется на 1 минуту, чтобы атакующий огляделся (ищи SetPauseOnTimeToHost в GameAttacker)
                    SetPauseOnTimeToHost = DateTime.UtcNow.AddMinutes(8);
                    Loger.Log("Server Set 1 SetPauseOnTimeToHost=" + SetPauseOnTimeToHost.Value.ToGoodUtcString());

                    return(new AttackInitiatorFromSrv()
                    {
                        State = State,
                        TestMode = TestMode,
                    });
                }
                if (fromClient.State == 3 && State >= 3)
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State,
                        MapSize = MapSize,
                        TerrainDefNameCell = TerrainDefNameCell,
                        TerrainDefName = TerrainDefName,
                        Thing = Thing,
                        ThingCell = ThingCell,
                    });
                }

                if (fromClient.State == 10 && State < 10)
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State,
                    });
                }
                if (fromClient.State == 10)
                {
                    AttackUpdateTick++;

                    if (StartTime == DateTime.MinValue)
                    {
                        Loger.Log($"Server AttackServer {Attacker.Public.Login} -> {Host.Public.Login} Start");
                        StartTime = DateTime.UtcNow;
                    }

                    if (fromClient.VictoryHostToHost)
                    {
                        VictoryHostToHost = fromClient.VictoryHostToHost;
                    }

                    if (fromClient.TerribleFatalError)
                    {
                        Loger.Log($"Server AttackServer TerribleFatalError {AttackUpdateTick}");
                        if (AttackUpdateTick != 2)
                        {
                            //такая ошибка с отменой атаки возможна только на 2 обновлении (на 1 создаются все пешки, на 2 проверка, что все переданы)
                            //если это не 2, то считаем, что атакующий жульничает
                            VictoryHostToHost = true;
                        }
                        else
                        {
                            TerribleFatalError = fromClient.TerribleFatalError;

                            SendAttackCancel();
                            Finish();
                        }
                    }

                    if (fromClient.SetPauseOnTimeToHost != TimeSpan.MinValue)
                    {
                        SetPauseOnTimeToHost = DateTime.UtcNow + fromClient.SetPauseOnTimeToHost;
                        Loger.Log("Server Set 2 SetPauseOnTimeToHost=" + SetPauseOnTimeToHost.Value.ToGoodUtcString());
                    }

                    if (fromClient.UpdateCommand != null && fromClient.UpdateCommand.Count > 0)
                    {
                        //объединяем
                        for (int i = 0; i < fromClient.UpdateCommand.Count; i++)
                        {
                            var id = fromClient.UpdateCommand[i].HostPawnID;
                            UpdateCommand[id] = fromClient.UpdateCommand[i];
                        }
                    }

                    if (fromClient.NeedNewThingIDs != null && fromClient.NeedNewThingIDs.Count > 0)
                    {
                        //объединяем
                        for (int i = 0; i < fromClient.NeedNewThingIDs.Count; i++)
                        {
                            NeedNewThingIDs.Add(fromClient.NeedNewThingIDs[i]);
                        }
                    }

                    var res = new AttackInitiatorFromSrv()
                    {
                        State           = State,
                        NewPawns        = NewPawns,
                        NewPawnsId      = NewPawnsId,
                        NewThings       = NewThings,
                        NewThingsId     = NewThingsId,
                        NewCorpses      = NewCorpses,
                        Delete          = Delete,
                        UpdateState     = UpdateState.Values.ToList(),
                        Finishing       = VictoryAttacker != null,
                        VictoryAttacker = VictoryAttacker != null ? VictoryAttacker.Value : false,
                    };
                    NewPawns    = new List <ThingEntry>();
                    NewPawnsId  = new List <int>();
                    NewThings   = new List <ThingTrade>();
                    NewThingsId = new List <int>();
                    NewCorpses  = new List <AttackCorpse>();
                    Delete      = new List <int>();
                    UpdateState = new Dictionary <int, AttackThingState>();

                    if (VictoryAttacker != null)
                    {
                        Finish();
                    }

                    return(res);
                }

                return(new AttackInitiatorFromSrv()
                {
                    ErrorText = "Unexpected request " + fromClient.State.ToString() + "! Was expected" + State.ToString()
                });
            }
        }
Exemplo n.º 7
0
        public AttackInitiatorFromSrv RequestInitiator(AttackInitiatorToSrv fromClient)
        {
            lock (SyncObj)
            {
                if (fromClient.State == 0 && fromClient.StartHostPlayer != null)
                {
                    State = 1;
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State
                    });
                }
                if (fromClient.State == 1)
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State
                    });
                }
                if (fromClient.State == 2 && State >= 2 && fromClient.Pawns != null && fromClient.Pawns.Count > 0)
                {
                    Pawns = fromClient.Pawns;
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State
                    });
                }
                if (fromClient.State == 3 && State >= 3)
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State,
                        MapSize = MapSize,
                        TerrainDefNameCell = TerrainDefNameCell,
                        TerrainDefName = TerrainDefName,
                        Thing = Thing,
                        ThingCell = ThingCell,
                    });
                }

                if (fromClient.State == 10 && State < 10)
                {
                    return(new AttackInitiatorFromSrv()
                    {
                        State = State,
                    });
                }
                if (fromClient.State == 10)
                {
                    if (fromClient.UpdateCommand != null && fromClient.UpdateCommand.Count > 0)
                    {
                        //объединяем
                        for (int i = 0; i < fromClient.UpdateCommand.Count; i++)
                        {
                            var id = fromClient.UpdateCommand[i].HostPawnID;
                            UpdateCommand[id] = fromClient.UpdateCommand[i];
                        }
                    }

                    var res = new AttackInitiatorFromSrv()
                    {
                        State       = State,
                        NewPawns    = NewPawns,
                        NewPawnsId  = NewPawnsId,
                        NewThings   = NewThings,
                        NewThingsId = NewThingsId,
                        Delete      = Delete,
                        UpdateState = UpdateState.Values.ToList()
                    };
                    NewPawns    = new List <ThingEntry>();
                    NewPawnsId  = new List <int>();
                    NewThings   = new List <ThingEntry>();
                    NewThingsId = new List <int>();
                    Delete      = new List <int>();
                    UpdateState = new Dictionary <int, AttackThingState>();
                    return(res);
                }

                return(new AttackInitiatorFromSrv()
                {
                    ErrorText = "Unexpected request " + fromClient.State.ToString() + "! Was expected" + State.ToString()
                });
            }
        }