Народ, подскажите, пожалуйста, куда копать...Идей нет, что еще проверить. Пишу стратегию на C#. У меня есть словарь, в котором хранятся клетки с ресурсами, ключ-это их Id. Я в функции поиска ближайшего ресурса прохожу этот словарь через foreach, и возвращаю значение ключа наиболее подходящего элемента. После этого я пытаюсь создать MoveAction, в котором координата той клетки с ресурсами, и у меня при верификации стратегии на сервере падает с исключением KeyNotFoundException на этой строчке. В локальном раннере всё работает.
Псевдокод:
int? GetClosestResourceId(Vec2Int builderPosition)
{
int minSquaredDistance = -1;
int? answer = null;
foreach (var cachedEntity in cachedEntities)
{
...
answer = cachedEntity.Key;
minSquaredDistance = squaredDistance;
...
}
return answer;
}
void ProcessWorker()
{
...
int? resourceToMine = GetClosestResourceId(position);
if (resourceToMine.HasValue)
{
MoveAction move = new MoveAction(cachedEntities[resourceToMine.Value].Position, true, false); /// < Вот тут при верификации исключение System.Collections.Generic.KeyNotFoundException: The given key '5565' was not present in the dictionary
AttackAction attack = new AttackAction(resourceToMine.Value, null);
actionsDictionary.Add(unit.entityId, new EntityAction()
{
MoveAction = move,
AttackAction = attack
});
unit.currentAction = CurrentAction.Mining;
}
}
Чудес не бывает. Если клал id, то он там и должен быть. Разве что есть код, который их удаляет. Ты точно считываешь то, что там лежит строго после записи? Что за processWorker? Многопоточности там случаем нет или она по определению запрещена?