Пример #1
0
        /// <summary>
        /// Creates a new instance.
        /// </summary>
        /// <param name="parent">The parent block container</param>
        /// <param name="xpos">The X-coordinate within the region</param>
        /// <param name="zpos">The Z-coordinate within the region</param>
        /// <param name="layers">The default layers. Can be 'null'</param>
        public Chunk(IBlockContainer parent, int xpos, int zpos, DefaultLayers layers)
        {
            Parent = parent;
            _xPos  = xpos;
            _zPos  = zpos;

            // Set default blocks
            if (layers == null)
            {
                return;
            }
            // Iterate layers
            for (int y = 0; y < World.MaxHeight; y++)
            {
                Block material = layers.GetLayer(y);
                if (material == null)
                {
                    continue;
                }
                // Iterate area
                for (int x = 0; x < BlocksPerChunkSide; x++)
                {
                    for (int z = 0; z < BlocksPerChunkSide; z++)
                    {
                        // Set Block
                        SetBlock(new Position(x, y, z), material);
                    }
                }
            }
        }
Пример #2
0
 public Region(IBlockContainer parent, int xPos, int zPos, DefaultLayers layers)
 {
     _parent = parent;
     X       = xPos;
     Z       = zPos;
     _layers = layers;
 }
Пример #3
0
        public async Task <IHtmlContent> ToHtmlContentAsync(IBlockContainer element, IEnumerable <string> templates, IHtmlHelper htmlHelper)
        {
            using var writer = new StringWriter(CultureInfo.CurrentCulture);
            await RenderCoreAsync(element, templates, htmlHelper, writer);

            return(new HtmlString(writer.ToString()));
        }
        private static void CheckContainer(IBlockContainer container)
        {
            foreach (var path in container.Paths())
            {
                bool blockReturns = false;
                for (int i = path.Block.Statements.Length - 1; i >= 0; i--)
                {
                    if (path.Block.Statements[i] is ReturnNode)
                    {
                        blockReturns = true;
                        break;
                    }

                    if (path.Block.Statements[i] is IBlockContainer)
                    {
                        if (((IBlockContainer)path.Block.Statements[i]).Paths().Any(containerPath => containerPath.WillRun))
                        {
                            blockReturns = true;
                        }

                        CheckContainer((IBlockContainer)path.Block.Statements[i]);
                    }
                }
                if (!blockReturns)
                {
                    throw new SyntaxErrorException("Path does not return a value.", path.ErrorRange);
                }
            }
        }
 private static void CheckContainer(ScriptFile script, IBlockContainer container)
 {
     foreach (var path in container.GetPaths())
     {
         CheckPath(script, path);
     }
 }
Пример #6
0
        public byte GetSkyLightFromParent(IBlockContainer blockChild, Position child)
        {
            int x = Region.BlocksPerRegionSize * ((Region)blockChild).X + (int)child.X;
            int z = Region.BlocksPerRegionSize * ((Region)blockChild).Z + (int)child.Z;

            return(GetSkyLight(new Position(x, child.Y, z)));
        }
Пример #7
0
        protected void RenderByChildAction(IBlockContainer element, IEnumerable <string> templates, HtmlHelper htmlHelper, TextWriter textWriter)
        {
            Guard.NotNull(element, nameof(element));
            Guard.NotNull(templates, nameof(templates));
            Guard.NotNull(htmlHelper, nameof(htmlHelper));
            Guard.NotNull(textWriter, nameof(textWriter));

            var routeInfo = templates.Select(x => GetRoute(element, x)).FirstOrDefault();

            if (routeInfo == null)
            {
                throw new InvalidOperationException("The return value of the 'GetRoute()' method cannot be NULL.");
            }

            //routeInfo.RouteValues["model"] = element.Block;

            var originalWriter = htmlHelper.ViewContext.Writer;

            htmlHelper.ViewContext.Writer = textWriter;

            using (new ActionDisposable(() => htmlHelper.ViewContext.Writer = originalWriter))
            {
                htmlHelper.RenderAction(routeInfo.Action, routeInfo.Controller, routeInfo.RouteValues);
            }
        }
