{"description":"Welcome to the best place to find Luanti mods, games, and texture packs","expired":false,"feed_url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases_feed.json","home_page_url":"https://content.luanti.ru/","icon":"https://content.luanti.ru/favicon-128.png","items":[{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h2 id=\"007\">0.0.7 <a class=\"header-anchor\" href=\"#007\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<ul>\n<li>Add <code>node_matches</code> utility.</li>\n</ul>\n","date_published":"2026-04-05T12:19:16Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/36015/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"## 0.0.7","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.7","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/36015/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h2 id=\"006\">0.0.6 <a class=\"header-anchor\" href=\"#006\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<ul>\n<li>Fix random_each by setting ratio default.</li>\n<li>Prevent restarting round_robin when calling start</li>\n<li>Add random_each function to loop over random items</li>\n<li>Add table_shallow_copy util</li>\n<li>Add debug utility</li>\n<li>Allow modules to not be cached with nocache fn call</li>\n<li>Use mod_proxy for register_timer.lua</li>\n<li>Change round_robin fn signature for on_item callback</li>\n<li>Add mod_proxy utility</li>\n<li>Make strong just normal text silly</li>\n<li>Add round robin util</li>\n<li>Remove broken first link to old dofile page</li>\n<li>Proxy optional depends register_timer</li>\n<li>Prevent popping more that the queue has</li>\n<li>Add vector_mod utility</li>\n<li>Add random dir vector because my version of Luanti does not have it</li>\n<li>Add deferred_batch helper to sync multiple async things</li>\n<li>Better document register decoration types and callback</li>\n<li>Update screenshot</li>\n<li>Fix code formatting</li>\n</ul>\n","date_published":"2026-04-01T12:33:09Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35951/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"## 0.0.6","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.6","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35951/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h2 id=\"005\">0.0.5 <a class=\"header-anchor\" href=\"#005\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<ul>\n<li>Prevent restarting round_robin when calling start</li>\n<li>Add random_each function to loop over random items</li>\n<li>Add table_shallow_copy util</li>\n<li>Add debug utility</li>\n<li>Allow modules to not be cached with nocache fn call</li>\n<li>Use mod_proxy for register_timer.lua</li>\n<li>Change round_robin fn signature for on_item callback</li>\n<li>Add mod_proxy utility</li>\n<li>Make strong just normal text silly</li>\n<li>Add round robin util</li>\n<li>Remove broken first link to old dofile page</li>\n<li>Proxy optional depends register_timer</li>\n<li>Prevent popping more that the queue has</li>\n<li>Add vector_mod utility</li>\n<li>Add random dir vector because my version of Luanti does not have it</li>\n<li>Add deferred_batch helper to sync multiple async things</li>\n<li>Better document register decoration types and callback</li>\n<li>Update screenshot</li>\n<li>Fix code formatting</li>\n</ul>\n","date_published":"2026-04-01T09:57:06Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35949/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"## 0.0.5","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.5","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35949/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h1 id=\"004\">0.0.4: <a class=\"header-anchor\" href=\"#004\" rel=\"nofollow\">\ud83d\udd17</a></h1>\n<ul>\n<li>Added <code>is_buildable_to.lua</code> to check if a node or position can be built on.</li>\n<li>Added <code>register_decoration.lua</code> for easier decoration registration with gennotify callbacks.</li>\n<li>Added caching to <code>luanti_utils.dofile</code> to avoid loading the same module multiple times.</li>\n<li>Updated documentation setup: moved <code>favicon.png</code>, added <code>ldoc.ltp</code> template for docs.</li>\n<li>Fixed minor corrections in <code>register_node_copy.lua</code> comments and function signature.</li>\n</ul>\n","date_published":"2026-03-18T12:59:50Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35617/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"# 0.0.4:","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.4","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35617/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h2 id=\"003\">0.0.3 <a class=\"header-anchor\" href=\"#003\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<ul>\n<li>Add <code>controls.lua</code> as proxy module for optional controls mod.</li>\n<li>General improvements to module documentation.</li>\n<li>Add wallmounted_to_facedir param2 util.</li>\n</ul>\n","date_published":"2026-03-16T12:05:16Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35550/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"## 0.0.3","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.3","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35550/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h2 id=\"002\">0.0.2 <a class=\"header-anchor\" href=\"#002\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<ul>\n<li>Add modify_texture util.</li>\n<li>Add register_copy_node util to adopt def of other nodes.</li>\n<li>Add table_merge util.</li>\n</ul>\n","date_published":"2026-03-13T14:50:00Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35493/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"## 0.0.2","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.2","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35493/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h2 id=\"001\">0.0.1 <a class=\"header-anchor\" href=\"#001\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<ul>\n<li>Prevented an unnecessary <code>nil</code> check when comparing player positions.</li>\n<li>Avoided potential errors when a player moves for the first time after joining.</li>\n</ul>\n","date_published":"2026-03-12T18:57:05Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35481/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"## 0.0.1","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.1","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35481/"},{"author":{"avatar":"https://content.luanti.ru/uploads/67eebc0c2f.png","name":"Bas080","url":"https://content.luanti.ru/users/Bas080/"},"content_html":"<h1 id=\"changelog\">Changelog <a class=\"header-anchor\" href=\"#changelog\" rel=\"nofollow\">\ud83d\udd17</a></h1>\n<h2 id=\"000\">0.0.0 <a class=\"header-anchor\" href=\"#000\" rel=\"nofollow\">\ud83d\udd17</a></h2>\n<p>Initial release.</p>\n<ul>\n<li>\n<p><code>luanti_utils.dofile</code>\nHelper to load Lua files relative to the current mod directory.</p>\n</li>\n<li>\n<p>Function extension utilities</p>\n<ul>\n<li><code>extend_function</code> \u00e2\u0080\u0093 wrap existing functions with additional behavior.</li>\n<li><code>extend_item</code> \u00e2\u0080\u0093 extend node callbacks while preserving access to the original callback.</li>\n<li><code>extend_group</code> \u00e2\u0080\u0093 apply callback extensions to all nodes in a group.</li>\n</ul>\n</li>\n<li>\n<p>Node and map utilities</p>\n<ul>\n<li><code>emerge_node</code> \u00e2\u0080\u0093 ensure a node is loaded before executing a callback.</li>\n<li><code>migrate_node</code> \u00e2\u0080\u0093 helper for registering LBMs to migrate nodes.</li>\n</ul>\n</li>\n<li>\n<p>Inventory migration system</p>\n<ul>\n<li><code>migrate_inventory</code> \u00e2\u0080\u0093 register migration functions for specific items.</li>\n<li>Automatic migration when:\n<ul>\n<li>inventories are accessed via <code>core.get_meta</code></li>\n<li>players join the server.</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>Player walk detection</p>\n<ul>\n<li><code>register_on_player_walk</code> \u00e2\u0080\u0093 global callback when a player moves between nodes.</li>\n<li><code>node_on_player_walk</code> \u00e2\u0080\u0093 node-level callbacks:\n<ul>\n<li><code>on_player_walk_enter</code></li>\n<li><code>on_player_walk_leave</code></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>Server idle task system</p>\n<ul>\n<li><code>on_server_idle</code> \u00e2\u0080\u0093 run tasks only when the server has spare time.</li>\n<li><code>on_server_idle.wrap</code> \u00e2\u0080\u0093 defer function execution to idle time.</li>\n<li>Idle-based asynchronous table helpers:\n<ul>\n<li><code>on_server_idle_each</code></li>\n<li><code>on_server_idle_map</code></li>\n<li><code>on_server_idle_filter</code></li>\n<li><code>on_server_idle_reduce</code></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>Queue implementations</p>\n<ul>\n<li><code>queue</code> \u00e2\u0080\u0093 simple in-memory FIFO queue.</li>\n<li><code>persistent_queue</code> \u00e2\u0080\u0093 FIFO queue persisted using ModStorage.</li>\n</ul>\n</li>\n<li>\n<p>Utility helpers</p>\n<ul>\n<li><code>debounce</code> \u00e2\u0080\u0093 delay execution until calls stop for a given duration.</li>\n<li><code>noop</code> \u00e2\u0080\u0093 empty function helper.</li>\n</ul>\n</li>\n</ul>\n","date_published":"2026-03-12T18:15:06Z","id":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35478/","image":"https://content.luanti.ru/thumbnails/4/a99c647500.png","language":"en","summary":"# Changelog","tags":["release"],"title":"\"luanti_utils\" updated: 0.0.0","url":"https://content.luanti.ru/packages/Bas080/luanti_utils/releases/35478/"}],"title":"ContentDB package updates","version":"https://jsonfeed.org/version/1"}
