public AttackInitiatorFromSrv AttackOnlineInitiator(AttackInitiatorToSrv fromClient) { Loger.Log("Client AttackOnlineInitiator " + fromClient.State); var stat = TransObject <AttackInitiatorFromSrv>(fromClient, 27, 28); return(stat); }
public AttackInitiatorFromSrv AttackOnlineInitiator(AttackInitiatorToSrv fromClient) { //Loger.Log("Client AttackOnlineInitiator " + fromClient.State); var stat = TransObject <AttackInitiatorFromSrv>(fromClient, (int)PackageType.Request27, (int)PackageType.Response28); return(stat); }
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); } }
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); }
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); }
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() }); } }
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() }); } }