From a9c05f0e387ddcbc196d263e6338d27eb286b04e Mon Sep 17 00:00:00 2001
From: luk3yx <luk3yx@users.noreply.github.com>
Date: Fri, 28 Aug 2020 22:54:48 +1200
Subject: [PATCH] Use JSON to store areas (#47)

This works around a limit of ~21000 areas because of limits in 'minetest.deserialize()'. Files will be migrated to the new format on first change.
---
 internal.lua | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/internal.lua b/internal.lua
index 2db9541..9591b3d 100644
--- a/internal.lua
+++ b/internal.lua
@@ -18,7 +18,7 @@ end
 
 -- Save the areas table to a file
 function areas:save()
-	local datastr = minetest.serialize(self.areas)
+	local datastr = minetest.write_json(self.areas)
 	if not datastr then
 		minetest.log("error", "[areas] Failed to serialize area data!")
 		return
@@ -33,10 +33,19 @@ function areas:load()
 		self.areas = self.areas or {}
 		return err
 	end
-	self.areas = minetest.deserialize(file:read("*a"))
+	local data = file:read("*a")
+	if data:sub(1, 1) == "[" then
+		self.areas, err = minetest.parse_json(data)
+	else
+		self.areas, err = minetest.deserialize(data)
+	end
 	if type(self.areas) ~= "table" then
 		self.areas = {}
 	end
+	if err and #data > 10 then
+		minetest.log("error", "[areas] Failed to load area data: " ..
+			tostring(err))
+	end
 	file:close()
 	self:populateStore()
 end