import { int, float, EnchantmentId, RangeObject } from 'mdk-nbt';
import { FileAbstract, FileAbstractOptions, FileInfo } from '../FileAbstract';
import { DataObject, ObjectMap } from "../../../tools/typings";
declare type EntityTargetType = 'this' | 'killer' | 'killer_player';
export interface IPredicateItem {
    condition: string;
    [name: string]: any;
}
export declare type PredicateMap<D extends DataObject> = ObjectMap<PredicateFile<D>>;
export declare type PredicateItemMap = ObjectMap<IPredicateItem>;
export interface PredicateOptions<D extends DataObject = {}> extends FileAbstractOptions<D> {
    /** 渲染入口 */
    render: (context: PredicateFile<any>) => D | void;
}
export declare class PredicateFile<D extends DataObject> extends FileAbstract<D> {
    #private;
    constructor(options: PredicateOptions<D>);
    add(item: IPredicateItem): void;
    load(cached?: boolean): boolean;
    getData(cached?: boolean): D;
    create(dir: string): FileInfo;
    toString(): string;
}
export declare class PredicateItem {
    /**
     * 将该列表中的每一个参数项用"or"连接起来
     */
    static alternative(items: IPredicateItem[]): {
        condition: string;
        terms: IPredicateItem[];
    };
    /**
     * 把参数项中条件的判断结果取反
     */
    static inverted(item: IPredicateItem): {
        condition: string;
        term: IPredicateItem;
    };
    /**
     * 检查方块状态的属性 // TODO 方块状态
     */
    static blockStateProperty(blockId: string, properties: any): IPredicateItem;
    /**
     * 检查伤害来源的属性
     */
    static damageSourceProperties(damagePredicate: any): IPredicateItem;
    /**
     * 实体的测试属性
     */
    static entityProperties(entity: EntityTargetType, locationPredicate: any): IPredicateItem;
    /**
     * 测试实体的记分板分数
     */
    static entityScores(entity: string, scores: Record<string, RangeObject<int>>): IPredicateItem;
    /**
     * 测试 killer_player实体是否可用
     */
    static killedByPlayer(inverse?: boolean): IPredicateItem;
    /**
     * 检查是否匹配当前位置 // TODO 位置通用标签
     */
    static locationCheck(offsetX: int, offsetY: int, offsetZ: int, locationPredicate: any): IPredicateItem;
    /**
     * 检查工具 // TODO 物品共通标签
     */
    static matchTool(itemPredicate: any): IPredicateItem;
    /**
     * 测试一个0.0–1.0之间的随机数是不是小于给定值
     */
    static randomChange(change: float): IPredicateItem;
    /**
     * 测试一个0.0–1.0之间的随机数是不是小于给定值，受killer实体身上的抢夺等级影响
     */
    static randomChangeWithLooting(change: float, lootingMultiplier: float): IPredicateItem;
    /**
     * 测试另一个被引用的条件（谓词）是否通过
     */
    static reference(name: string): IPredicateItem;
    /**
     * 1/爆炸半径的概率返回true
     */
    static survivesExplosion(): IPredicateItem;
    /**
     * 以附魔等级为索引，从表中挑选概率通过
     */
    static tableBonus(enchantment: EnchantmentId, chances: number[]): IPredicateItem;
    /**
     * 检查当前时间
     */
    static timeCheck(value: RangeObject<int>, period: int): IPredicateItem;
    /**
     * 检查当前的天气状态
     */
    static weatherCheck(raining: boolean, thundering: boolean): IPredicateItem;
    /**
     * 检查当前的天气状态
     */
    static valueCheck(value: RangeObject<int>, range: RangeObject<int>): IPredicateItem;
}
export {};
