mirror of
https://github.com/rubenwardy/forceload.git
synced 2024-11-22 06:53:44 +01:00
Initial Commit
This commit is contained in:
commit
4a3c308506
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*~*
|
||||
|
9
README.md
Normal file
9
README.md
Normal file
@ -0,0 +1,9 @@
|
||||
Forceload Mod
|
||||
=============
|
||||
|
||||
This mod allows areas in the map to be keep loaded.
|
||||
Use the forceload:anchor block.
|
||||
|
||||
Created by rubenwardy
|
||||
|
||||
License: LGPL 3.0 or later
|
159
init.lua
Normal file
159
init.lua
Normal file
@ -0,0 +1,159 @@
|
||||
local _pts = minetest.pos_to_string
|
||||
function minetest.pos_to_string(pos)
|
||||
if not pos then
|
||||
return "(-,-,-)"
|
||||
end
|
||||
return _pts(pos)
|
||||
end
|
||||
|
||||
-- Makes sure that force load areas are handled correctly
|
||||
function ForceloadManager(filetoopen, hide_file_errors)
|
||||
local blocks = {}
|
||||
if filetoopen ~= nil then
|
||||
local file = io.open(filetoopen, "r")
|
||||
if file then
|
||||
local table = minetest.deserialize(file:read("*all"))
|
||||
file:close()
|
||||
if type(table) == "table" then
|
||||
blocks = table
|
||||
end
|
||||
elseif not hide_file_errors then
|
||||
minetest.log("error", "File "..filetoopen.." does not exist!")
|
||||
end
|
||||
end
|
||||
for i = 1, #blocks do
|
||||
if not minetest.forceload_block(blocks[i]) then
|
||||
minetest.log("error", "Failed to load block " .. minetest.pos_to_string(blocks[i]))
|
||||
end
|
||||
end
|
||||
return {
|
||||
_blocks = blocks,
|
||||
load = function(self, pos)
|
||||
if minetest.forceload_block(pos) then
|
||||
table.insert(self._blocks, vector.new(pos))
|
||||
return true
|
||||
end
|
||||
minetest.log("error", "Failed to load block " .. minetest.pos_to_string(pos))
|
||||
return false
|
||||
end,
|
||||
unload = function(self, pos)
|
||||
for i = 1, #self._blocks do
|
||||
if vector.equals(pos, self._blocks[i]) then
|
||||
minetest.forceload_block(pos)
|
||||
table.remove(self._blocks, i)
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end,
|
||||
iter = function(self, func)
|
||||
for i = 1, #self._blocks do
|
||||
if func(i, self._blocks[i]) == true then
|
||||
table.remove(self._blocks, i)
|
||||
i = i - 1
|
||||
end
|
||||
end
|
||||
end,
|
||||
save = function(self, filename)
|
||||
local file = io.open(filename, "w")
|
||||
if file then
|
||||
file:write(minetest.serialize(self._blocks))
|
||||
file:close()
|
||||
end
|
||||
end,
|
||||
verify = function(self)
|
||||
return self:verify_each(function(pos, block)
|
||||
local name = "ignore"
|
||||
if block ~= nil then
|
||||
name = block.name
|
||||
end
|
||||
|
||||
if name == "ignore" then
|
||||
if not pos.last or elapsed_time > pos.last + 15 then
|
||||
pos.last = elapsed_time
|
||||
if not minetest.forceload_block(pos) then
|
||||
minetest.log("error", "Failed to force load " .. minetest.pos_to_string(pos))
|
||||
pos.remove = true
|
||||
end
|
||||
end
|
||||
return false
|
||||
elseif name == "forceload:anchor" then
|
||||
pos.last = elapsed_time
|
||||
return true
|
||||
else
|
||||
minetest.log("error", minetest.pos_to_string(pos) .. " shouldn't be loaded")
|
||||
pos.remove = true
|
||||
return false
|
||||
end
|
||||
end)
|
||||
end,
|
||||
verify_each = function(self, func)
|
||||
local not_loaded = {}
|
||||
for i = 1, #self._blocks do
|
||||
local res = minetest.get_node(self._blocks[i])
|
||||
if not func(self._blocks[i], res) then
|
||||
--[[table.insert(not_loaded, {
|
||||
pos = self._blocks[i],
|
||||
i = i,
|
||||
b = res })]]--
|
||||
end
|
||||
end
|
||||
return not_loaded
|
||||
end,
|
||||
clean = function(self)
|
||||
local i = 1
|
||||
while i <= #self._blocks do
|
||||
if self._blocks[i].remove then
|
||||
table.remove(self._blocks, i)
|
||||
else
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
local flm = ForceloadManager(minetest.get_worldpath().."/flm.json", true)
|
||||
|
||||
minetest.register_privilege("forceload", "Allows players to use forceload block anchors")
|
||||
|
||||
minetest.register_node("forceload:anchor",{
|
||||
description = "Block Anchor",
|
||||
walkable = false,
|
||||
tiles = {"forceload_anchor.png"},
|
||||
groups = {cracky = 3, oddly_breakable_by_hand = 2},
|
||||
after_destruct = function(pos)
|
||||
flm:unload(pos)
|
||||
flm:save(minetest.get_worldpath().."/flm.json")
|
||||
end,
|
||||
after_place_node = function(pos, placer)
|
||||
if not minetest.check_player_privs(placer:get_player_name(),
|
||||
{forceload = true}) then
|
||||
minetest.chat_send_player(placer:get_player_name(), "The forceload privilege is required to do that.")
|
||||
elseif flm:load(pos) then
|
||||
flm:save(minetest.get_worldpath().."/flm.json")
|
||||
return
|
||||
end
|
||||
minetest.set_node(pos, {name="air"})
|
||||
return true
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("a", {func = function(name)
|
||||
flm:verify()
|
||||
flm:clean()
|
||||
end})
|
||||
|
||||
local elapsed_time = 0
|
||||
local count = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
count = count + dtime
|
||||
elapsed_time = elapsed_time + dtime
|
||||
if count > 5 then
|
||||
count = 0
|
||||
--print("Verifying...")
|
||||
flm:verify()
|
||||
flm:clean()
|
||||
end
|
||||
end)
|
||||
|
BIN
textures/forceload_anchor.png
Normal file
BIN
textures/forceload_anchor.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 463 B |
Loading…
Reference in New Issue
Block a user