Пример #8
0
 private void CheckContainer(IBlockContainer container)
 {
     foreach (var path in container.GetPaths())
     {
         CheckPath(path);
     }
 }
Пример #9
0
 public IHtmlString ToHtmlString(IBlockContainer element, IEnumerable <string> templates, HtmlHelper htmlHelper)
 {
     using (var writer = new StringWriter(CultureInfo.CurrentCulture))
     {
         RenderCore(element, templates, htmlHelper, writer);
         return(MvcHtmlString.Create(writer.ToString()));
     }
 }
Пример #10
0
        protected virtual Task RenderByComponentAsync(IBlockContainer element, IEnumerable <string> templates, IHtmlHelper htmlHelper, TextWriter textWriter)
        {
            Guard.NotNull(element, nameof(element));
            Guard.NotNull(templates, nameof(templates));
            Guard.NotNull(htmlHelper, nameof(htmlHelper));
            Guard.NotNull(textWriter, nameof(textWriter));

            // TODO: (core) Implement BlockHandlerBase.RenderByComponentAsync()
            throw new NotImplementedException();
        }
Пример #11
0
        public Section(IBlockContainer parent, int y)
        {
            _parent = parent;
            Y       = y;

            // Set default transparency
            for (int i = 0; i < _transparency.Length; i++)
            {
                _transparency[i] = World.DefaultTransparency;
            }
        }
Пример #12
0
        private void DrawBlock(int row, int col, IBlockContainer group)
        {
            Block block = group.Blocks[row, col];

            //we only draw swapping blocks inside blockgroups
            if (block != null && block.IsSwapping && group == this)
            {
                return;
            }

            if (block != null && !block.IsEmpty && !(block.State == BlockState.Suspend))
            {
                blockSprite.X = group.OffsetX + col * _CellWidth;
                blockSprite.Y = group.OffsetY + row * _CellHeight;

                if (block.IsExploding)
                {
                    blockSprite.Animation.CurrentFrame = 4;
                    blockSprite.Draw();
                }

                switch (block.Type)
                {
                case BlockType.Yellow:
                    blockSprite.Animation.CurrentFrame = 0;
                    break;

                case BlockType.Red:
                    blockSprite.Animation.CurrentFrame = 1;
                    break;

                case BlockType.Blue:
                    blockSprite.Animation.CurrentFrame = 2;
                    break;

                case BlockType.Green:
                    blockSprite.Animation.CurrentFrame = 3;
                    break;

                case BlockType.White:
                    blockSprite.Animation.CurrentFrame = 4;
                    break;
                }

                blockSprite.Draw(block.Color);
            }
        }
Пример #13
0
        protected void RenderByView(IBlockContainer element, IEnumerable <string> templates, HtmlHelper htmlHelper, TextWriter textWriter)
        {
            Guard.NotNull(element, nameof(element));
            Guard.NotNull(templates, nameof(templates));
            Guard.NotNull(htmlHelper, nameof(htmlHelper));
            Guard.NotNull(textWriter, nameof(textWriter));

            var viewContext = htmlHelper.ViewContext;

            if (!element.Metadata.IsInbuilt)
            {
                // Change "area" token in RouteData in order to begin search in the plugin's view folder.
                var originalRouteData = htmlHelper.ViewContext.RouteData;
                var routeData         = new RouteData(originalRouteData.Route, originalRouteData.RouteHandler);
                routeData.Values.Merge(originalRouteData.Values);
                routeData.DataTokens["area"] = element.Metadata.AreaName;

                viewContext = new ViewContext
                {
                    RouteData      = routeData,
                    RequestContext = htmlHelper.ViewContext.RequestContext
                };
            }

            var viewResult = FindFirstView(element.Metadata, templates, viewContext, out var searchedLocations);

            if (viewResult == null)
            {
                var msg = string.Format("No template found for '{0}'. Searched locations:\n{1}.", string.Join(", ", templates), string.Join("\n", searchedLocations));
                Logger.Debug(msg);
                throw new FileNotFoundException(msg);
            }

            var viewData = new ViewDataDictionary(element.Block);

            viewData.TemplateInfo.HtmlFieldPrefix = "Block";

            viewContext = new ViewContext(
                htmlHelper.ViewContext,
                viewResult.View,
                viewData,
                htmlHelper.ViewContext.TempData,
                textWriter);

            viewResult.View.Render(viewContext, textWriter);
        }
