Split the README file, add API.md
[minetest_playerphysics.git] / API.md
blobd29115d17ab0df164490a19bad45a17ba39b6fad
1 # Player Physics API Documentation
2 This document explains how to use the Player Physics API as a developer.
4 ## Quick start
5 Let's say you have a mod `example` and want to double the speed of the player (i.e. multiply it by a factor of 2), but you also don't want to break other mods that might touch the speed.
7 Previously, you might have written something like this:
9 `player:set_physics_override({speed=2})`
11 However, your mod broke down as soon the mod `example2` came along, which wanted to increase the speed by 50%. In the real game, the player speed randomly switched from 50% and 200% which was a very annoying bug.
13 In your `example` mod, you can replace the code with this:
15 `playerphysics.add_physics_factor(player, "speed", "my_double_speed", 2)`
17 Where `"my_double_speed` is an unique ID for your speed factor.
19 Now your `example` mod is interoperable! And now, of course, the `example2` mod has to be updated in a similar fashion.
21 ## Precondition
22 There is only one precondition to using this mod, but it is important:
24 Mods *MUST NOT* call `set_physics_override` directly for numerical values. Instead, to modify player physics, all mods that touch player physics have to use this API.
29 ## Functions
30 ### `playerphysics.add_physics_factor(player, attribute, id, value)`
31 Adds a factor for a player physic and updates the player physics immediately.
33 #### Parameters
34 * `player`: Player object
35 * `attribute`: Which of the physical attributes to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`)
36 * `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-attribute type basis
37 * `value`: The factor to add to the list of products
39 If a factor for the same player, attribute and `id` already existed, it will be overwritten.
43 ### `playerphysics.remove_physics_factor(player, attribute, id)`
44 Removes the physics factor of the given ID and updates the player's physics.
46 #### Parameters
47 Same as in `playerphysics.add_physics_factor`, except there is no `value` argument.
49 ## Examples
50 ### Speed changes
51 Let's assume this mod is used by 3 different mods all trying to change the speed:
52 Potions, Exhaustion and Electrocution.
53 Here's what it could look like:
55 Potions mod:
56 ```
57 playerphysics.add_physics_factor(player, "speed", "run_potion", 2)
58 ```
60 Exhaustion mod:
61 ```
62 playerphysics.add_physics_factor(player, "jump", "exhausted", 0.75)
63 ```
65 Electrocution mod:
66 ```
67 playerphysics.add_physics_factor(player, "jump", "shocked", 0.9)
68 ```
70 When the 3 mods have done their change, the real player speed is simply the product of all factors, that is:
72 2 * 0.75 * 0.9 = 1.35
74 The final player speed is thus 135%.
76 ### Speed changes, part 2
78 Let's take the example above.
79 Now if the Electrocution mod is done with shocking the player, it just needs to call:
81 ```
82 playerphysics.remove_physics_factor(player, "jump", "shocked")
83 ```
85 The effect is now gone, so the new player speed will be:
87 2 * 0.75 = 1.5
89 ### Sleeping
90 To simulate sleeping by preventing all player movement, this can be done with this easy trick:
92 ```
93 playerphysics.add_physics_factor(player, "speed", "sleeping", 0)
94 playerphysics.add_physics_factor(player, "jump", "sleeping", 0)
95 ```
97 This works regardless of the other factors because 0 times anything equals 0.