Пример #1
0
        private BlockState Check(IBlockAccess world, BlockCoordinates position, BlockCoordinates updatedBlock, BlockState current)
        {
            var neighbor = world.GetBlockState(updatedBlock);

            var facePos = updatedBlock - position;
            var fp      = new Vector3(facePos.X, facePos.Y, facePos.Z);

            fp.Normalize();

            var face       = new Vector3(fp.X, fp.Y, fp.Z).GetBlockFace();
            var faceString = face.ToString().ToLower();

            current.TryGetValue(faceString, out var currentValue);

            if (CanAttach(face, neighbor.Block))
            {
                if (currentValue != "true")
                {
                    return(current.WithProperty(faceString, "true"));
                    //world.SetBlockState(position, state);
                }
            }
            else
            {
                if (currentValue != "false")
                {
                    return(current.WithProperty(faceString, "false"));
                    //world.SetBlockState(position, state);
                }
            }

            return(current);
        }
Пример #2
0
        protected static string GetHalf(BlockState state)
        {
            if (state.TryGetValue("half", out string facingValue))
            {
                return(facingValue);
            }

            return(string.Empty);
        }
Пример #3
0
        protected static string GetShape(BlockState state)
        {
            if (state.TryGetValue("shape", out string facingValue))
            {
                return(facingValue);
            }

            return(string.Empty);
        }
Пример #4
0
        private bool SimplePass(string rule, string value)
        {
            if (BlockState.TryGetValue(rule, out var val))
            {
                return(val.Equals(value, StringComparison.InvariantCultureIgnoreCase));
            }

            return(false);
        }
Пример #5
0
        public override BlockState BlockPlaced(World world, BlockState state, BlockCoordinates position)
        {
            if (state.TryGetValue("half", out string half) && half.Equals(
                    "upper", StringComparison.InvariantCultureIgnoreCase))
            {
                return(Update(world, state, position, position + BlockCoordinates.Down));
            }

            return(Update(world, state, position, position + BlockCoordinates.Up));
        }
Пример #6
0
        protected static BlockFace GetFacing(BlockState state)
        {
            if (state.TryGetValue("facing", out string facingValue) &&
                Enum.TryParse <BlockFace>(facingValue, true, out BlockFace face))
            {
                return(face);
            }

            return(BlockFace.None);
        }
Пример #7
0
        public override bool CanClimb(BlockFace face)
        {
            if (BlockState.TryGetValue("facing", out var val))
            {
                BlockFace facing = Enum.Parse <BlockFace>(val);

                return(facing.Opposite() == face);
            }

            return(false);
        }
Пример #8
0
        public override bool CanClimb(BlockFace face)
        {
            if (BlockState.TryGetValue("facing", out var val))
            {
                if (Enum.TryParse <BlockFace>(val, true, out var facing))
                {
                    return(facing.Opposite() == face);
                }
            }

            return(false);
        }
