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); }
protected static string GetHalf(BlockState state) { if (state.TryGetValue("half", out string facingValue)) { return(facingValue); } return(string.Empty); }
protected static string GetShape(BlockState state) { if (state.TryGetValue("shape", out string facingValue)) { return(facingValue); } return(string.Empty); }
private bool SimplePass(string rule, string value) { if (BlockState.TryGetValue(rule, out var val)) { return(val.Equals(value, StringComparison.InvariantCultureIgnoreCase)); } return(false); }
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)); }
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); }
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); }
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); }
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); }
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); }
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); }