UNPKG

@mark-wiemer/luanti-api

Version:

Luanti API TypeScript definitions for TypeScriptToLua

673 lines (572 loc) 17.9 kB
import type { LtColorSpec } from "./color"; import type { LtPointedThing } from "./entity"; import { LtInvRef } from "./inventory"; import type { MetaDataRef, LtItemDef, LtItemStack } from "./item"; import type { LtPlayer } from "./player"; import type { LtSoundDefs } from "./sound"; import type { LtVec3 } from "./vector"; export type LtNodeName = string; export type LtNodePlacementPrediction = string; export interface OnPlaceCallback { ( this: void, itemstack: LtItemStack, placer: LtPlayer | undefined, pointed_thing: LtPointedThing ): LtItemStack | undefined; } export interface OnDropCallback { ( this: void, itemstack: LtItemStack, dropper: LtPlayer | undefined, pos: LtVec3 ): void; } export interface OnUseCallback { ( this: void, itemstack: LtItemStack, user: LtPlayer | undefined, pointed_thing: LtPointedThing ): LtItemStack | undefined; } export interface LtNode { name: LtNodeName; param1: number; param2: number; } export interface LtDigParams {} export interface AfterUseCallback { ( this: void, itemstack: LtItemStack, user: LtPlayer | undefined, node: LtNode, digparams: LtDigParams ): void; } export type LtCollisionBox = Array<number>; export interface MTABMAction { ( this: void, pos: LtVec3, node: LtNode, active_object_count: number, active_object_count_wider: number ): void; } export interface LtABMDef { /** * Descriptive label for profiling purposes (optional). * Definitions with identical labels will be listed as one */ label: string; /**In the following two fields, also group:groupname will work*/ nodenames: Array<string>; /** * Any of these * If left out or empty, any neighbor will do */ neighbors: Array<string>; /**Operation interval in seconds*/ interval: number; /**Chance of trigger per-node per-interval is 1.0 / this*/ chance: number; /** * If true, catch-up behaviour is enabled * The chance value is temporarily reduced when returning to * an area to simulate time lost by the area being unattended. * Note chance value can often be reduced to 1 */ catch_up: boolean; action: MTABMAction; } export interface LtLBMAction { (this: void, pos: LtVec3, node: LtNode): void; } export interface LtLBMDef { /** * Descriptive label for profiling purposes (optional). * Definitions with identical labels will be listed as one. */ label: string; name: string; /** * List of node names to trigger the LBM on * Also non-registered nodes will work * Groups (as of group:groupname) will work as well */ nodenames: Array<string>; /** * Whether to run the LBM's action every time a block gets loaded, * and not just for blocks that were saved last time before LBMs were * introduced to the world */ run_at_every_load: boolean; action: LtLBMAction; } export interface LtTileAnimVerticalFramesDef extends LtTileAnimDef<"vertical_frames"> { /**Width of a frame in pixels*/ aspect_w: number; /**Height of a frame in pixels*/ aspect_h: number; /**Specify full loop length*/ length: number; } export interface LtTileAnimSheet2dDef extends LtTileAnimDef<"sheet_2d"> { /**width in num of frames*/ frames_w: number; /**height in num of frames*/ frames_h: number; /**length of single frame*/ frame_length: number; } export interface LtTileAnimTypeMap { vertical_frames: LtTileAnimVerticalFramesDef; sheet_2d: LtTileAnimSheet2dDef; } export interface LtTileAnimDef<T extends keyof LtTileAnimTypeMap> { type: T; } export interface LtTileDef<K extends keyof LtTileAnimTypeMap> { /**texture file name*/ name: string; animation?: LtTileAnimTypeMap[K]; backface_culling?: boolean; tileable_vertical?: boolean; tileable_horizontal?: boolean; color?: LtColorSpec; /**@deprecated: use name instead*/ image?: string; } export type LtNodeParamType = "none" | "light"; export type LtNodeParamType2 = "facedir"; //TODO - see what is allowed export type LtNodeLiquidType = "none" | "source" | "flowing"; export type LtNodeBoxType = | "regular" | "leveled" | "fixed" | "wallmounted" | "connected"; export type LtNodeBoxData = Array<number>; export type LtNodeBoxesData = LtNodeBoxData | Array<LtNodeBoxData>; export interface LtNodeBoxTypeMap { regular: LtNodeBoxRegular; leveled: LtNodeBoxLeveled; fixed: LtNodeBoxFixed; wallmounted: LtNodeBoxWallMounted; connected: LtNodeBoxConnected; } export interface LtNodeBox<T extends keyof LtNodeBoxTypeMap> { type: T; //TODO - finish } export interface LtNodeBoxRegular extends LtNodeBox<"regular"> { //TODO - lua_api not clear on this } /**TODO - lua_api not clear on this at all*/ export interface LtNodeBoxLeveled extends LtNodeBox<"leveled"> {} export interface LtNodeBoxFixed extends LtNodeBox<"fixed"> { fixed: LtNodeBoxesData; } export interface LtNodeBoxWallMounted extends LtNodeBox<"wallmounted"> { wall_top: LtNodeBoxData; wall_bottom: LtNodeBoxData; wall_side: LtNodeBoxData; } export interface LtNodeBoxConnected extends LtNodeBox<"connected"> { fixed: LtNodeBoxesData; connect_top?: LtNodeBoxesData; connect_bottom?: LtNodeBoxesData; connect_front?: LtNodeBoxesData; connect_left?: LtNodeBoxesData; connect_back?: LtNodeBoxesData; connect_right?: LtNodeBoxesData; } export type LtNodeSide = "top" | "bottom" | "front" | "left" | "back" | "right"; export type LtNodeSides = Array<LtNodeSide>; export interface LtNodeOnConstructCallback { (this: void, pos: LtVec3): void; } export interface LtNodeOnDestructCallback { (this: void, pos: LtVec3): void; } export interface LtNodeAfterDestructCallback { (this: void, pos: LtVec3, oldnode: LtNode): void; } export interface LtNodeOnFloodCallback { (this: void, pos: LtVec3, oldnode: LtNode, newnode: LtNode): void; } export interface LtNodeOnPlaceCallback { ( this: void, pos: LtVec3, placer: LtPlayer | undefined, itemstack: LtItemStack, pointed_thing: LtPointedThing ): void; } export interface LtNodeMetaRef extends MetaDataRef { get_inventory(): LtInvRef; } export interface LtNodeAfterDigCallback { ( this: void, pos: LtVec3, oldnode: LtNode, oldmetadata: LtNodeMetaRef, digger: LtPlayer | undefined ): void; } export interface LtNodeCanDigCallback { (this: void, pos: LtVec3, player?: LtPlayer): boolean; } export interface LtNodeOnPunchCallback { ( this: void, pos: LtVec3, node: LtNode, puncher: LtPlayer | undefined, pointed_thing: LtPointedThing ): void; } export interface LtNodeOnRightClickCallback { ( this: void, pos: LtVec3, node: LtNode, clicker: LtPlayer | undefined, itemstack: LtItemStack, pointed_thing: LtPointedThing ): void; } export interface LtNodeOnDigCallback { (this: void, pos: LtVec3, node: LtNode, digger: LtPlayer | undefined): void; } export interface LtNodeOnTimerCallback { (this: void, pos: LtVec3, elapsed: number): void; } export interface LtNodeFields { //fields = { name1 = value1, name2 = value2, ...} [key: string]: string; } export interface LtNodeOnReceiveFields { ( this: void, pos: LtVec3, formname: string, fields: LtNodeFields, sender: LtPlayer | undefined ): void; } export interface LtNodeAllowMetadataInventoryMoveCallback { ( this: void, pos: LtVec3, from_list: any, from_index: number, to_list: any, to_index: number, count: number, player: LtPlayer | undefined ): number; } export interface LtNodeAllowMetadataInventoryPutCallback { ( this: void, pos: LtVec3, listname: string, index: number, stack: LtItemStack, player: LtPlayer | undefined ): boolean; } export interface LtNodeAllowMetadataInventoryTakeCallback { ( this: void, pos: LtVec3, listname: string, index: number, stack: LtItemStack, player: LtPlayer ): boolean; } export interface LtNodeOnMetadataInventoryMove { ( this: void, pos: LtVec3, from_list: any, from_index: number, to_list: any, to_index: number, count: number, player: LtPlayer | undefined ): void; } export interface LtNodeOnMetadataInventoryPut { ( this: void, pos: LtVec3, listname: string, index: number, stack: LtItemStack, player: LtPlayer | undefined ): void; } export interface LtNodeOnMetadataInventoryTake { ( this: void, pos: LtVec3, listname: string, index: number, stack: LtItemStack, player: LtPlayer | undefined ): void; } export interface LtNodeOnBlast { (this: void, pos: LtVec3, intensity: number): void; } export interface LtNodeDropDef { /**Maximum number of items to drop*/ max_items: number; /**Choose max_items randomly from this list*/ items: Array<{ /**Items to drop*/ items: Array<string>; /**Probability of dropping is 1 / rarity*/ rarity: number; }>; } export type LtNodeDrawtype = | "normal" | "airlike" | "liquid" | "flowingliquid" | "glasslike" | "glasslike_framed" | "glasslike_framed_optional" | "allfaces" | "allfaces_optional" | "torchlike" | "signlike" | "plantlike" | "firelike" | "fencelike" | "raillike" | "nodebox" | "mesh"; export interface LtNodeDef<NodeBoxType extends LtNodeBoxType> extends LtItemDef { drawtype?: LtNodeDrawtype; /** * Supported for drawtypes "plantlike", "signlike", "torchlike", * "firelike", "mesh". * For plantlike and firelike, the image will start at the bottom of the * node, for the other drawtypes the image will be centered on the node. * Note that positioning for "torchlike" may still change. ]] */ visual_scale?: number; /**Textures of node; +Y, -Y, +X, -X, +Z, -Z * List can be shortened to needed length */ tiles?: string[] | LtTileDef<keyof LtTileAnimTypeMap>[]; /** * Same as `tiles`, but these textures are drawn on top of the * base tiles.You can use this to colorize only specific parts of * your texture.If the texture name is an empty string, that * overlay is not drawn.Since such tiles are drawn twice, it * is not recommended to use overlays on very common nodes. */ overlay_tiles?: string[] | LtTileDef<keyof LtTileAnimTypeMap>[]; /** * Special textures of node; used rarely(old field name: special_materials) * List can be shortened to needed length */ special_tiles?: string[] | LtTileDef<keyof LtTileAnimTypeMap>[]; /** * The node's original color will be multiplied with this color. * If the node has a palette, then this setting only has an effect * in the inventory and on the wield item. ]] */ color?: LtColorSpec; /**Use texture's alpha channel*/ use_texture_alpha?: boolean; /** * The node's `param2` is used to select a pixel from the image * (pixels are arranged from left to right and from top to bottom). * The node's color will be multiplied with the selected pixel's * color.Tiles can override this behavior. * Only when`paramtype2` supports palettes. ]] */ palette?: string; /** * If player is inside node, see "ColorSpec" * "green#0F" */ post_effect_color?: LtColorSpec; /** paramtype = "light" allows light to propagate from or through the node with light value * falling by 1 per node.This line is essential for a light source node to spread its light */ paramtype?: LtNodeParamType; paramtype2?: LtNodeParamType2; /**Force value for param2 when player places node*/ place_param2?: boolean; /**If false, the cave generator will not carve through this*/ is_ground_content?: boolean; /**If true, sunlight will go infinitely through this*/ sunlight_propagates?: boolean; /**If true, objects collide with node*/ walkable?: boolean; /**If true, can be pointed at*/ pointable?: boolean; /**If false, can never be dug*/ diggable?: boolean; /**If true, can be climbed on(ladder)*/ climbable?: boolean; /**If true, placed nodes can replace this node*/ buildable_to?: boolean; /**If true, liquids flow into and replace this node*/ floodable?: boolean; liquidtype?: LtNodeLiquidType; /**Flowing version of source liquid*/ liquid_alternative_flowing?: string; /**Source version of flowing liquid*/ liquid_alternative_source?: string; /**Higher viscosity = slower flow(max. 7)*/ liquid_viscosity?: number; /**If true, a new liquid source can be created by placing two or more sources nearby*/ liquid_renewable?: boolean; /** * Block contains level in param2.Value is default level, used for snow. * Don't forget to use "leveled" type nodebox */ leveled?: number; /**number of flowing nodes around source(max. 8)*/ liquid_range?: number; /**Player will take this amount of damage if no bubbles are left*/ drowning?: number; /** * Amount of light emitted by node. * To set the maximum(currently 14), use the value 'core.LIGHT_MAX'. * A value outside the range 0 to core.LIGHT_MAX causes undefined behavior */ light_source?: number; /**If player is inside node, this damage is caused*/ damage_per_second?: number; node_box?: LtNodeBoxTypeMap[keyof LtNodeBoxTypeMap]; /** * Used for nodebox nodes with the type == "connected" * Specifies to what neighboring nodes connections will be drawn * e.g. `{"group:fence", "default:wood"}` or `"default:stone"` */ connects_to?: Array<string>; /**Tells connected nodebox nodes to connect only to these sides of this node*/ connect_sides?: LtNodeSides; mesh?: string; /**If drawtype "nodebox" is used and selection_box is nil, then node_box is used*/ selection_box?: LtNodeBoxTypeMap["fixed"]; //TODO - see if more types allowed collision_box?: LtNodeBoxTypeMap["fixed"]; //TODO - see if more types allowed /**Support maps made in and before January 2012*/ legacy_facedir_simple?: boolean; /**Support maps made in and before January 2012*/ legacy_wallmounted?: boolean; sounds?: LtSoundDefs; /**Name of dropped node when dug.Default is the node itself*/ drop?: string | LtNodeDropDef; /** * Node constructor; called after adding node * Can set up metadata and stuff like that * Not called for bulk node placement(i.e.schematics and VoxelManip) * default: nil */ on_construct?: LtNodeOnConstructCallback; /**Node destructor; called before removing node * Not called for bulk node placement(i.e.schematics and VoxelManip) * default: nil */ on_destruct?: LtNodeOnDestructCallback; /**Node destructor; called after removing node * Not called for bulk node placement(i.e.schematics and VoxelManip) * default: nil */ after_destruct?: LtNodeAfterDestructCallback; /**Called when a liquid(newnode) is about to flood oldnode, if * it has`floodable = true` in the nodedef.Not called for bulk * node placement(i.e.schematics and VoxelManip) or air nodes.If * return true the node is not flooded, but on_flood callback will * most likely be called over and over again every liquid update * interval.Default: nil */ on_flood?: LtNodeOnFloodCallback; /**Called after constructing node when node was placed using * core.item_place_node / core.place_node * If return true no item is taken from itemstack * default: nil */ after_place_node?: LtNodeOnPlaceCallback; /**oldmetadata is in table format * Called after destructing node when node was dug using * core.node_dig / core.dig_node * default: nil */ after_dig_node?: LtNodeAfterDigCallback; /**returns true if node can be dug, or false if not * default: nil */ can_dig?: LtNodeCanDigCallback; /**default: core.node_punch * By default: Calls core.register_on_punchnode callbacks */ on_punch?: LtNodeOnPunchCallback; /**default: nil * if defined, itemstack will hold clicker's wielded item * Shall return the leftover itemstack * Note: pointed_thing can be nil, if a mod calls this function */ on_rightclick?: LtNodeOnRightClickCallback; /**default: core.node_dig * By default: checks privileges, wears out tool and removes node */ on_dig?: LtNodeOnDigCallback; /**default: nil * called by NodeTimers, see core.get_node_timer and NodeTimerRef * elapsed is the total time passed since the timer was started * return true to run the timer for another cycle with the same timeout value */ on_timer?: LtNodeOnTimerCallback; /** * Called when an UI form(e.g.sign text input) returns data * default: nil */ on_receive_fields?: LtNodeOnReceiveFields; /** * Called when a player wants to move items inside the inventory * Return value: number of items allowed to move */ allow_metadata_inventory_move?: LtNodeAllowMetadataInventoryMoveCallback; /** * Called when a player wants to put something into the inventory * Return value: number of items allowed to put * Return value: -1: Allow and don't modify item count in inventory */ allow_metadata_inventory_put?: LtNodeAllowMetadataInventoryPutCallback; /**Called when a player wants to take something out of the inventory * Return value: number of items allowed to take * Return value: -1: Allow and don't modify item count in inventor */ allow_metadata_inventory_take?: LtNodeAllowMetadataInventoryTakeCallback; on_metadata_inventory_move?: LtNodeOnMetadataInventoryMove; on_metadata_inventory_put?: LtNodeOnMetadataInventoryPut; /** * Called after the actual action has happened, according to what was allowed. * No return value */ on_metadata_inventory_take?: LtNodeOnMetadataInventoryTake; /** * intensity: 1.0 = mid range of regular TNT * If defined, called when an explosion touches the node, instead of * removing the node */ on_blast?: LtNodeOnBlast; }