Пример #9
0
        private bool TryGetLevel(BlockState state, out int level)
        {
            level = -1;
            if (state.TryGetValue("level", out string rawLevel))
            {
                if (int.TryParse(rawLevel, out int lvl))
                {
                    level = 7 - (lvl & 0x7);

                    return(true);
                }
            }

            return(false);
        }
        private static bool CheckRequirements(BlockState baseblockState, string rule, string value)
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                return(true);
            }

            if (baseblockState.TryGetValue(rule, out string stateValue))
            {
                if (stateValue.Equals(value, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #11
0
        private BlockState Update(World world, BlockState blockState, BlockCoordinates coordinates, BlockCoordinates updated)
        {
            var updatedBlock = world.GetBlockState(updated);

            if (!(updatedBlock.Block is Door))
            {
                return(blockState);
            }

            bool isUpper = false;

            if (blockState.TryGetValue("half", out string half))
            {
                isUpper = half.Equals("upper", StringComparison.InvariantCultureIgnoreCase);
            }

            if (updated == coordinates + BlockCoordinates.Up && !isUpper)
            {
                if (updatedBlock.TryGetValue("hinge", out var hingeValue))
                {
                    blockState = blockState.WithProperty("hinge", hingeValue, false, "half", "open", "facing");
                }
            }
            else if (updated == coordinates + BlockCoordinates.Down && isUpper)
            {
                if (updatedBlock.TryGetValue("open", out string open))
                {
                    blockState = blockState.WithProperty("open", open, false, "half", "hinge");
                }

                if (updatedBlock.TryGetValue("facing", out var facing))
                {
                    blockState = blockState.WithProperty("facing",
                                                         facing, false, "half", "hinge", "open");
                }
            }

            return(blockState);
        }
Пример #12
0
        private static bool CheckRequirements(BlockState baseblockState, string rule, string value)
        {
            if (baseblockState.Block is IMultipartCheck multipartChecker)
            {
                return(multipartChecker.Passes(rule, value));
            }

            if (string.IsNullOrWhiteSpace(value))
            {
                return(true);
            }

            if (baseblockState.TryGetValue(rule, out string stateValue))
            {
                if (stateValue.Equals(value, StringComparison.OrdinalIgnoreCase))
                {
                    return(true);
                }
            }

            return(false);
        }
        private static bool Passes(IBlockAccess world, Vector3 position, BlockState baseblockState, string rule,
                                   string value)
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                return(true);
            }

            bool      isDirection = true;
            BlockFace face        = BlockFace.None;

            switch (rule)
            {
            case "north":
                face = BlockFace.South;
                break;

            case "east":
                face = BlockFace.East;
                break;

            case "south":
                face = BlockFace.North;
                break;

            case "west":
                face = BlockFace.West;
                break;

            case "up":
                face = BlockFace.Up;
                break;

            case "down":
                face = BlockFace.Down;
                break;

            default:
                isDirection = false;

                break;
            }

            var direction = face.GetVector3();

            if (isDirection && (value == "true" || value == "false" || value == "none"))
            {
                var newPos     = new BlockCoordinates(position + direction);
                var blockState = world.GetBlockState(newPos);
                var block      = blockState.Block;

                if (face == BlockFace.Up && !(block is Air))
                {
                    return(true);
                }
                //if (face == BlockFace.Up && !(block is Air))
                //	return true;

                var canAttach = baseblockState.Block.CanAttach(face, block);

                if (value == "true")
                {
                    return(canAttach);
                }
                else if (value == "false")
                {
                    return(!canAttach);
                }
                else if (value == "none")
                {
                    return(block.BlockMaterial == Material.Air);
                }

                return(false);
            }


            if (baseblockState.TryGetValue(rule, out string val))
            {
                return(val.Equals(value, StringComparison.InvariantCultureIgnoreCase));
            }

            return(false);
        }
        private static bool Passes(IBlockAccess world, Vector3 position, BlockState baseblockState, string rule,
                                   string value)
        {
            if (baseblockState.Block is IMultipartCheck multipartChecker)
            {
                return(multipartChecker.Passes(world, position, rule, value));
            }

            if (string.IsNullOrWhiteSpace(value))
            {
                return(true);
            }

            bool isDirection = true;

            BlockFace face = BlockFace.None;

            if (!TryGetBlockface(rule, out face))
            {
                isDirection = false;
            }

            var direction = face.GetVector3();

            if (isDirection && (value == "true" || value == "false" || value == "none"))
            {
                var newPos     = new BlockCoordinates(position + direction);
                var blockState = world.GetBlockState(newPos);
                var block      = blockState.Block;

                if (face == BlockFace.Up && !(block is Air))
                {
                    return(true);
                }
                //if (face == BlockFace.Up && !(block is Air))
                //	return true;

                var canAttach = baseblockState.Block.CanAttach(face, block);

                if (value == "true")
                {
                    return(canAttach);
                }
                else if (value == "false")
                {
                    return(!canAttach);
                }
                else if (value == "none")
                {
                    return(block.BlockMaterial == Material.Air);
                }

                return(false);
            }


            if (baseblockState.TryGetValue(rule, out string val))
            {
                return(val.Equals(value, StringComparison.InvariantCultureIgnoreCase));
            }

            return(false);
        }