User:Xyz/stress

From Minetest Developer Wiki
Jump to navigation Jump to search

_()!

http://irc.minetest.ru/minetest/2013-02-17#i_2877771

Experimental implementation: https://github.com/xyzz/minetest-stress

Core concepts

All functions are prefixed with :. All properties are prefixed with ..

What do we want:

  • Consistent API
  • Good docs (with examples)
  • Chaining (<source enclose=none>_("default:dirt"):on("punch", func):on("something", func):on("wtf", func):craft({"default:grass"})</source>)
  • Events (<source enclose=none>:on("wtf", function(e) doSomething end)</source>)
  • Nice assignments (<source enclose=none>e.stack = "mybrand:newstack 99"</source>) instead of ugly function calls (<source enclose=none>player:set_wielded_wtf_am_i_doing(ItemStack("asd"))</source>). 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. <source> _({0, 0, 0}):meta("first", "value"):name("default:dirt") </source>

Stress.Position

Same as position. Can be created from either {x = …, y = …, z = …} or {…, …, …}

Supports -(unary), +, -, *.

Do use it as vector. <source> 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} … </source>

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 <source enclose="none">minetest.env:set_node()</source>)
  • :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)

<source> 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") </source>

Something

An example of code in stress: <source> _("default:dirt"):on("place", function(me)

   me:name("default:dirt_with_grass")

end) </source> same without stress <source> 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) </source>

Something more?

<source> 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) </source>