コード例 #1
0
        public static bool PassesMultiPartRule(IBlockAccess world, Vector3 position, MultiPartRule rule, BlockState baseBlock, out MultiPartRule passedRule)
        {
            MultiPartRule s = rule;

            passedRule = rule;

            if (rule.HasOrContition)
            {
                if (rule.Or.Any(o =>
                {
                    var pass = PassesMultiPartRule(world, position, o, baseBlock, out var p);
                    if (pass)
                    {
                        s = p;
                        return(true);
                    }

                    return(false);
                }))
                {
                    passedRule = s;
                    return(true);
                }
                ;

                return(false);
            }

            if (rule.HasAndContition)
            {
                if (rule.And.All(o =>
                {
                    var pass = PassesMultiPartRule(world, position, o, baseBlock, out var p);
                    if (pass)
                    {
                        s = p;
                        return(true);
                    }

                    return(false);
                }))
                {
                    passedRule = s;
                    return(true);
                }
                ;

                return(false);
            }

            return(rule.KeyValues.All(x => Passes(world, position, baseBlock, x.Key, x.Value.ToLower())));
        }
コード例 #2
0
 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
 {
     if (reader.TokenType == JsonToken.StartArray)
     {
         var v = serializer.Deserialize <MultiPartRule[]>(reader);
         return(v);
     }
     else
     {
         var v = new MultiPartRule[] { serializer.Deserialize <MultiPartRule>(reader) };
         return(v);
     }
 }
コード例 #3
0
        private static bool PassesMultiPartRule(MultiPartRule rule, BlockState blockState)
        {
            if (rule.HasOrContition)
            {
                return(rule.Or.Any(o => PassesMultiPartRule(o, blockState)));
            }

            if (rule.HasAndContition)
            {
                return(rule.And.All(o => PassesMultiPartRule(o, blockState)));
            }

            return(rule.KeyValues.All(x => CheckRequirements(blockState, x.Key, x.Value)));
        }
コード例 #4
0
        private static bool PassesMultiPartRule(MultiPartRule rule, IBlockState blockState)
        {
            if (rule.HasOrContition)
            {
                return(rule.Or.Any(o => PassesMultiPartRule(o, blockState)));
            }

            if (rule.HasAndContition)
            {
                return(rule.And.All(o => PassesMultiPartRule(o, blockState)));
            }

            if (CheckRequirements(blockState, "down", rule.Down) &&
                CheckRequirements(blockState, "up", rule.Up) &&
                CheckRequirements(blockState, "north", rule.North) &&
                CheckRequirements(blockState, "east", rule.East) &&
                CheckRequirements(blockState, "south", rule.South) &&
                CheckRequirements(blockState, "west", rule.West))
            {
                return(true);
            }

            return(false);
        }
コード例 #5
0
        private static bool PassesMultiPartRule(IWorld world, Vector3 position, MultiPartRule rule, IBlockState baseBlock)
        {
            if (rule.HasOrContition)
            {
                return(rule.Or.Any(o => PassesMultiPartRule(world, position, o, baseBlock)));
            }

            if (rule.HasAndContition)
            {
                return(rule.And.All(o => PassesMultiPartRule(world, position, o, baseBlock)));
            }

            if (Passes(world, position, baseBlock, "down", rule.Down) &&
                Passes(world, position, baseBlock, "up", rule.Up) &&
                Passes(world, position, baseBlock, "north", rule.North) &&
                Passes(world, position, baseBlock, "east", rule.East) &&
                Passes(world, position, baseBlock, "south", rule.South) &&
                Passes(world, position, baseBlock, "west", rule.West))
            {
                return(true);
            }

            return(false);
        }
コード例 #6
0
        public static bool PassesMultiPartRule(IBlockAccess world, Vector3 position, MultiPartRule rule, BlockState baseBlock, out MultiPartRule passedRule)
        {
            MultiPartRule s = rule;

            passedRule = rule;

            if (rule.HasOrContition)
            {
                if (rule.Or.Any(o =>
                {
                    var pass = PassesMultiPartRule(world, position, o, baseBlock, out var p);
                    if (pass)
                    {
                        s = p;
                        return(true);
                    }

                    return(false);
                }))
                {
                    passedRule = s;
                    return(true);
                }
                ;

                return(false);
            }

            if (rule.HasAndContition)
            {
                if (rule.And.All(o =>
                {
                    var pass = PassesMultiPartRule(world, position, o, baseBlock, out var p);
                    if (pass)
                    {
                        s = p;
                        return(true);
                    }

                    return(false);
                }))
                {
                    passedRule = s;
                    return(true);
                }
                ;

                return(false);
            }

            //return rule.All(x => CheckRequirements(baseBlock, x.Key, x.Value));
            return(rule.KeyValues.All(x => Passes(world, position, baseBlock, x.Key, x.Value.ToLower())));

            /*
             * if (Passes(world, position, baseBlock, "down", rule.Down)
             *      && Passes(world, position, baseBlock, "up", rule.Up)
             *      && Passes(world, position, baseBlock, "north", rule.North)
             *      && Passes(world, position, baseBlock, "east", rule.East)
             *      && Passes(world, position, baseBlock, "south", rule.South)
             *      && Passes(world, position, baseBlock, "west", rule.West))
             * {
             *      return true;
             * }
             *
             * return false;*/
        }
コード例 #7
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            MultiPartRule rule = new MultiPartRule();

            JObject obj = JObject.Load(reader);

            foreach (var prop in obj)
            {
                switch (prop.Key.ToLower())
                {
                case "or":
                    if (prop.Value.Type == JTokenType.Array)
                    {
                        rule.Or = prop.Value.ToObject <MultiPartRule[]>(serializer);
                    }
                    else
                    {
                        rule.Or = new MultiPartRule[]
                        {
                            prop.Value.ToObject <MultiPartRule>(serializer)
                        };
                    }
                    break;

                case "and":
                    if (prop.Value.Type == JTokenType.Array)
                    {
                        rule.And = prop.Value.ToObject <MultiPartRule[]>(serializer);
                    }
                    else
                    {
                        rule.And = new MultiPartRule[]
                        {
                            prop.Value.ToObject <MultiPartRule>(serializer)
                        };
                    }
                    break;

                default:
                    if (prop.Value.Type == JTokenType.String || prop.Value.Type == JTokenType.Boolean)
                    {
                        rule.KeyValues.Add(prop.Key, prop.Value.ToObject <string>());
                    }
                    else
                    {
                        Log.Warn($"Got unsupported property type: {prop.Key}:{prop.Value.Type}");
                    }

                    break;
                }
            }


            /*if (reader.TokenType == JsonToken.StartArray)
             * {
             *      var v = serializer.Deserialize<MultiPartRule[]>(reader);
             *      return v;
             * }
             * else
             * {
             *      var v = new MultiPartRule[] { serializer.Deserialize<MultiPartRule>(reader) };
             *      return v;
             * }*/

            return(rule);
        }