User:Xyz/stress
_()
!
http://irc.minetest.ru/minetest/2013-02-17#i_2877771
Experimental implementation: https://github.com/xyzz/minetest-stress
Contents |
Core concepts
All functions are prefixed with :
. All properties are prefixed with .
.
What do we want:
- Consistent API
- Good docs (with examples)
- Chaining (_("default:dirt"):on("punch", func):on("something", func):on("wtf", func):craft({"default:grass"}))
- Events (:on("wtf", function(e) doSomething end))
- Nice assignments (e.stack = "mybrand:newstack 99") instead of ugly function calls (player:set_wielded_wtf_am_i_doing(ItemStack("asd"))). This is probably not a good idea though because it won't work in all places, making people confused.
stressedNode → Stress.Node
Same for others.
Types
All stressed*
members should have __type
property containing their type as a string.
Underlined functions return self
, this should be used for method chaining.
_({0, 0, 0}):meta("first", "value"):name("default:dirt")
Stress.Position
Same as position. Can be created from either {x = …, y = …, z = …}
or {…, …, …}
Supports -(unary), +, -, *.
Do use it as vector.
Stress.Position(A) === _:p(A) -- shortcut for convenience -- you won't use it much anyway as we provide Stress.Position everywhere -- preferred code style: -- _:p(A) — good -- _:p{1, 2, 3} — good -- _:p{x=1, y=2, z=3} — good -- _:p({1, 2, 3}) — not as good Stress.Position{1, 2, 3} + {4, 5, 6} Stress.Position{0, 0, 0} - Stress.Position{1, 2, 3} Stress.Position{1, 2, 3} * 5 -- {5, 10, 15} Stress.Position{1, 2, 3} * {y = 5} --- {1, 10, 3} …
stressedArea
_(pos1, pos2)
, pos1
, pos2
are stressedPositions
-
:name("string")
-
:meta("name", "value")
-
:each(function(node))
—node
is stressedNode
Stress.Node
Created via _(position)
Implements:
-
:name()
— get node name -
:name("string")
— set node name (like minetest.env:set_node()) -
:set("string")
— same as:name("string")
-
:meta()
— returns all meta as a table -
:meta(table)
— overwrites meta with the table (or should it rather update values instead of deleting all that are not present in the table?) -
:meta("name")
— get single meta value -
:meta("name", "value")
— set meta -
:inventory("name")
— returns Stress.Inventory (name is actually listname)
Stress.NodeDef
(needs better name)
Created via _("name")
, i.e. _("default:dirt")
-
:on("event", function())
— registers event:-
dig
-
place
-
punch
-
rightclick
-
-
:every
— registers ABM- every(time, function)
- every(time, chance, function)
- ??
Stress.Inventory
-
:empty()
— returns true if inventory is empty -
:clear()
— remove everything from inventory -
:size()
— get size of an inventory -
:size(N)
— set size of an inventory -
:width()
-
:width(N)
-
:stack(X)
— get the Xth stack from inventory, modifiable
Stress.Stack
Stress.Stack points to the specific slot in inventory.
-
:set(value)
-
:name()
-
:name(S)
-
:count()
-
:count(N)
-
:wear()
-
:wear(N)
-
:pop([N])
— takes N items (or 1 if N is not provided) -
:push([N])
— adds N items (or 1 if N is not provided)
Global functions
-
_:on("event", function())
-
generated
-
shutdown
- …
-
-
_:iterate(pos1, pos2)
for pos in _:iterate({0, 0, 0}, {1, 1, 1}) do _(pos):name("air") end -- same as _({0, 0, 0}, {1, 1, 1}):name("air")
Something
An example of code in stress:
_("default:dirt"):on("place", function(me) me:name("default:dirt_with_grass") end)
same without stress
minetest.register_on_placenode(function(pos, newnode) if newnode.name == "default:dirt" then minetest.env:set_node(pos, {name="default:dirt_with_grass"}) end end)
Something more?
dirttograss = nil _:on("chat", function(message) if message == "/dirttograss" and not dirttograss then dirttograss = _("default:dirt"):on("place", function(me) me:name("default:dirt_with_grass") end) elseif message == "/nodirttograss" and dirttograss then _(dirttograss):clear() end end)