Пример #14
0
        public byte GetSkyLightFromParent(IBlockContainer blockChild,
                                          Position child)
        {
            int x = ((Chunk)blockChild).X * Chunk.BlocksPerChunkSide + (int)child.X;
            int z = ((Chunk)blockChild).Z * Chunk.BlocksPerChunkSide + (int)child.Z;

            // Same region?
            if (x >= 0 && x < BlocksPerRegionSize &&
                z >= 0 && z < BlocksPerRegionSize)
            {
                return(GetSkyLight(new Position(x, child.Y, z)));
            }
            else
            {
                // Pass to parent
                return(_parent.GetSkyLightFromParent(this, new Position(x, child.Y, z)));
            }
        }
Пример #15
0
        private static ActionContext GetActionContextFor(IBlockContainer element, ActionContext originalContext)
        {
            if (element.Metadata.IsInbuilt)
            {
                return(originalContext);
            }

            // Change "area" token in RouteData in order to begin search in the module's view folder.
            var originalRouteData = originalContext.RouteData;
            var routeData         = new RouteData(originalRouteData);

            routeData.Values.Merge(originalRouteData.Values);
            routeData.DataTokens["area"] = element.Metadata.AreaName;             // TODO: (core) Check whether DataTokens["area"] is still the right place for Area replacement in AspNetCore.

            return(new ActionContext
            {
                RouteData = routeData,
                HttpContext = originalContext.HttpContext,
                ActionDescriptor = originalContext.ActionDescriptor
            });
        }
Пример #16
0
        protected Task RenderByViewAsync(IBlockContainer element, IEnumerable <string> templates, IHtmlHelper htmlHelper, TextWriter textWriter)
        {
            Guard.NotNull(element, nameof(element));
            Guard.NotNull(templates, nameof(templates));
            Guard.NotNull(htmlHelper, nameof(htmlHelper));
            Guard.NotNull(textWriter, nameof(textWriter));

            var actionContext = GetActionContextFor(element, htmlHelper.ViewContext);
            var viewResult    = FindFirstView(element.Metadata, templates, actionContext, out var searchedLocations);

            if (viewResult == null)
            {
                var msg = string.Format("No template found for '{0}'. Searched locations:\n{1}.", string.Join(", ", templates), string.Join("\n", searchedLocations));
                Logger.Debug(msg);
                throw new FileNotFoundException(msg);
            }

            var mvcViewOptions        = actionContext.HttpContext.RequestServices.GetRequiredService <IOptions <MvcViewOptions> >();
            var modelMetadataProvider = actionContext.HttpContext.RequestServices.GetRequiredService <IModelMetadataProvider>();
            var viewData = new ViewDataDictionary(modelMetadataProvider, htmlHelper.ViewContext.ModelState)
            {
                Model = element.Block
            };

            viewData.TemplateInfo.HtmlFieldPrefix = "Block";

            var viewContext = new ViewContext(
                htmlHelper.ViewContext,
                viewResult.View,
                viewData,
                htmlHelper.ViewContext.TempData,
                textWriter,
                mvcViewOptions.Value.HtmlHelperOptions);

            return(viewResult.View.RenderAsync(viewContext));
        }
