Ejemplo n.º 1
0
        bool CalculateFrozenState(MapObject obj)
        {
            if (!IsReallyEnabled())
            {
                return(false);
            }
            if (obj._FreezeObjectsManagerNeverFreeze)
            {
                return(false);
            }

            //check by camera distance
            {
                Camera camera = RendererWorld.Instance.DefaultCamera;

                if (unfreezeByCameraZDistance != 0)
                {
                    float length2 = (camera.Position.ToVec2() - obj.Position.ToVec2()).Length();
                    if (length2 < unfreezeByCameraDistance)
                    {
                        return(false);
                    }
                    float lengthZ = Math.Abs(camera.Position.Z - obj.Position.Z);
                    if (lengthZ < unfreezeByCameraZDistance)
                    {
                        return(false);
                    }
                }
                else
                {
                    float length = (camera.Position - obj.Position).Length();
                    if (length < unfreezeByCameraDistance)
                    {
                        return(false);
                    }
                }
            }

            //check by areas
            if (grid != null)
            {
                Vec3  indexF = (obj.Position - gridStartPosition) * gridCellSizeInv;
                Vec3I index  = indexF.ToVec3I();
                if (index.X >= 0 && index.Y >= 0 && index.Z >= 0 && index.X < cellCount.X && index.Y < cellCount.Y && index.Z < cellCount.Z)
                {
                    GridItem item = grid[index.X, index.Y, index.Z];

                    for (int n = 0; n < item.count; n++)
                    {
                        FreezeObjectsArea area = gridAreas[n + item.startIndex];

                        bool unfreezing;
                        area._UpdateLastCheckState(out unfreezing);
                        if (unfreezing)
                        {
                            return(false);
                        }
                    }
                }
            }

            return(true);
        }