Mobs: Document core microtask templates
This commit is contained in:
parent
01e01991f3
commit
012f79b36d
@ -288,7 +288,7 @@ The field `_cmi_is_mob=true` will be set automatically for all mobs and can be u
|
|||||||
* `damage`: When mob takes non-fatal damage
|
* `damage`: When mob takes non-fatal damage
|
||||||
* `punch_no_damage`: When mob was punched but took no damage
|
* `punch_no_damage`: When mob was punched but took no damage
|
||||||
* `eat`: When mob eats something (this has a default sound)
|
* `eat`: When mob eats something (this has a default sound)
|
||||||
* `call`: Occassional mob call (only played manually)
|
* `call`: Occasional mob call (only played manually)
|
||||||
* `horny`: When mob becomes horny
|
* `horny`: When mob becomes horny
|
||||||
* `give_birth`: When mob gives birth to a child
|
* `give_birth`: When mob gives birth to a child
|
||||||
* `front_body_point`: A point of the front side of the mob. Used by the mob to "see"
|
* `front_body_point`: A point of the front side of the mob. Used by the mob to "see"
|
||||||
@ -408,7 +408,7 @@ Calling `rp_mobs.restore_state` in `on_activate` is a requirement, but everythin
|
|||||||
|
|
||||||
#### `rp_mobs.init_mob(mob)`
|
#### `rp_mobs.init_mob(mob)`
|
||||||
|
|
||||||
This initializes the mob and does initalization work in order to do things that
|
This initializes the mob and does initialization work in order to do things that
|
||||||
are required for all mobs.
|
are required for all mobs.
|
||||||
|
|
||||||
This function **must** be called in `on_activate` before any other mob-related function.
|
This function **must** be called in `on_activate` before any other mob-related function.
|
||||||
@ -600,7 +600,7 @@ The function arguments are:
|
|||||||
|
|
||||||
* `task_queue`: Reference to task queue on which the decider is run on.
|
* `task_queue`: Reference to task queue on which the decider is run on.
|
||||||
You can modify it at will.
|
You can modify it at will.
|
||||||
* `mob`: Refernence to mob object
|
* `mob`: Reference to mob object
|
||||||
* `dtime`: Time in seconds the last time the step decider was called (from `on_step`)
|
* `dtime`: Time in seconds the last time the step decider was called (from `on_step`)
|
||||||
|
|
||||||
If decider argument is nil, nothing will be done for that event.
|
If decider argument is nil, nothing will be done for that event.
|
||||||
@ -639,6 +639,14 @@ Add the microtask `microtask` to the specified `task`.
|
|||||||
Ends the currently active task in the given `task_queue` of `mob`.
|
Ends the currently active task in the given `task_queue` of `mob`.
|
||||||
If the task queue is empty, nothing happens.
|
If the task queue is empty, nothing happens.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Task template functions
|
||||||
|
|
||||||
|
This mod comes with a number of template functions for common microtasks like walking. See `API_template.md` for a reference.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Breeding functions
|
### Breeding functions
|
||||||
|
|
||||||
#### `rp_mobs.feed_tame_breed(mob, feeder, allowed_foods, food_till_tamed, food_till_horny, add_child_grow_timer, effect, eat_sound)`
|
#### `rp_mobs.feed_tame_breed(mob, feeder, allowed_foods, food_till_tamed, food_till_horny, add_child_grow_timer, effect, eat_sound)`
|
||||||
|
137
mods/rp_mobs/API_templates.md
Normal file
137
mods/rp_mobs/API_templates.md
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
# Repixture Mobs API: Task Templates
|
||||||
|
|
||||||
|
This document contains additional information about the Repixture Mobs API.
|
||||||
|
It contains task template functions for common use cases so we don't have to
|
||||||
|
start from zero for every mob.
|
||||||
|
|
||||||
|
See `API.md` for the main document and a general description of the task
|
||||||
|
system.
|
||||||
|
|
||||||
|
## Microtask templates
|
||||||
|
|
||||||
|
A microtask template is a function that returns a microtask that you can
|
||||||
|
then use to insert in a task. All microtask templates are part of the
|
||||||
|
`rp_mobs.microtasks` table.
|
||||||
|
|
||||||
|
### How to use
|
||||||
|
|
||||||
|
You simply call one of the template functions with the required parameters
|
||||||
|
(if any) to get a microtask returned. You then can insert this microtask
|
||||||
|
like any other microtask in a task.
|
||||||
|
|
||||||
|
Minimal example for doing nothing for 3 seconds (we assume that `mob`
|
||||||
|
is a mob object reference and `task_queue` is a task queue):
|
||||||
|
|
||||||
|
```
|
||||||
|
local task = rp_mobs.create_task({label="do nothing"})
|
||||||
|
local microtask = rp_mobs.microtasks.sleep(3)
|
||||||
|
rp_mobs.add_microtask_to_task(mob, task, microtask)
|
||||||
|
rp_mobs.add_task_to_task_queue(task_queue, task)
|
||||||
|
```
|
||||||
|
|
||||||
|
Also, all microtasks come with a 'finish' condition. If this condition is met,
|
||||||
|
the microtask is finished and removed from the task, continuing the processing
|
||||||
|
with the next microtask (if any).
|
||||||
|
|
||||||
|
## Microtask template reference
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.move_straight(move_vector, yaw, drag, max_timer)`
|
||||||
|
|
||||||
|
Move in a straight line on any axis.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
* `move_vector`: velocity vector to target.
|
||||||
|
* `yaw`: look direction in radians
|
||||||
|
* `drag`: (optional) if set as a vector, will adjust the velocity smoothly towards the target
|
||||||
|
velocity, with higher axis values leading to faster change. If unset, will set
|
||||||
|
velocity instantly. If drag is 0 or very small on an axis, this axis will see no velocity change
|
||||||
|
* `max_timer`: automatically finish microtask after this many seconds (nil = infinite)
|
||||||
|
|
||||||
|
Finish condition: If the time runs out (if set with `max_timer`), otherwise does not finish
|
||||||
|
on its own.
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.walk_straight(walk_speed, yaw, jump, max_timer)`
|
||||||
|
|
||||||
|
Walk in a straight line, jumping if hitting obstacle and `jump~=nil`.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
* `yaw`: walk direction in radians
|
||||||
|
* `jump`: jump strength if mob needs to jump or nil if no jumping
|
||||||
|
* `max_timer`: automatically finish microtask after this many seconds (nil = infinite)
|
||||||
|
|
||||||
|
Finish condition: If the time runs out (if set with `max_timer`), otherwise does not finish
|
||||||
|
on its own.
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.walk_straight_towards(walk_speed, target_type, target, set_yaw, reach_distance, jump, max_timer)`
|
||||||
|
|
||||||
|
Walk in a straight line towards a position or object.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
* `walk_speed`: walk speed
|
||||||
|
* `target_type`: "pos" (position) or "object"
|
||||||
|
* `target`: target, depending on `target_type`: position or object handle
|
||||||
|
* `set_yaw`: If true, will set mob's yaw to face target
|
||||||
|
* `reach_distance`: If mob is within this distance towards target, finish task
|
||||||
|
* `jump`: jump strength if mob needs to jump or nil if no jumping
|
||||||
|
* `max_timer`: automatically finish microtask after this many seconds (nil = infinite)
|
||||||
|
|
||||||
|
Finish condition: If the target is within `reach_distance` of the mob. Otherwise, when
|
||||||
|
the time runs out (if `max_timer` was set)
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.set_yaw(yaw)`
|
||||||
|
|
||||||
|
Set mob yaw instantly to `yaw`. Finishes instantly.
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.rotate_yaw_smooth(yaw, time)`
|
||||||
|
|
||||||
|
Change mob yaw linearly over time towards a target yaw.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
* `yaw`: Target yaw in radians or `"random"` for random yaw
|
||||||
|
* `time`: How much time to use until the target yaw is reached (in ms)
|
||||||
|
|
||||||
|
Finish condition: When target yaw was reached (within a small tolerance).
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.autoyaw()`
|
||||||
|
|
||||||
|
Set the mob yaw based on the current velocity on the XZ coordinate plane.
|
||||||
|
If the mob velocity on this plane is zero or near-zero, yaw will
|
||||||
|
not be changed.
|
||||||
|
|
||||||
|
Finish condition: Finishes instantly.
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.sleep(time)`
|
||||||
|
|
||||||
|
Do nothing for the given `time` in seconds, then finishes.
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.set_acceleration(acceleration)`
|
||||||
|
|
||||||
|
Instantly set mob acceleration to the given `acceleration` parameter (a vector).
|
||||||
|
|
||||||
|
Finish condition: Finishes instantly.
|
||||||
|
|
||||||
|
### `rp_mobs.microtasks.pathfind_and_walk_to(target_pos, searchdistance, max_jump, max_drop)`
|
||||||
|
|
||||||
|
WARNING: This function isn't very accurate stable. Use at your own risk!
|
||||||
|
|
||||||
|
Make the mob find a path (using the A\* algorithm) towards `target_pos`,
|
||||||
|
then starts to walk that path.
|
||||||
|
This assumes the mob is bound to gravity. Jumping up and falling down a few blocks is
|
||||||
|
part of the pathfinding.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
|
||||||
|
* `target_pos`: Target position
|
||||||
|
* `searchdistance`: How far (in nodes) from the mob's original position the pathfinder
|
||||||
|
will search before stopping
|
||||||
|
* `max_jump`: Maximum allowed jump height (can be 0)
|
||||||
|
* `max_drop`: Maximum allowed fall height (can be 0)
|
||||||
|
|
||||||
|
Finish condition: When the mob has reached `target_pos` (within a small tolerance).
|
||||||
|
Also, finished instantly when no path was found.
|
||||||
|
|
||||||
|
|
@ -40,14 +40,12 @@ local random_yaw = function()
|
|||||||
return (math.random(0, YAW_PRECISION) / YAW_PRECISION) * (math.pi*2)
|
return (math.random(0, YAW_PRECISION) / YAW_PRECISION) * (math.pi*2)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Task templates
|
|
||||||
|
|
||||||
rp_mobs.tasks = {}
|
|
||||||
|
|
||||||
-- Microtask templates
|
-- Microtask templates
|
||||||
|
-- See `API_templates.md` for documentation
|
||||||
|
|
||||||
rp_mobs.microtasks = {}
|
rp_mobs.microtasks = {}
|
||||||
|
|
||||||
|
-- FIXME: Mob does not walk the path very well, gets stuck a lot
|
||||||
rp_mobs.microtasks.pathfind_and_walk_to = function(target_pos, searchdistance, max_jump, max_drop)
|
rp_mobs.microtasks.pathfind_and_walk_to = function(target_pos, searchdistance, max_jump, max_drop)
|
||||||
local mtask = {}
|
local mtask = {}
|
||||||
mtask.label = "pathfind and walk to coordinate"
|
mtask.label = "pathfind and walk to coordinate"
|
||||||
@ -110,7 +108,6 @@ rp_mobs.microtasks.pathfind_and_walk_to = function(target_pos, searchdistance, m
|
|||||||
return rp_mobs.create_microtask(mtask)
|
return rp_mobs.create_microtask(mtask)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set yaw instantly
|
|
||||||
rp_mobs.microtasks.set_yaw = function(yaw)
|
rp_mobs.microtasks.set_yaw = function(yaw)
|
||||||
local label
|
local label
|
||||||
if yaw == "random" then
|
if yaw == "random" then
|
||||||
@ -142,13 +139,6 @@ local collides_with_wall = function(moveresult, include_objects)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Move in a straight line on any axis
|
|
||||||
-- * move_vector: velocity vector to target.
|
|
||||||
-- * yaw: look direction in radians
|
|
||||||
-- * drag: (optional) if set as a vector, will adjust the velocity smoothly towards the target
|
|
||||||
-- velocity, with higher axis values leading to faster change. If unset, will set
|
|
||||||
-- velocity instantly. If drag is 0 or very small on an axis, this axis will see no velocity change
|
|
||||||
-- * max_timer: automatically finish microtask after this many seconds (nil = infinite)
|
|
||||||
rp_mobs.microtasks.move_straight = function(move_vector, yaw, drag, max_timer)
|
rp_mobs.microtasks.move_straight = function(move_vector, yaw, drag, max_timer)
|
||||||
local label
|
local label
|
||||||
if max_timer then
|
if max_timer then
|
||||||
@ -203,10 +193,6 @@ rp_mobs.microtasks.move_straight = function(move_vector, yaw, drag, max_timer)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Walk in a straight line, jumping if hitting obstable and jump~=nil
|
|
||||||
-- * yaw: walk direction in radians
|
|
||||||
-- * jump: jump strength if mob needs to jump or nil if no jumping
|
|
||||||
-- * max_timer: automatically finish microtask after this many seconds (nil = infinite)
|
|
||||||
rp_mobs.microtasks.walk_straight = function(walk_speed, yaw, jump, max_timer)
|
rp_mobs.microtasks.walk_straight = function(walk_speed, yaw, jump, max_timer)
|
||||||
local label
|
local label
|
||||||
if max_timer then
|
if max_timer then
|
||||||
@ -293,14 +279,6 @@ rp_mobs.microtasks.walk_straight = function(walk_speed, yaw, jump, max_timer)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Walk in a straight line towards a position or object
|
|
||||||
-- * walk_speed: walk speed
|
|
||||||
-- * target_type: "pos" (position) or "object"
|
|
||||||
-- * target: target, depending on target_type: position or object handle
|
|
||||||
-- * set_yaw: If true, will set mob's yaw to face target
|
|
||||||
-- * reach_distance: If mob is within this distance towards target, finish task
|
|
||||||
-- * jump: jump strength if mob needs to jump or nil if no jumping
|
|
||||||
-- * max_timer: automatically finish microtask after this many seconds (nil = infinite)
|
|
||||||
rp_mobs.microtasks.walk_straight_towards = function(walk_speed, target_type, target, set_yaw, reach_distance, jump, max_timer)
|
rp_mobs.microtasks.walk_straight_towards = function(walk_speed, target_type, target, set_yaw, reach_distance, jump, max_timer)
|
||||||
local label
|
local label
|
||||||
if max_timer then
|
if max_timer then
|
||||||
@ -431,7 +409,6 @@ rp_mobs.microtasks.walk_straight_towards = function(walk_speed, target_type, tar
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Rotate yaw linearly over time
|
|
||||||
rp_mobs.microtasks.rotate_yaw_smooth = function(yaw, time)
|
rp_mobs.microtasks.rotate_yaw_smooth = function(yaw, time)
|
||||||
local label
|
local label
|
||||||
if yaw == "random" then
|
if yaw == "random" then
|
||||||
@ -468,7 +445,6 @@ rp_mobs.microtasks.rotate_yaw_smooth = function(yaw, time)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set yaw based on XZ velocity
|
|
||||||
rp_mobs.microtasks.autoyaw = function()
|
rp_mobs.microtasks.autoyaw = function()
|
||||||
return rp_mobs.create_microtask({
|
return rp_mobs.create_microtask({
|
||||||
label = "automatically set yaw",
|
label = "automatically set yaw",
|
||||||
@ -486,7 +462,6 @@ rp_mobs.microtasks.autoyaw = function()
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Do nothing for the given time in seconds
|
|
||||||
rp_mobs.microtasks.sleep = function(time)
|
rp_mobs.microtasks.sleep = function(time)
|
||||||
return rp_mobs.create_microtask({
|
return rp_mobs.create_microtask({
|
||||||
label = "sleep for "..time.."s",
|
label = "sleep for "..time.."s",
|
||||||
@ -502,7 +477,6 @@ rp_mobs.microtasks.sleep = function(time)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Instantly set mob acceleration to the given parameter
|
|
||||||
rp_mobs.microtasks.set_acceleration = function(acceleration)
|
rp_mobs.microtasks.set_acceleration = function(acceleration)
|
||||||
return rp_mobs.create_microtask({
|
return rp_mobs.create_microtask({
|
||||||
label = "set acceleration",
|
label = "set acceleration",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user