private void CreateUnitController(VoxelData voxelData, Coordinate coordinate)
        {
            voxelData.UnitOrAssetIndex = m_identity;

            IMatchUnitControllerCli unit = MatchFactoryCli.CreateUnitController(m_voxelMap.Map, coordinate, voxelData.Type, m_playerIndex, m_allAbilities);

            if (VoxelData.IsControllableUnit(voxelData.Type))
            {
                m_controllableUnitsCount++;
            }

            m_idToUnit.Add(m_identity, unit);

            int radius = unit.DataController.Abilities.VisionRadius;

            m_voxelMap.Map.ForEachInRadius(coordinate, radius, (observedCell, pos) =>
            {
                ObserveCell(unit.DataController.ControlledData.Owner, observedCell, pos, coordinate.Weight);
            });

            m_minimap.Spawn(voxelData, coordinate);

            unchecked
            {
                m_identity++;
            }

            if (UnitCreated != null)
            {
                UnitCreated(unit);
            }
        }
        public void DestroyAllUnitsAndAssets()
        {
            long[] unitIds = m_idToUnit.Keys.ToArray();

            for (int i = 0; i < unitIds.Length; ++i)
            {
                long unitId = unitIds[i];

                IMatchUnitControllerCli unit = m_idToUnit[unitId];
                if (!unit.DataController.IsAlive)
                {
                    continue;
                }
                Coordinate c    = unit.DataController.Coordinate;
                MapCell    cell = m_voxelMap.Map.Get(c.Row, c.Col, c.Weight);

                cell.RemoveVoxelDataAndDecreaseHeight(unit.DataController.ControlledData);

                if (unit.DataController.ControlledData.VoxelRef != null)
                {
                    unit.DataController.ControlledData.VoxelRef.Explode(1.0f, unit.DataController.ControlledData.Health);
                }

                RemoveUnitController(unitId);
            }

            long[] assetIds = m_idToAsset.Keys.ToArray();
            for (int i = 0; i < assetIds.Length; ++i)
            {
                long          assetId = assetIds[i];
                MatchAssetCli asset   = m_idToAsset[assetId];

                asset.Cell.RemoveVoxelDataAndDecreaseHeight(asset.VoxelData);

                if (asset.VoxelData.VoxelRef != null)
                {
                    asset.VoxelData.VoxelRef.Explode(0, asset.VoxelData.Health);
                }

                RemoveAsset(asset.VoxelData);
            }
        }
        private void RemoveUnitController(long unitId)
        {
            IMatchUnitControllerCli unitController = m_idToUnit[unitId];

            if (VoxelData.IsControllableUnit(unitController.Type))
            {
                m_controllableUnitsCount--;
            }

            Coordinate coordinate = unitController.DataController.Coordinate;
            int        radius     = unitController.DataController.Abilities.VisionRadius;

            m_voxelMap.Map.ForEachInRadius(coordinate, radius, (ignoredCell, pos) =>
            {
                IgnoreCell(unitController.DataController.ControlledData.Owner, ignoredCell, pos, coordinate.Weight);
            });

            m_minimap.Die(unitController.DataController.ControlledData, unitController.DataController.Coordinate);
            m_idToUnit.Remove(unitId);

            //Does not needed because all nessesary actions and event unsubscription performed in OnVoxelRefReset event handler
            //MatchFactoryCli.DestroyUnitController(unitController);

            if (unitController.Assignment != null)
            {
                AssignmentsController.RemoveAssignment(unitController, DieCallback);
            }

            if (unitController.TargetForAssignments != null)
            {
                AssignmentsController.RemoveTargetFromAssignments(unitController, DieCallback);
            }

            if (UnitRemoved != null)
            {
                UnitRemoved(unitController);
            }
        }
