diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index f3c47b6b..5b7e30b3 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -212,6 +212,10 @@ void ContentLoader::loadBlock(Block& def, std::string name, fs::path file) { root->str("script-name", def.scriptName); root->str("ui-layout", def.uiLayout); root->num("inventory-size", def.inventorySize); + root->num("tick-interval", def.tickInterval); + if (def.tickInterval == 0) { + def.tickInterval = 1; + } if (def.hidden && def.pickingItem == def.name+BLOCK_ITEM_SUFFIX) { def.pickingItem = CORE_EMPTY; diff --git a/src/logic/BlocksController.cpp b/src/logic/BlocksController.cpp index 8496bd30..9ddf12b8 100644 --- a/src/logic/BlocksController.cpp +++ b/src/logic/BlocksController.cpp @@ -113,8 +113,9 @@ void BlocksController::onBlocksTick(int tickid, int parts) { if ((id + tickid) % parts != 0) continue; auto def = indices->getBlockDef(id); - if (def->rt.funcsset.onblockstick) { - scripting::on_blocks_tick(def, tickRate); + auto interval = def->tickInterval; + if (def->rt.funcsset.onblockstick && tickid / parts % interval == 0) { + scripting::on_blocks_tick(def, tickRate / interval); } } } diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index c9db52cb..4628dd0e 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -162,6 +162,9 @@ public: /// @brief Block inventory size. 0 - no inventory uint inventorySize = 0; + // @brief Block tick interval (1 - 20tps, 2 - 10tps) + uint tickInterval = 1; + /// @brief Runtime indices (content indexing results) struct { /// @brief block runtime integer id