public override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ) { int cellValueFast = base.SubsystemTerrain.Terrain.GetCellValueFast(x, y, z); int num = Terrain.ExtractContents(cellValueFast); int data = Terrain.ExtractData(cellValueFast); Block block = BlocksManager.Blocks[num]; if (block is AttachedSignBlock) { Point3 point = CellFace.FaceToPoint3(AttachedSignBlock.GetFace(data)); int x2 = x - point.X; int y2 = y - point.Y; int z2 = z - point.Z; int cellContents = base.SubsystemTerrain.Terrain.GetCellContents(x2, y2, z2); if (!BlocksManager.Blocks[cellContents].IsCollidable) { base.SubsystemTerrain.DestroyCell(0, x, y, z, 0, noDrop: false, noParticleSystem: false); } } else if (block is PostedSignBlock) { int num2 = PostedSignBlock.GetHanging(data) ? base.SubsystemTerrain.Terrain.GetCellContents(x, y + 1, z) : base.SubsystemTerrain.Terrain.GetCellContents(x, y - 1, z); if (!BlocksManager.Blocks[num2].IsCollidable) { base.SubsystemTerrain.DestroyCell(0, x, y, z, 0, noDrop: false, noParticleSystem: false); } } }
public override BlockPlacementData GetPlacementValue(SubsystemTerrain subsystemTerrain, ComponentMiner componentMiner, int value, TerrainRaycastResult raycastResult) { int?color = GetColor(Terrain.ExtractData(value)); BlockPlacementData result; if (raycastResult.CellFace.Face < 4) { int data = AttachedSignBlock.SetFace(AttachedSignBlock.SetColor(0, color), raycastResult.CellFace.Face); result = default(BlockPlacementData); result.Value = Terrain.MakeBlockValue(m_attachedSignBlockIndex, 0, data); result.CellFace = raycastResult.CellFace; return(result); } Vector3 forward = Matrix.CreateFromQuaternion(componentMiner.ComponentCreature.ComponentCreatureModel.EyeRotation).Forward; float num = float.MinValue; int direction = 0; for (int i = 0; i < 8; i++) { float num2 = Vector3.Dot(forward, m_directions[i]); if (num2 > num) { num = num2; direction = i; } } int data2 = SetHanging(SetDirection(SetColor(0, color), direction), raycastResult.CellFace.Face == 5); result = default(BlockPlacementData); result.Value = Terrain.MakeBlockValue(BlockIndex, 0, data2); result.CellFace = raycastResult.CellFace; return(result); }
public static bool IsBlockMovable(int value, int pistonFace, int y, out bool isEnd) { isEnd = false; int num = Terrain.ExtractContents(value); int data = Terrain.ExtractData(value); switch (num) { case 27: case 45: case 64: case 65: case 216: return(false); case 227: return(true); case 237: return(!PistonBlock.GetIsExtended(data)); case 238: return(false); case 131: case 132: case 244: return(false); case 127: return(false); case 126: return(false); case 1: return(y > 1); default: { Block block = BlocksManager.Blocks[num]; if (block is BottomSuckerBlock) { return(false); } if (block is MountedElectricElementBlock) { isEnd = true; return(((MountedElectricElementBlock)block).GetFace(value) == pistonFace); } if (block is DoorBlock || block is TrapdoorBlock) { return(false); } if (block is LadderBlock) { isEnd = true; return(pistonFace == LadderBlock.GetFace(data)); } if (block is AttachedSignBlock) { isEnd = true; return(pistonFace == AttachedSignBlock.GetFace(data)); } if (block.IsNonDuplicable) { return(false); } if (block.IsCollidable) { return(true); } return(false); } } }