Пример #17
0
        public byte GetSkyLightFromParent(IBlockContainer block, Position child)
        {
            if (child == null)
            {
                throw new ArgumentNullException(nameof(child));
            }
            if (block == null)
            {
                throw new ArgumentNullException(nameof(block));
            }

            // Get total y
            int y = ((Section)block).Y * Section.SectionHeight + (int)child.Y;

            if (y >= World.MaxHeight)
            {
                return(World.DefaultSkyLight);
            }

            if (y < 0)
            {
                return(0);
            }

            // Which chunk?
            if (child.X >= 0 && child.X < BlocksPerChunkSide &&
                child.Z >= 0 && child.Z < BlocksPerChunkSide)
            {
                // Same chunk
                return(GetSkyLight(new Position(child.X, y, child.Z)));
            }
            else
            {
                return(Parent.GetSkyLightFromParent(this, new Position(child.X, y, child.Z)));
            }
        }
Пример #18
0
 /// <summary>
 /// Link the copied data stream to another block
 /// </summary>
 public void LinkSecondlyTo(IBlockContainer <T> other)
 {
     LinkBlockToContainer(this.CopiedOutputBlock, other);
 }
Пример #19
0
 public byte GetSkyLightFromParent(IBlockContainer child, Position pos)
 {
     return(IsInBounds(pos) ?
            GetSkyLight(pos)
         : _parent.GetSkyLightFromParent(this, pos));
 }
Пример #20
0
 public void Render(IBlockContainer element, IEnumerable <string> templates, HtmlHelper htmlHelper)
 {
     RenderCore(element, templates, htmlHelper, htmlHelper.ViewContext.Writer);
 }
Пример #21
0
        private void DrawBlock(int row, int col, IBlockContainer group)
        {
            Block block = group.Blocks[row, col];

            //we only draw swapping blocks inside blockgroups
            if (block != null && block.IsSwapping && group == this)
            {
                return;
            }

            if (block != null && !block.IsEmpty && !(block.State == BlockState.Suspend))
            {
                blockSprite.X = group.OffsetX + col * _CellWidth;
                blockSprite.Y = group.OffsetY + row * _CellHeight;

                if (block.IsExploding)
                {
                    blockSprite.Animation.CurrentFrame = 4;
                    blockSprite.Draw();
                }

                switch (block.Type)
                {
                    case BlockType.Yellow:
                        blockSprite.Animation.CurrentFrame = 0;
                        break;
                    case BlockType.Red:
                        blockSprite.Animation.CurrentFrame = 1;
                        break;
                    case BlockType.Blue:
                        blockSprite.Animation.CurrentFrame = 2;
                        break;
                    case BlockType.Green:
                        blockSprite.Animation.CurrentFrame = 3;
                        break;
                    case BlockType.White:
                        blockSprite.Animation.CurrentFrame = 4;
                        break;
                }

                blockSprite.Draw(block.Color);
            }
        }
Пример #22
0
        protected void RenderByChildAction(IBlockContainer element, IEnumerable <string> templates, HtmlHelper htmlHelper, TextWriter textWriter)
        {
            Guard.NotNull(element, nameof(element));
            Guard.NotNull(templates, nameof(templates));
            Guard.NotNull(htmlHelper, nameof(htmlHelper));
            Guard.NotNull(textWriter, nameof(textWriter));

            var routeInfo = templates.Select(x => GetRoute(element, x)).FirstOrDefault();

            if (routeInfo == null)
            {
                throw new InvalidOperationException("The return value of the 'GetRoute()' method cannot be NULL.");
            }

            var routeValues = routeInfo.RouteValues;

            routeValues["action"]     = routeInfo.Action;
            routeValues["controller"] = routeInfo.Controller;

            VirtualPathData vpd = GetVirtualPathForArea(htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, null /* name */, routeValues, out var usingAreas);

            if (vpd == null)
            {
                throw new InvalidOperationException("Could not find any matching route.");
            }

            if (usingAreas)
            {
                routeValues.Remove("area");
            }

            var routeData      = CreateRouteData(vpd.Route, routeValues, vpd.DataTokens, htmlHelper.ViewContext);
            var httpContext    = htmlHelper.ViewContext.HttpContext;
            var requestContext = new RequestContext(httpContext, routeData);

            // Create the controller instance
            var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(requestContext, routeInfo.Controller) as Controller;

            if (controller == null)
            {
                throw new InvalidOperationException($"Could not activate controller '{routeInfo.Controller}'. Please ensure that the controller class exists and inherits from '{typeof(Controller).FullName}'.");
            }

            var originalWriter = htmlHelper.ViewContext.Writer;

            htmlHelper.ViewContext.Writer = textWriter;

            var originalOutput = httpContext.Response.Output;

            httpContext.Response.Output = textWriter;

            var originalActionInvoker = controller.ActionInvoker;

            controller.ActionInvoker = new ActionInvokerWithResultValidator();

            void endRender()
            {
                htmlHelper.ViewContext.Writer = originalWriter;
                httpContext.Response.Output   = originalOutput;
                controller.ActionInvoker      = originalActionInvoker;
            }

            using (new ActionDisposable((Action)endRender))
            {
                ((IController)controller).Execute(requestContext);
            }
        }
