Имеется код
public void SetTeam(Player player)
{
foreach (Team team in Teams.ToArray())
{
if (team.IsFull())
{
continue;
}
else
{
if (!team.InCommand(player))
{
team.AddPlayer(player);
}
break;
}
}
}
Данным кодом я заполняю команды игроками, их всего две, по 1 или 2 игрока, в зависимости от режима. Вот так распределяю:
foreach (Player player in GetPlayers().ToArray())
{
SetTeam(player);
Prespawn(player);
TeleportToTeamSpawn(player);
}
Но бывает что игроков распределяет некорректно, бывает что одного игрока бросает в разные команд. Распределение проводиться в таймере.
Team.cs
public class Team
{
public string Name { get; set; } = "0";
public int MaxPlayers { get; set; } = 0;
public bool IsEliminated { get; set; } = false;
public Vector3 Spawn { get; set; } = Vector3.Zero;
public Vector3 Portal { get; set; } = Vector3.Zero;
public int Points { get; set; } = 0;
public List<Player> Players = new List<Player>();
public Team(int maxplayers, string name)
{
MaxPlayers = maxplayers;
Name = name;
}
public void AddPlayer(Player player)
{
if (IsFull()) return;
if (!Players.Contains(player))
{
Players.Add(player);
}
}
public void RemovePlayer(Player player)
{
if (Players.Contains(player))
{
Players.Remove(player);
}
}
public bool IsFull()
{
if (Players.Count == MaxPlayers)
{
return true;
}
return false;
}
public void Reset()
{
IsEliminated = false;
Points = 0;
Players.Clear();
Players = null;
Players = new List<Player>();
}
public bool InCommand(Player player)
{
if (Players.Find((x) => x.Username.ToLower() == player.Username.ToLower()) is Player)
{
return true;
}
return false;
}
}
Есть догадка что это происходит из-за разных потоков.
Думаю, что догадка правильная.
Класс List<T>
имеет свойство SyncRoot
Попробуй переписать все свои обращения к методам коллекции следующим образом...
lock (Players.SyncRoot)
{
// Access the collection.
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Использую данную функцию для того чтобы поменять значение флагаТо есть имею переменную которая принимает true or false
У меня есть презентацияВ неё с помощью c# хочу сделать например перетаскивание объектов или что то другое
Задача запустить батник для регистрации DLL, на компе под админом все работаетНо если запустить на другом компе под пользователем пишет "Неверно...