import BlockVolumeLine from "./BlockVolumeLine";
import BlockProperty from "./BlockProperty";
import IBlockData from "./IBlockData";
import IBlockSurroundings from "./IBlockSurroundings";
import BlockType from "./BlockType";
import { BlockRenderType } from "./BlockRenderType";
import IPropertyObject from "../dataform/IPropertyObject";
import ComponentizedBase from "./ComponentizedBase";
export declare enum BlockFacingDirection {
    Down = 0,
    up = 1,
    north = 2,
    south = 3,
    west = 4,
    east = 5
}
export declare enum BlockDirection {
    South = 0,
    West = 1,
    North = 2,
    East = 3
}
export default class Block extends ComponentizedBase implements IPropertyObject {
    static MAX_WATER_LEVEL: number;
    private _type;
    private _blockType;
    private _data;
    private _covered;
    private _typeId;
    private _z;
    private _surroundings;
    line: BlockVolumeLine | undefined;
    extraLiquidDepth: number;
    persistenceVersion: number;
    properties: {
        [id: string]: BlockProperty;
    };
    private _onTypeChanged;
    private _onPropertyChanged;
    get onTypeChanged(): import("ste-events").IEvent<Block, Block>;
    get onPropertyChanged(): import("ste-events").IEvent<Block, BlockProperty>;
    get data(): number;
    set data(newData: number);
    get surroundings(): IBlockSurroundings;
    /**
     * Clears the cached surroundings so they will be recalculated on next access.
     * This should be called when a neighboring block changes.
     */
    clearSurroundings(): void;
    setType(blockType: BlockType): void;
    get opaqueSideCount(): number;
    get isOpaque(): boolean;
    private _ensureTypes;
    _updateDataFromProperties(): void;
    _notifyTypeChanged(): void;
    _notifyPropertyChanged(blockProperty: BlockProperty): void;
    get blockType(): BlockType;
    get textureName(): string;
    copyFrom(block: Block): void;
    static fromLegacyId(byte: number): Block;
    get effectiveWaterLevel(): number;
    get renderType(): BlockRenderType;
    getProperty(name: string): BlockProperty;
    ensureProperty(name: string): BlockProperty;
    getPropertyBoolean(name: string, defaultValue: boolean): boolean;
    getPropertyString(name: string, defaultValue: string): string;
    getPropertyNumber(name: string, defaultValue: number): number;
    addProperty(name: string): BlockProperty;
    get z(): number | undefined;
    set z(value: number | undefined);
    get x(): number;
    get y(): number;
    get coordinatesString(): string;
    get typeName(): string | undefined;
    set typeName(val: string | undefined);
    getBlockData(): IBlockData;
    toString(): string;
    get isEmpty(): boolean;
    private _ensureSurroundingsIfCube;
    get isCovered(): boolean;
    get isTouchingOtherBlock(): boolean;
    get up(): Block | undefined;
    get down(): Block | undefined;
    get left(): Block | undefined;
    get right(): Block | undefined;
    get forward(): Block | undefined;
    get backward(): Block | undefined;
    get shortTypeId(): string;
    constructor(typeId?: string);
    applyFrom(template: Block): void;
}
