Browse Source

Let mods choose a forceload limit (#13002)

Jude Melton-Houghton 1 year ago
parent
commit
f80ea73bfb
3 changed files with 11 additions and 5 deletions
  1. 3 2
      builtin/game/forceloading.lua
  2. 3 2
      builtin/settingtypes.txt
  3. 5 1
      doc/lua_api.txt

+ 3 - 2
builtin/game/forceloading.lua

@@ -33,7 +33,7 @@ local function get_relevant_tables(transient)
 	end
 end
 
-function core.forceload_block(pos, transient)
+function core.forceload_block(pos, transient, limit)
 	-- set changed flag
 	forceload_blocks_changed = true
 
@@ -46,7 +46,8 @@ function core.forceload_block(pos, transient)
 	elseif other_table[hash] ~= nil then
 		relevant_table[hash] = 1
 	else
-		if total_forceloaded >= (tonumber(core.settings:get("max_forceloaded_blocks")) or 16) then
+		limit = limit or tonumber(core.settings:get("max_forceloaded_blocks")) or 16
+		if limit >= 0 and total_forceloaded >= limit then
 			return false
 		end
 		total_forceloaded = total_forceloaded+1

+ 3 - 2
builtin/settingtypes.txt

@@ -1875,8 +1875,9 @@ active_block_range (Active block range) int 4 1 65535
 #    From how far blocks are sent to clients, stated in mapblocks (16 nodes).
 max_block_send_distance (Max block send distance) int 12 1 65535
 
-#    Maximum number of forceloaded mapblocks.
-max_forceloaded_blocks (Maximum forceloaded blocks) int 16 0
+#    Default maximum number of forceloaded mapblocks.
+#    Set this to -1 to disable the limit.
+max_forceloaded_blocks (Maximum forceloaded blocks) int 16 -1
 
 #    Interval of sending time of day to clients, stated in seconds.
 time_send_interval (Time send interval) float 5.0 0.001

+ 5 - 1
doc/lua_api.txt

@@ -6532,12 +6532,16 @@ Misc.
     * You may want to cache and call the old function to allow multiple mods to
       change knockback behavior.
 
-* `minetest.forceload_block(pos[, transient])`
+* `minetest.forceload_block(pos[, transient[, limit]])`
     * forceloads the position `pos`.
     * returns `true` if area could be forceloaded
     * If `transient` is `false` or absent, the forceload will be persistent
       (saved between server runs). If `true`, the forceload will be transient
       (not saved between server runs).
+    * `limit` is an optional limit on the number of blocks that can be
+      forceloaded at once. If `limit` is negative, there is no limit. If it is
+      absent, the limit is the value of the setting `"max_forceloaded_blocks"`.
+      If the call would put the number of blocks over the limit, the call fails.
 
 * `minetest.forceload_free_block(pos[, transient])`
     * stops forceloading the position `pos`