Пример #4
0
 public static void DestroyUnitController(IMatchUnitControllerCli controller)
 {
     controller.Destroy();
 }
        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);
        }
        public void Execute(Cmd[] commands, long tick, long lagTicks)
        {
            HashSet <long> deadUnitsHs      = null;
            List <long>    spawnedUnitsList = null;

            for (int c = 0; c < commands.Length; ++c)
            {
                Cmd cmd = commands[c];
                if (cmd == null)
                {
                    continue;
                }

                if (cmd.Code == CmdCode.LeaveRoom)
                {
                    m_isInRoom = false;
                }
                else
                {
                    IMatchUnitControllerCli unitController = m_idToUnit[cmd.UnitIndex];

                    long duration = cmd.Duration;
                    duration -= lagTicks;
                    duration  = Math.Max(0, duration);

                    cmd.Duration = (int)duration;

                    IVoxelDataController dc        = unitController.DataController;
                    Coordinate           prevCoord = dc.Coordinate;

                    int radius = unitController.DataController.Abilities.VisionRadius;

                    unitController.ExecuteCommand(cmd, tick);
                    if (prevCoord != dc.Coordinate)
                    {
                        HandleCoordinateChange(dc, prevCoord, radius);
                    }

                    IList <VoxelDataCellPair> createdVoxels = unitController.CreatedVoxels;
                    if (createdVoxels.Count != 0)
                    {
                        CreateAssets(createdVoxels);
                        for (int i = 0; i < m_otherPlayerControllers.Length; ++i)
                        {
                            m_otherPlayerControllers[i].CreateAssets(createdVoxels);
                        }
                    }

                    IList <VoxelData> eatenOrDestroyed = unitController.EatenOrDestroyedVoxels;
                    if (eatenOrDestroyed.Count != 0)
                    {
                        RemoveAssets(eatenOrDestroyed);
                        for (int i = 0; i < m_otherPlayerControllers.Length; ++i)
                        {
                            m_otherPlayerControllers[i].RemoveAssets(eatenOrDestroyed);
                        }
                    }

                    if (cmd.Code == CmdCode.Composite)
                    {
                        CompositeCmd compositeCmd = (CompositeCmd)cmd;
                        for (int i = 0; i < compositeCmd.Commands.Length; ++i)
                        {
                            spawnedUnitsList = PostprocessCommand(spawnedUnitsList, compositeCmd.Commands[i], unitController);
                        }
                    }
                    else
                    {
                        spawnedUnitsList = PostprocessCommand(spawnedUnitsList, cmd, unitController);
                    }

                    //if (unitController.DataController.ControlledData.Unit.State == VoxelDataState.Dead)
                    if (!unitController.DataController.IsAlive)
                    {
                        //Voxel voxel = unitController.DataController.ControlledData.VoxelRef;
                        //Debug.Assert(voxel == null);//

                        if (deadUnitsHs == null)
                        {
                            deadUnitsHs = new HashSet <long>();
                        }

                        if (deadUnitsHs.Contains(cmd.UnitIndex))
                        {
                            Debug.LogError("Dead unit could not execute commands");
                        }
                        else
                        {
                            deadUnitsHs.Add(cmd.UnitIndex);
                        }
                    }
                }
            }


            if (deadUnitsHs != null)
            {
                long[] deadUnits = deadUnitsHs.ToArray();
                for (int i = 0; i < m_gameState.PlayersCount; ++i)
                {
                    m_selection.Unselect(i, m_playerIndex, deadUnits);
                    m_targetSelection.Unselect(i, m_playerIndex, deadUnits);
                }
                for (int i = 0; i < deadUnits.Length; ++i)
                {
                    long unitId = deadUnits[i];

                    RemoveUnitController(unitId);
                }
            }

            if (m_isLocalPlayer)
            {
                if (spawnedUnitsList != null)
                {
                    long[] spawnedUnits = spawnedUnitsList.ToArray();
                    spawnedUnits = spawnedUnits.Where(
                        u => m_gameState.GetVoxelDataController(m_playerIndex, u) != null &&
                        VoxelData.IsControllableUnit(m_gameState.GetVoxelDataController(m_playerIndex, u).ControlledData.Type)).ToArray();

                    m_selection.AddToSelection(m_playerIndex, m_playerIndex, spawnedUnits);
                }
            }
        }