• 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!
  • New resources must be posted under Resources tab. A discussion thread will be created automatically, you can't open threads manually anymore.

TalkAction System Anti-Bot v5.0

Maniucza

~Lua~ Noob
Joined
Aug 2, 2009
Messages
86
Reaction score
6
Location
Poland / Rzeszów
Changes:
- AFK System Integration
- Counterfeiting Scheme for the MOD
- Addition Locks attack, if someone is afk
- You can not report people from the guild
- AFK can only be enabled if you do not have BATTLE
- Being AFK you can not log out
- Added is a fragment of the acc - maker
- Acc information on the latest news and new versions of the script
- At the request of the lock added LOC0SO Players Checking if the zone is in nologout

You OTS/MODS/antibot.xml
Lua:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="AntiBot System" version="5.0" author="Karpio" contact="http://tibia.net.pl/members/karpio.html" enabled="yes">
	<config name="check_system"><![CDATA[
		config = {
			code = 999,
			ptime = 998,
			ttime = 997,
			nick = false,
			afk = true,
			afks = 38417,
			lvl = 60, 
			nologout = true,
			guild = true,
			distance = 10
			}
		afk = {
			time = 3, -- Seconds
			say_events = {}
			}

		function randomCode()
			return math.random(1000, 9999)
		end
		
		function SayText(cid)
			if isPlayer(cid) == TRUE then
				 if afk.say_events[getPlayerGUID(cid)] ~= nil then
					 if isPlayer(cid) == TRUE then
						 doSendAnimatedText(getPlayerPosition(cid),"AFK", math.random(01,255))
					 end
					 afk.say_events[getPlayerGUID(cid)] = addEvent(SayText, afk.time * 1000 / 2, cid)       
				 end                                                       
			end
			return TRUE
		end

		function czas(timeDiff)
		local dateFormat = { 
			{"day", timeDiff / 60 / 60 / 24},
			{"hour", timeDiff / 60 / 60 % 24},
			{"minute", timeDiff / 60 % 60},
			{"second", timeDiff % 60}
		}

		local out = {}
		for k, t in ipairs(dateFormat) do
			local v = math.floor(t[2])
			if(v > 60) then
				table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
			elseif(v > 0) then
				table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or '') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
			end
		end    
		return table.concat(out)
	end  
	
	function check(cid, target)
		local code = randomCode()
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You check "..getCreatureName(target)..".")
		doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "[AntiBot]: "..(config.nick == true and getCreatureName(cid) or "Someone").." check you. You must write /check "..code.." if you don't want be banished. You have only 15 minutes.")
		setPlayerStorageValue(target, config.code, code)
		setPlayerStorageValue(target, config.ttime, os.time() + (3 * 60 * 60))
		setPlayerStorageValue(cid, config.ptime, os.time() + (6 * 60 * 60))
		addEvent(function()
			if(isPlayer(target) == false) then
				return false
			elseif(getPlayerStorageValue(target, config.code) == 0) then
				return false
			end
			doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "[AntiBot]: You have only 1 minute. Please write /check "..getPlayerStorageValue(target, config.code)..".")
			addEvent(function()
				if(isPlayer(target) == false) then
					return false
				elseif(getPlayerStorageValue(target, config.code) == 0) then
					return false
				end
				doAddAccountBanishment(getPlayerAccountId(target), target, os.time() + 48 * 3600, 12, 2, 'Banished by AntiBot System by Karpio', 0)
				doRemoveCreature(target)
			end, 60 * 1000, {target = target, config = config})
		end, 14 * 60 * 1000, {target = target, config = config, cid = cid})
	end
	
	function antibotGuildChange(cid, type)
		if(type == "on") then
			db.executeQuery("UPDATE guilds SET checkbot=1 WHERE id="..getPlayerGuildId(cid).." LIMIT 1;")
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Now members of your guild can't check players from them.")
		elseif(type == "off") then			
			db.executeQuery("UPDATE guilds SET checkbot=0 WHERE id="..getPlayerGuildId(cid).." LIMIT 1;")
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Now members of your guild can check players from them.")
		end
		return true
	end
	
	function antibotGuildCheck(cid, target)
		if(getPlayerGuildId(cid) == 0) then
			return true
		elseif(getPlayerGuildId(target) == 0) then
			return true
		elseif(getPlayerGuildId(target) ~= getPlayerGuildId(cid)) then
			return true
		end
		local result = db.getResult("SELECT * FROM guilds WHERE id="..getPlayerGuildId(cid).." LIMIT 1;")
		if(result:getDataInt("checkbot") == 1) then
			return false
		else
			return true
		end
	end
	
	]]></config>
	<talkaction words="/check" event="buffer"><![CDATA[
		domodlib('check_system')
			local t = string.explode(param, ",")
			if(param == "") then
				return doPlayerPopupFYI(cid, "Welcome in AntiBot Information.\nScript author: Karpio\nScript Version: 1.1\n\nMini tutorial:\n/check nick - if you want check player with name nick\n/check code - if someone check you\n\nYou can check next player "..((getPlayerStorageValue(cid, config.ptime) - os.time()) > 0 and "after "..czas(getPlayerStorageValue(cid, config.ptime) - os.time()) or "now")..".\nYou can be check "..((getPlayerStorageValue(cid, config.ttime) - os.time()) > 0 and "after "..czas(getPlayerStorageValue(cid, config.ttime) - os.time()) or "now")..".")
			elseif(t[1] == "guild") then
				if(config.guild == false) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not use this function.")
				elseif(not t[2]) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Use it /check guild, on/off.")
				elseif(t[2] == "on" and getPlayerGuildLevel(cid) == GUILDLEVEL_LEADER) then
					return antibotGuildChange(cid, "on")
				elseif(t[2] == "off" and getPlayerGuildLevel(cid) == GUILDLEVEL_LEADER) then
					return antibotGuildChange(cid, "off")
				else
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Invalid param or you aren't leader.")
				end
			elseif(isNumber(param) == true) then
				if(getPlayerStorageValue(cid, config.code) < 1) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: If you want check code, you must be checked by other player.")
				elseif(getPlayerStorageValue(cid, config.code) ~= tonumber(param)) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Invalid code.")
				end
				setPlayerStorageValue(cid, config.code, 0)
				doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Code is correct.")
				return true
			else
				if(getPlayerByNameWildcard(param) == nil) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: Target not found.")
				elseif(getPlayerByNameWildcard(param) == tonumber(cid)) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check yourself.")
				elseif(getTileInfo(getCreaturePosition(cid)).protection == true) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check players if you are in protection zone.")
				elseif(isNumber(config.lvl) and getPlayerLevel(cid) < config.lvl) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not use this system if your level is lover that "..config.lvl..".")
				elseif(getTileInfo(getCreaturePosition(getPlayerByNameWildcard(param))).protection == true) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check this players, because "..(getPlayerSex(getPlayerByNameWildcard(param)) == 0 and "she" or "he").." is in protection zone.")
				elseif(config.afk and getPlayerStorageValue(cid, config.afks) > 0) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check players if you are afk.")
				elseif(config.afk and getPlayerStorageValue(getPlayerByNameWildcard(param), config.afks) > 0) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check this players, because "..(getPlayerSex(getPlayerByNameWildcard(param)) == 0 and "she" or "he").." is afk.")
				elseif(getPlayerStorageValue(cid, config.ptime) > os.time()) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You must rest if you want check next player.")
				elseif(getPlayerStorageValue(getPlayerByNameWildcard(param), config.ttime) > os.time()) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check this player.")
				elseif((getTileInfo(getCreaturePosition(cid)).nologout or getTileInfo(getCreaturePosition(getPlayerByNameWildcard(param))).nologout) and config.nologout == true) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check this player.")
				elseif(antibotGuildCheck(cid, getPlayerByNameWildcard(param)) == false and config.guild) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check this player.")
				elseif(getDistanceBetween(getCreaturePosition(cid, getCreaturePosition(getPlayerByNameWildcard(param)) > config.distance or config.distance == 0) then
					return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "[AntiBot]: You can not check this player.")
				end
				check(cid, getPlayerByNameWildcard(param))		
			end
			]]></talkaction>
	<event type="combat" name="AFK_Protection" event="script"><![CDATA[
		domodlib('check_system')
		function onCombat(cid, target)
		if(isPlayer(target) == true) then
			if(getPlayerStorageValue(target, config.afks) == 1) then
				return false
			end
		end
		return true
		end]]></event>
	<event type="login" name="AFK_Login" event="script"><![CDATA[
		domodlib('check_system')
		function onLogin(cid)
		if(getPlayerStorageValue(cid, config.afks) > 0) then
			setPlayerStorageValue(cid, config.afks, 0)
		end
		registerCreatureEvent(cid, "AFK_Protection")
		registerCreatureEvent(cid, "AFK_Login")
		registerCreatureEvent(cid, "AFK_Logout")
		return true
		end]]></event>
	<event type="logout" name="AFK_Logout" event="script"><![CDATA[
		domodlib('check_system')	
		function onLogout(cid)
		if(getPlayerStorageValue(cid, config.afks) == 1) then
			return false
		end
		return true
		end]]></event>
	
	<talkaction words="!afk" event="buffer"><![CDATA[
	domodlib('check_system')
	afkCheck = getPlayerStorageValue(cid, config.afks)
     if (param == "on") then
		if(getCreatureCondition(cid, CONDITION_INFIGHT) == true) then
			return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are infight.")
		end
        if (afkCheck == -1) then
            if (isPlayer(cid) == TRUE) then
                doSendAnimatedText(getPlayerPosition(cid),"AFK", math.random(01,255))
            end
            afk.say_events[getPlayerGUID(cid)] = addEvent(SayText, afk.time * 1000, cid)
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You are now AFK.")
            doCreatureSetNoMove(cid, true)
            setPlayerStorageValue(cid, config.afks, 1)
        else
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are already AFK.")
        end
     elseif (param == "off") then
        stopEvent(afk.say_events[getPlayerGUID(cid)])
        afk.say_events[getPlayerGUID(cid)] = nil
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Welcome Back!")
        doCreatureSetNoMove(cid, false)
        setPlayerStorageValue(cid, config.afks, -1)
	else
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
    end
	]]></talkaction>
	<globalevent name="UpdateDatabase" type="start" event="script"><![CDATA[
		function onStartup()
			local get = db.getResult("SELECT * FROM guilds WHERE checkbot=0 LIMIT 1;")
			if(get:getID() == -1) then
				print(">> Database Updated.")
				db.executeQuery("ALTER TABLE `guilds` ADD `checkbot` INT( 1 ) NOT NULL DEFAULT '0';")
			end
			return true
		end]]></globalevent>
</mod>
 
EDIT: Fixed it.
Great Antibot =)
 
