cool, if that script works for sqlite tooThanks for comments.
@Snow, try replacing UNIX_TIMESTAMP() with date('now') for sqlite.
i'll merge it with my globalevent players autodelete ^^
cool, if that script works for sqlite tooThanks for comments.
@Snow, try replacing UNIX_TIMESTAMP() with date('now') for sqlite.
versions
This mod will clean houses of inactive players every time your server starts and move their items to their depots.Code:1.0 - initial release (17.02.2010) 1.01 - added multiworld support, optimized query. (17.03.2010) 1.02 - now uses only one sql query, removed multiworld configurable since it's not needed anymore (18.03.2010)
Mind it may freeze for a long time if it was to clean many heavily stuffed houses. Moving items to depots is kinda slow. However running this mod every day will lessen the load and keep the houses free for active players.
Tested on TFS 0.4 DEV, although it should work flawlessly with 0.3.6 and possibly with 0.3.5 as well.
MOD VERSION
Just save it as cleanhouses.xml in your TFS/mods directory.Code:<?xml version="1.0" encoding="UTF-8"?> <mod name="Cleanhouses" version="1.02" author="nsanee" contact="otland.net" enabled="yes"> <description> v.1.01 - small fixes, optimized query + multiworld support. v 1.02 - now uses only one sql query, removed multiworld configurable since it's not needed anymore This mod will clean houses of inactive players and move their items to the depot. config explained: days - If the player hasn't logged in for this number of days his house will be freed. log - true/false, whether to enable logging of which houses have been cleaned. file - path to the log file, where logs will be stored. Ignored if 'log' set to false DO NOT remove doSaveServer() at the end, otherwise if your server happens to crash before the nearest server save you will regret it =) </description> <config name="cleanhouses_conf"><![CDATA[ config = { days = 14, log = true, file = getDataDir() .. "/logs/cleanhouses.txt" } ns_query =[[SELECT houses.owner,houses.id,players.name FROM houses LEFT JOIN players ON players.id=houses.owner WHERE players.lastlogin < (UNIX_TIMESTAMP() - ]] ..config.days.. [[*24*60*60) AND players.world_id =]] .. getConfigValue("worldId") ]]></config> <globalevent name="cleanhouses" type="start" event="buffer"><![CDATA[ domodlib('cleanhouses_conf') local house = db.getResult(ns_query) local logs = " :: Houses cleaned:\n\n" if house:getID() ~= -1 then repeat logs = logs .. getHouseInfo(house:getDataInt('id')).name ..", owned by " .. house:getDataString('name') .. "\n" setHouseOwner(house:getDataInt('id'), 0) until not house:next() house:free() else logs = logs .. "There were no houses to clean." end if config.log then doWriteLogFile(config.file, logs) end addEvent(doSaveServer, 1000) ]]></globalevent> </mod>
NON-MOD VERSION
globalevents/globalevents.xml
globalevents/scripts/cleanhouses.luaCode:<globalevent name="cleanhouses" type="start" event="script" value="cleanhouses.lua"/>
Code:local config = { days = 14, log = true, file = getDataDir() .. "/logs/cleanhouses.txt" } local ns_query =[[ SELECT houses.owner,houses.id,players.name FROM houses LEFT JOIN players ON players.id=houses.owner WHERE players.lastlogin < (UNIX_TIMESTAMP() - ]] ..config.days.. [[*24*60*60) AND players.world_id =]] .. getConfigValue("worldId") function onStartup(_time) local house = db.getResult(ns_query) local logs = " :: Houses cleaned:\n\n" if house:getID() ~= -1 then repeat logs = logs .. getHouseInfo(house:getDataInt('id')).name ..", owned by " .. house:getDataString('name') .. "\n" setHouseOwner(house:getDataInt('id'), 0) until not house:next() house:free() else logs = logs .. "There were no houses to clean." end if config.log then doWriteLogFile(config.file, logs) end addEvent(doSaveServer, 1000) end
ns_query =[[SELECT houses.owner,houses.id,players.name FROM houses
LEFT JOIN players ON players.id=houses.owner
WHERE players.lastlogin < (UNIX_TIMESTAMP() - ]] ..config.days.. [[*24*60*60)
AND
players.world_id =]] .. getConfigValue("worldId")
domodlib('cleanhouses_conf')
try like "return 1" or "_result = 1" or w/e it gives 'boolean'
try replace;
function onStartup(_time)
function onStartup()
getHouseInfo(house:getDataInt('id')).name
(getHouseInfo(house:getDataInt('id')).name or 'Unnamed House')
logs = logs .. getHouseInfo(house:getDataInt('id')).name ..", owned by " .. house:getDataString('name') .. "\n"
logs = logs .. "House owned by " .. house:getDataString('name') .. "\n"