Exemplo n.º 1
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.º 2
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.º 3
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()
                });
            }
        }