Registration ------------ creatura.register_mob(name, mob definition) Mob Definition uses almost all entity definition params { max_health = 10 -- Maximum Health damage = 0 -- Damage dealt by mob speed = 4 -- Maximum Speed tracking_range = 16 -- Maximum range for finding entities/blocks despawn_after = 1500 -- Despawn after being active for this amount of time max_fall = 8 -- How far a mob can fall before taking damage (set to 0 to disable fall damage) turn_rate = 7 -- Turn Rate in rad/s bouyancy_multiplier = 1 -- Multiplier for bouyancy effects (set to 0 to disable bouyancy) hydrodynamics_multiplier = 1 -- Multiplier for hydroynamic effects (set to 0 to disable hydrodynamics) hitbox = { -- Hitbox params (Uses custom registration to force get_pos() to always return bottom of box) width = 0.5, (total width = width * 2. A width of 0.5 results in a box with a total width of 1) height = 1 (total height of box) } animations = { anim = {range = {x = 1, y = 10}, speed = 30, frame_blend = 0.3, loop = true} } drops = { {name = (itemstring), min = 1, max = 3, chance = 1}, } follow = { "farming:seed_wheat", "farming:seed_cotton" } utility_stack = { -- Every second, all utilities in the stack are evaluated -- Whichever utilitiy's get_score function returns the highest number will be executed -- If multiple utilities have the same score, the one with the highest index is executed [1] = { `utility` -- name of utility to evaluate `get_score` -- function (only accepts `self` as an arg) that returns a number } } activate_func = function(self, staticdata, dtime_s) -- called upon activation step_func = function(self, dtime, moveresult) -- called every server step death_func = function(self) -- called when mobs health drops to/below 0 } Lua Entity Methods ------------------ `move(pos, method, speed, animation)` - `pos`: position to move to - `method`: method used to move to `pos` - `speed`: multiplier for `speed` - `animation`: animation to play while moving `halt()` - stops movement `turn_to(yaw[, turn_rate])` - `yaw`: yaw (in radians) to turn to - `turn_rate`: turn rate in rad/s (default: 10) -- likely to be deprecated `set_gravity(gravity)` - `gravity`: vertical acceleration rate `set_forward_velocity(speed)` - `speed`: rate in m/s to travel forward at `set_vertical_velocity(speed)` - `speed`: rate in m/s to travel vertically at `apply_knockback(dir, power)` - `dir`: direction vector - `power`: multiplier for dir `punch_target(target)` - applies 'damage' to 'target' `hurt(damage)` - `damage`: number to subtract from health (ignores armor) `heal(health)` - `health`: number to add to health `get_center_pos()` - returns position at center of hitbox `pos_in_box(pos[, size])` - returns true if 'pos' is within hitbox - `size`: width of box to check in (optional) `animate(anim)` - sets animation to `anim` `set_texture(id, tbl)` - `id`: table index - `tbl`: table of textures `set_scale(x)` - `x`: multiplier for base scale (0.5 sets scale to half, 2 sets scale to double) `fix_attached_scale(parent)` - sets scale to appropriate value when attached to 'parent' - `parent`: object `memorize(id, val)` -- stores `val` to staticdata - `id`: key for table - `val`: value to store `forget(id)` -- removes `id` from staticdata `recall(id)` -- returns value of `id` from staticdata `timer(n)` -- returns true avery `n` seconds `get_hitbox()` -- returns current hitbox `get_height()` -- returns current height `get_visual_size()` -- returns current visual size `follow_wielded_item(player)` -- returns itemstack, item name of `player`s wielded item if item is in 'follow' `get_target(target)` -- returns if `target` is alive, if mob has a line of sight with `target`, position of `target` Utilities --------- * `creatura.is_valid(mob)` * Returns false if object doesn't exist, otherwise returns ObjectRef/PlayerRef * `mob`: Luaentity, ObjectRef, or PlayerRef * `creatura.is_alive(mob)` * Returns false if object doesn't exist or is dead, otherwise returns ObjectRef/PlayerRef * `mob`: Luaentity, ObjectRef, or PlayerRef Environment access ------------------ * `creatura.get_node_height_from_def(name)` -- Returns total height of nodebox -- `name`: Itemstring/Name of node * `creatura.get_node_def(node)` -- Returns definition of node -- `node`: Itemstring/Name of node or position * `creatura.get_ground_level(pos, max_diff)` * Returns first position above walkable node within `max_diff` * `creatura.is_pos_moveable(pos, width, height)` * Returns true if a box with specified `width` and `height` can fit at `pos` * `width` should be the largest side of the collision box * Check from bottom of box * `creatura.fast_ray_sight(pos1, pos2, water)` * Checks for line of sight between `pos1 and `pos2` * Returns bool * Returns distance to obstruction * `creatura.sensor_floor(self, range, water)` * Finds distance to ground from bottom of entities hitbox * Returns distance to ground or `range` if no ground is found * `range`: Maximum range * `water`: If false, water will not be counted as ground * `creatura.sensor_ceil(self, range, water)` * Finds distance to ceiling from top of entities hitbox * Returns distance to ceiling or `range` if no ceiling is found * `range`: Maximum range * `water`: If false, water will not be counted as ceiling * `creatura.get_nearby_player(self)` * Finds player within `self.tracking_range` * Returns PlayerRef or nil * `creatura.get_nearby_players(self)` * Finds players within `self.tracking_range` * Returns table of PlayerRefs or empty table * `creatura.get_nearby_object(self, name)` * Finds object within `self.tracking_range` * Returns ObjectRef or nil * `name`: Name of object to search for * `creatura.get_nearby_objects(self, name)` * Finds objects within `self.tracking_range` * Returns table of ObjectRefs or empty table * `name`: Name of object to search for Global Mob API -------------- * `creatura.drop_items(self)` * Drops items from `self.drops` * `creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage)` * Deals damage * Applies knockback * Visualy and audibly indicates damage Pathfinding ----------- Creatura's pathfinder uses the A* algorithm for speed, as well as Theta* for decent performance and more natural looking paths. Both pathfinders will carry out pathfinding over multiple server steps to reduce lag spikes which does result in the path not being returned immediately, so your code will have to account for this. The maximum amount of time the pathfinder can spend per-step (in microseconds) can be adjusted in settings. * `creatura.pathfinder.find_path(self, pos1, pos2, get_neighbors)` * Finds a path from `pos1` to `pos2` * `get_neighbors` is a function used to find valid neighbors * `creatura.pathfinder.get_neighbors_fly` and `creatura.pathfinder.get_neighbors_swim` are bundled by default * `creatura.pathfinder.find_path_theta(self, pos1, pos2, get_neighbors)` * Finds a path from `pos1` to `pos2` * Returns a path with arbitrary angles for natural looking paths at the expense of performance * `get_neighbors` is a function used to find valid neighbors * `creatura.pathfinder.get_neighbors_fly` and `creatura.pathfinder.get_neighbors_swim` are bundled by default