Пример #23
0
        //protected void RenderByChildAction(IBlockContainer element, IEnumerable<string> templates, HtmlHelper htmlHelper, TextWriter textWriter)
        //      {
        //          Guard.NotNull(element, nameof(element));
        //          Guard.NotNull(templates, nameof(templates));
        //          Guard.NotNull(htmlHelper, nameof(htmlHelper));
        //          Guard.NotNull(textWriter, nameof(textWriter));

        //          var routeInfo = templates.Select(x => GetRoute(element, x)).FirstOrDefault();
        //          if (routeInfo == null)
        //          {
        //              throw new InvalidOperationException("The return value of the 'GetRoute()' method cannot be NULL.");
        //          }

        //          //routeInfo.RouteValues["model"] = element.Block;

        //          var originalWriter = htmlHelper.ViewContext.Writer;
        //          htmlHelper.ViewContext.Writer = textWriter;

        //          using (new ActionDisposable(() => htmlHelper.ViewContext.Writer = originalWriter))
        //          {
        //              htmlHelper.RenderAction(routeInfo.Action, routeInfo.Controller, routeInfo.RouteValues);
        //          }
        //      }

        #endregion

        protected virtual RouteInfo GetRoute(IBlockContainer element, string template)
        => throw new NotImplementedException();
Пример #24
0
 protected virtual void RenderCore(IBlockContainer element, IEnumerable <string> templates, HtmlHelper htmlHelper, TextWriter textWriter)
 {
     RenderByView(element, templates, htmlHelper, textWriter);
 }
Пример #25
0
 private bool InBounds(int r, int c, IBlockContainer container)
 {
     return (r >= 0 && r < container.NumRows && c >= 0 && c < container.NumCols);
 }
Пример #26
0
 public Task RenderAsync(IBlockContainer element, IEnumerable <string> templates, IHtmlHelper htmlHelper)
 {
     return(RenderCoreAsync(element, templates, htmlHelper, htmlHelper.ViewContext.Writer));
 }
Пример #27
0
 protected virtual Task RenderCoreAsync(IBlockContainer element, IEnumerable <string> templates, IHtmlHelper htmlHelper, TextWriter textWriter)
 {
     return(RenderByViewAsync(element, templates, htmlHelper, textWriter));
 }
Пример #28
0
 private bool InBounds(int r, int c, IBlockContainer container)
 {
     return(r >= 0 && r < container.NumRows && c >= 0 && c < container.NumCols);
 }
Пример #29
0
 public virtual void AfterSave(IBlockContainer container, IBlockEntity entity)
 {
     // Default impl does nothing.
 }
Пример #30
0
 public virtual void BeforeRender(IBlockContainer container, StoryViewMode viewMode, IBlockHtmlParts htmlParts)
 {
     // Default impl does nothing.
 }