• 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 Automagically clean unused houses, multi-world support!

nsanee

Member
Senator
Joined
Apr 13, 2008
Messages
669
Reaction score
20
versions

Code:
  v.1.03 - Added 'onlyNonPremium' configurable. (26.04.2010)

	Removed modlib, since the script is run once anyway we don't need it loaded at all times.
	It shouldn't now stop execution when a house is nameless.

  1.02 - now uses only one sql query, removed multiworld configurable since it's not needed anymore (18.03.2010)
  1.01 - added multiworld support, optimized query. (17.03.2010)
  1.0 - initial release (17.02.2010)
This mod will clean houses of inactive players every time your server starts and move their items to their depots.

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

Code:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Cleanhouses" version="1.03" author="nsanee" contact="otland.net" enabled="yes">
    <description>
        v.1.03 - Added 'onlyNonPremium' configurable.
                 Removed modlib, since the script is run once anyway we don't need it loaded at all times.
                 It shouldn't now stop execution when a house is nameless.
				
		v.1.02 - now uses only one sql query, removed multiworld configurable  since it's not needed anymore
        v.1.01 - small fixes, optimized query + multiworld support.
       
		
        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
            onlyNonPremium - if set to 'true', the script will clean only the houses of players who don't have any pacc days left.
			
		other notes:
			DO NOT remove doSaveServer() at the end, otherwise if your server happens to crash before the nearest server save you will regret it =)
    </description>

    <globalevent name="cleanhouses" type="start" event="buffer"><![CDATA[
	
	
        local config = { 
            days = 14,
            log = true,
            file = getDataDir() .. "/logs/cleanhouses.txt",
	    onlyNonPremium = true
        }
		
		
		
        local ns_query =[[ SELECT houses.owner, houses.id as hid, houses.name as house_name ,players.name FROM houses
            LEFT JOIN players ON players.id=houses.owner
            LEFT JOIN accounts ON players.account_id=accounts.id
            WHERE players.lastlogin < (UNIX_TIMESTAMP() - ]] ..config.days.. [[*24*60*60)
            ]] ..(config.onlyNonPremium and ' AND accounts.premdays=0 ' or '')..[[
            AND	players.world_id =]] .. getConfigValue("worldId")
		
        local house = db.getResult(ns_query)
        local logs = " :: Houses cleaned:\n\n"
        if house:getID() ~= -1 then
            repeat
                logs = logs .. house:getDataString('house_name') ..", owned by " .. house:getDataString('name') .. "\n"
                setHouseOwner(house:getDataInt('hid'), 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>
Just save it as cleanhouses.xml in your TFS/mods directory.

NON-MOD VERSION (OUTDATED)

globalevents/globalevents.xml

Code:
<globalevent name="cleanhouses" type="start" event="script" value="cleanhouses.lua"/>
globalevents/scripts/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
 
Last edited:
Very good! :p

Rep++ for you

Tip, Change the time from 14 to 21 or 28 days, because it's not impossible for one or several guys in a server is going for a little trip and be gone for 2 weeks.. but that's up to each and every OT owner to decide how many days a player may keep the house while not playing.
 
Thanks all for comments :)

@pele112 Yes it should work flawlessly on 0.3.6, maybe even 0.3.5.

@Snow - edited my original post with non-mod version.
 
combines with my db cleanup script :D
 
sorry for double post but...
[20/02/2010 12:15:00] [Warning - Event::loadScript] Event onStartup not found (data/globalevents/scripts/cleanhouses.lua)

I'm getting this :(
 
sorry for double post but...
[20/02/2010 12:15:00] [Warning - Event::loadScript] Event onStartup not found (data/globalevents/scripts/cleanhouses.lua)

I'm getting this :(

Right, fixed now :)
 
i'm getting this now :(

[02/03/2010 13:46:41] OTSYS_SQLITE3_PREPARE(): SQLITE ERROR: no such function: UNIX_TIMESTAMP (SELECT "owner" ,"id" FROM "houses" WHERE "owner" IN (SELECT "id" FROM "players" WHERE "lastlogin" < UNIX_TIMESTAMP() - 14*24*60*60))
 
Thanks for comments.

@Snow, try replacing UNIX_TIMESTAMP() with date('now') for sqlite.
 
Back
Top