• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

GlobalEvent Server saves (optimized version with less lags)

sn3ejk

This account is inactive.
Joined
Nov 16, 2011
Messages
2,121
Solutions
1
Reaction score
145
  • data/globalevents/globalevents.xml
    XML:
    <globalevent time="{hour}" event="script" value="global_saves.lua"/>
  • data/globalevents/scripts/global_saves.lua
    Lua:
    local config =
    {
    	delay = 5000 -- in milliseconds
    }
    
    
    function onTime(time)
    	function do_save_player(pid)
    		local start = os.clock()
    		doPlayerSave(pid)
    		
    		local guid = getPlayerGUID(pid)
    		local house = getHouseByPlayerGUID(guid)
    		if house then
    			doSaveHouse(house)
    		end
    		table.insert(logs, "[" .. os.date("%m/%d/%y %H:%M:%S") .. "] Player #" .. guid .. (house ~= nil and "(house)" or "") .. " has been saved in " .. os.clock() - start .. ".")
    	end
    
    	local logs, i, save_start = {}, 0, os.clock()
    	table.insert(logs, "[" .. os.date("%m/%d/%y %H:%M:%S") .. "] doSave started.")
    	
    	for _, pid in pairs(getPlayersOnline()) do
    		if i % 2 == 0 then
    			do_save_player(pid)
    		else
    			addEvent(valid(do_save_player), config.delay, pid)
    		end
    		i = i + 1
    	end
    	table.insert(logs, "[" .. os.date("%m/%d/%y %H:%M:%S") .. "] doSave finished in " .. os.clock() - save_start .. ".")
    	
    	local file = io.open(getLogsDir() .. "save.log", "a")
    	if file then
    		file:write(table.concat(logs, "\n"))
    		file:close()
    	end
    	
    	return true
    end
 
Why is it better than this one?
Lua:
-- Local config
local timetosave = 30000 -- It's time to save after broadcast, delay 30 seconds
local delay = 5000 -- It's time to save odd after pair, delay 5 seconds
 
local function doSavePlayerAndHouse(cid)
    doPlayerSave(cid)
    doSaveHouse({getHouseByPlayerGUID(getPlayerGUID(cid))})
    return true
end
 
local function save()
    for _, cid in ipairs(getPlayersOnline()) do
        if getPlayerGUID(cid) % 2 == 0 then
            doSavePlayerAndHouse(cid)
        else
            addEvent(savesavePlayer, delay, cid)
        end
    end
end
 
It is basically the same, but without the cool log. Also, yours will not check if the player logs out in between callind addEvent and the actual save.
 
It's saving houses right?

@sn3ejk there is a possibility to clone, you should save offline player's house.
 
XML:
<globalevent name="save" interval="600000" event="script" value="save.lua"/>

I removed log.
Lua:
local config =
{
	delay = 5000 -- in milliseconds
}
 
 
function onTime(time)
	local function do_save_player(pid)
		local start = os.clock()
		doPlayerSave(pid)
 
		local guid = getPlayerGUID(pid)
		local house = getHouseByPlayerGUID(guid)
		if house then
			doSaveHouse(house)
		end
	end
 
	local i, save_start = 0, os.clock()
 
	for _, pid in pairs(getPlayersOnline()) do
		if i % 2 == 0 then
			do_save_player(pid)
		else
			addEvent(valid(do_save_player), config.delay, pid)
		end
		i = i + 1
	end
 
	return true
end


XML:
<globalevent name="savehouse" interval="900000" event="script" value="savehouse.lua"/>

It will save all houses each 15 minutes. No matter if player is online or offline.
Lua:
local config = 
{
	timetosave = 30000 -- It's time to save after broadcast, delay 30 seconds
	delay = 5000 -- It's time to save odd after pair, delay 5 seconds
}
 
local function doSaveHouse(cid)
	doSaveHouse({getHouseByPlayerGUID(getPlayerGUID(cid))})
	return true
end
 
local function save()
	local result = db.getResult("SELECT * FROM houses WHERE (id > 0) ORDER BY id DESC LIMIT 1;")
	for _, cid in ipairs(result) do
		if (result:getID() < 1) then
			return true
        	else
            		addEvent(doSaveHouse, delay, cid)
        	end
	end
end
 
function onThink(interval, lastExecution, thinkInterval)
    addEvent(save, timetosave)
    doBroadcastMessage("Server save within 30 seconds, please mind it may freeze.")
end


If your OTs never cash it will be the best solution(?)
 
Back
Top