Last edited:
Explain it please I don't want to go through the whole script to get what all of its features are..
 
yes, it's kinda queerish
 
It's that bugged version : )
Code:
[16:21:23.573] [Lua Error]
[16:21:23.573] [string "LuaInterface::loadBuffer"]:53: ')' expected near 'then'

when you use /check command
 
It's that bugged version : )
Code:
[16:21:23.573] [Lua Error]
[16:21:23.573] [string "LuaInterface::loadBuffer"]:53: ')' expected near 'then'

when you use /check command
line 53 put a ')' ;S
 
when it say 'near' means the line before or the line after

You haven't say near ;)

Code:
local out = {}
for k, t in ipairs(dateFormat) do
local v = math.floor(t[2])
if(v > 60) then
table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
elseif(v > 0) then
table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or '') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
end
end 
return table.concat(out)
end 

function check(cid, target)

So where should I add ')' ?
 
duh... not to state the obvious but how is it checking for the bot?

nothing is explained about this script and for all those who aren't amazing scripts cant just look at it and understand it
 
And why is this "anti-bot" ?
You can still bot if you don't use !afk or? :confused:
 
And why is this "anti-bot" ?
You can still bot if you don't use !afk or? :confused:

Yes, you can.

This is just system of checking players which are on hunt (by other players) - if you think that someone is botting you can check him by command /checkbot PlayerNick - if he won't say !antibot CorrectCode in 15 minutes he'll be banished.

How to fix error posted upper ?
 
Back
Top