public MatchPlayerController(IMatchEngine engine, int playerIndex, Dictionary <int, VoxelAbilities>[] allAbilities)
        {
            m_playerIndex  = playerIndex;
            m_engine       = engine;
            m_allAbilities = allAbilities;

            m_engine.Map.Root.ForEach(cell =>
            {
                cell.ForEach(voxelData =>
                {
                    int owner = voxelData.Owner;
                    if (owner == m_playerIndex)
                    {
                        if (VoxelData.IsUnit(voxelData.Type))
                        {
                            Coordinate coordinate = new Coordinate(cell, voxelData);
                            CreateUnitController(voxelData, coordinate);
                        }
                        else
                        {
                            if (!voxelData.IsNeutral)
                            {
                                CreateAsset(voxelData, cell);
                            }
                        }
                    }
                });
            });

            m_units         = m_idToUnit.Values.ToArray();
            m_commandBuffer = new CommandsArray(new Cmd[m_idToUnit.Count]);
        }
        private bool IsTargetForAnyone(VoxelData target)
        {
            if (target.Weight < GameConstants.MinVoxelActorWeight)
            {
                return(false);
            }

            for (int i = 0; i < m_selectedUnitDescriptors.Length; ++i)
            {
                SelectionDescriptor descriptor = m_selectedUnitDescriptors[i];
                int playerIndex = PlayerIndex;

                if (target.IsTargetFor(descriptor.Type, descriptor.Weight, playerIndex))
                {
                    bool targetIsUnit = VoxelData.IsUnit(target.Type);
                    if (!targetIsUnit || target.Owner != PlayerIndex)
                    {
                        if (descriptor.Type == (int)KnownVoxelTypes.Bomb || targetIsUnit)
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
        public void Init(int playerIndex, Dictionary <int, VoxelAbilities>[] allAbilities)
        {
            m_allAbilities = allAbilities;

            m_idToUnit.Clear();
            m_idToAsset.Clear();
            m_voxelDataToId.Clear();

            m_playerIndex   = playerIndex;
            m_isLocalPlayer = m_gameState.IsLocalPlayer(m_playerIndex);

            Dictionary <int, VoxelAbilities> abilities = m_allAbilities[m_playerIndex];

            m_voxelMap.Map.Root.ForEach(cell =>
            {
                cell.ForEach(voxelData =>
                {
                    int owner = voxelData.Owner;
                    if (owner == m_playerIndex)
                    {
                        if (VoxelData.IsUnit(voxelData.Type))
                        {
                            Coordinate coordinate = new Coordinate(cell, voxelData);
                            CreateUnitController(voxelData, coordinate);
                        }
                        else
                        {
                            if (!voxelData.IsNeutral)
                            {
                                CreateAsset(voxelData, abilities[voxelData.Type], cell);
                            }
                        }
                    }
                });
            });
        }
        private List <long> PostprocessCommand(List <long> spawnedUnitsList, Cmd cmd, IMatchUnitControllerCli unitController)
        {
            if (cmd.Code == CmdCode.Split || cmd.Code == CmdCode.Split4)
            {
                CoordinateCmd splitCmd = (CoordinateCmd)cmd;
                for (int i = 0; i < splitCmd.Coordinates.Length; ++i)
                {
                    Coordinate coordinate = splitCmd.Coordinates[i];
                    VoxelData  voxelData  = m_voxelMap.Map.Get(coordinate);
                    if (voxelData != null)
                    {
                        if (spawnedUnitsList == null)
                        {
                            spawnedUnitsList = new List <long>();
                        }

                        spawnedUnitsList.Add(m_identity);
                        CreateUnitController(voxelData, coordinate);
                    }
                }
            }
            else if (cmd.Code == CmdCode.Convert)
            {
                Coordinate coordinate = unitController.DataController.Coordinate;
                MapCell    cell       = m_voxelMap.Map.Get(coordinate.Row, coordinate.Col, coordinate.Weight);
                VoxelData  voxelData  = cell.GetVoxelDataAt(coordinate.Altitude);
                if (voxelData != null)
                {
                    if (VoxelData.IsUnit(voxelData.Type))
                    {
                        if (spawnedUnitsList == null)
                        {
                            spawnedUnitsList = new List <long>();
                        }

                        spawnedUnitsList.Add(m_identity);
                        CreateUnitController(voxelData, coordinate);
                    }
                    else
                    {
                        CreateAsset(voxelData, m_allAbilities[voxelData.Owner][voxelData.Type], cell);
                    }
                }
            }
            else if (cmd.Code == CmdCode.CreateAssignment)
            {
                CreateAssignmentCmd addCmd = (CreateAssignmentCmd)cmd;
                if (addCmd.CreatePreview)
                {
                    Coordinate coord     = addCmd.PreviewCoordinate;
                    MapCell    cell      = m_voxelMap.Map.Get(coord.Row, coord.Col, coord.Weight);
                    VoxelData  voxelData = cell.GetPreviewAt(m_playerIndex, coord.Altitude);
                    Debug.Assert(voxelData != null);

                    if (spawnedUnitsList == null)
                    {
                        spawnedUnitsList = new List <long>();
                    }

                    spawnedUnitsList.Add(m_identity);
                    CreateUnitController(voxelData, coord);
                }

                AssignmentsController.CreateAssignment(addCmd.GroupId, addCmd.UnitIndex, addCmd.TaskLaunchInfo, addCmd.HasTarget, addCmd.TargetPlayerIndex, addCmd.TargetId);
            }

            return(spawnedUnitsList);
        }
        private bool PostprocessCmd(bool unitsChanged, IMatchUnitController unitController, Cmd cmd)
        {
            if (cmd.IsFailed)
            {
                return(unitsChanged);
            }
            if (cmd.Code == CmdCode.Split || cmd.Code == CmdCode.Split4)
            {
                CoordinateCmd splitCmd = (CoordinateCmd)cmd;
                for (int c = 0; c < splitCmd.Coordinates.Length; ++c)
                {
                    Coordinate coordinate = splitCmd.Coordinates[c];
                    VoxelData  voxelData  = m_engine.Map.Get(coordinate);

                    if (voxelData != null)
                    {
                        CreateUnitController(voxelData, coordinate);
                        unitsChanged = true;
                    }
                }
            }
            else if (cmd.Code == CmdCode.Convert)
            {
                Coordinate coord     = unitController.DataController.Coordinate;
                MapCell    cell      = m_engine.Map.Get(coord.Row, coord.Col, coord.Weight);
                VoxelData  voxelData = cell.GetVoxelDataAt(coord.Altitude);

                if (voxelData != null)
                {
                    if (VoxelData.IsUnit(voxelData.Type))
                    {
                        CreateUnitController(voxelData, unitController.DataController.Coordinate);
                        unitsChanged = true;
                    }
                    else
                    {
                        CreateAsset(voxelData, cell);
                    }
                }
            }
            else if (cmd.Code == CmdCode.CreateAssignment)
            {
                CreateAssignmentCmd addCmd = (CreateAssignmentCmd)cmd;
                if (addCmd.CreatePreview)
                {
                    Coordinate coord     = addCmd.PreviewCoordinate;
                    MapCell    cell      = m_engine.Map.Get(coord.Row, coord.Col, coord.Weight);
                    VoxelData  voxelData = cell.GetPreviewAt(m_playerIndex, coord.Altitude);
                    Debug.Assert(voxelData != null);
                    CreateUnitController(voxelData, coord);

                    addCmd.HasTarget         = true;
                    addCmd.TargetId          = voxelData.UnitOrAssetIndex;
                    addCmd.TargetPlayerIndex = voxelData.Owner;
                }

                m_assignmentController.CreateAssignment(addCmd.GroupId, addCmd.UnitIndex, addCmd.TaskLaunchInfo, addCmd.HasTarget, addCmd.TargetPlayerIndex, addCmd.TargetId);
            }

            return(unitsChanged);
        }