• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Solved talkactions cooldown

seleo

Active Member
Joined
Jun 6, 2012
Messages
498
Reaction score
33
Location
Egypt
hello
i have a problem with my server
the players can abuse the guild war talk actions to lag the server and crash it
so please can some one tell me how i can add talkactions cooldown for all the talkactions

or can someone edit this talkaction so it have exhaust or cooldown
PHP:
function onSay(cid, words, param, channel)
	local guild = getPlayerGuildId(cid)
	if(not guild or getPlayerGuildLevel(cid) < GUILDLEVEL_LEADER) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot execute this talkaction.")
		return true
	end

	local t = string.explode(param, ",")
	if(not t[2]) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Not enough param(s).")
		return true
	end

	local enemy = getGuildId(t[2])
	if(not enemy) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Guild \"" .. t[2] .. "\" does not exists.")
		return true
	end

	if(enemy == guild) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot perform war action on your own guild.")
		return true
	end

	local enemyName, tmp = "", db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy)
	if(tmp:getID() ~= -1) then
		enemyName = tmp:getDataString("name")
		tmp:free()
	end

	if(isInArray({"accept", "reject", "cancel"}, t[1])) then
		local query = "`guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild
		if(t[1] == "cancel") then
			query = "`guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy
		end

		tmp = db.getResult("SELECT `id`, `begin`, `end`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0")
		if(tmp:getID() == -1) then
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no pending invitation for a war with " .. enemyName .. ".")
			return true
		end

		if(t[1] == "accept") then
			local _tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
			local state = _tmp:getID() < 0 or _tmp:getDataInt("balance") < tmp:getDataInt("payment")

			_tmp:free()
			if(state) then
				doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your guild balance is too low to accept this invitation.")
				return true
			end

			db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. tmp:getDataInt("payment") .. " WHERE `id` = " .. guild)
		end

		query = "UPDATE `guild_wars` SET "
		local msg = "accepted " .. enemyName .. " invitation to war."
		if(t[1] == "reject") then
			query = query .. "`end` = " .. os.time() .. ", `status` = 2"
			msg = "rejected " .. enemyName .. " invitation to war."
		elseif(t[1] == "cancel") then
			query = query .. "`end` = " .. os.time() .. ", `status` = 3"
			msg = "canceled invitation to a war with " .. enemyName .. "."
		else
			query = query .. "`begin` = " .. os.time() .. ", `end` = " .. (tmp:getDataInt("end") > 0 and (os.time() + ((tmp:getDataInt("begin") - tmp:getDataInt("end")) / 86400)) or 0) .. ", `status` = 1"
		end

		query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
		if(t[1] == "accept") then
			doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD)
			doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY)
		end

		tmp:free()
		db.executeQuery(query)
		doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
		return true
	end

	if(t[1] == "invite") then
		local str = ""
		tmp = db.getResult("SELECT `guild_id`, `status` FROM `guild_wars` WHERE `guild_id` IN (" .. guild .. "," .. enemy .. ") AND `enemy_id` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)")
		if(tmp:getID() ~= -1) then
			if(tmp:getDataInt("status") == 0) then
				if(tmp:getDataInt("guild_id") == guild) then
					str = "You have already invited " .. enemyName .. " to war."
				else
					str = enemyName .. " have already invited you to war."
				end
			else
				str = "You are already on a war with " .. enemyName .. "."
			end

			tmp:free()
		end

		if(str ~= "") then
			doPlayerSendChannelMessage(cid, "", str, TALKTYPE_CHANNEL_W, 0)
			return true
		end

		local frags = tonumber(t[3])
		if(frags ~= nil) then
			frags = math.max(10, math.min(1000, frags))
		else
			frags = 100
		end

		local payment = tonumber(t[4])
		if(payment ~= nil) then
			payment = math.max(100000, math.min(1000000000, payment))
			tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)

			local state = tmp:getID() < 0 or tmp:getDataInt("balance") < payment
			tmp:free()
			if(state) then
				doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your guild balance is too low for such payment.")
				return true
			end

			db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. payment .. " WHERE `id` = " .. guild)
		else
			payment = 0
		end

		local begining, ending = os.time(), tonumber(t[5])
		if(ending ~= nil and ending ~= 0) then
			ending = begining + (ending * 86400)
		else
			ending = 0
		end

		db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `enemy_id`, `begin`, `end`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");")
		doBroadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
		return true
	end

	if(not isInArray({"end", "finish"}, t[1])) then
		return false
	end

	local status = (t[1] == "end" and 1 or 4)
	tmp = db.getResult("SELECT `id` FROM `guild_wars` WHERE `guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy .. " AND `status` = " .. status)
	if(tmp:getID() ~= -1) then
		local query = "UPDATE `guild_wars` SET `end` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. tmp:getDataInt("id")
		tmp:free()
		doGuildRemoveEnemy(guild, enemy)
		doGuildRemoveEnemy(enemy, guild)

		db.executeQuery(query)
		doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
		return true
	end

	if(status == 4) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no pending war truce from " .. enemyName .. ".")
		return true
	end

	tmp = db.getResult("SELECT `id`, `end` FROM `guild_wars` WHERE `guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild .. " AND `status` = 1")
	if(tmp:getID() ~= -1) then
		if(tmp:getDataInt("end") > 0) then
			tmp:free()
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot request ending for war with " .. enemyName .. ".")
			return true
		end

		local query = "UPDATE `guild_wars` SET `status` = 4, `end` = " .. os.time() .. " WHERE `id` = " .. tmp:getDataInt("id")
		tmp:free()

		db.executeQuery(query)
		doBroadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
		return true
	end

	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no active war with " .. enemyName .. ".")
	return true
end

sorry about my bad english
 
You can add an exhaust condition like potions have.
LUA:
-- above function onSay(cid, words, param, channel) 
local exhaust = createConditionObject(CONDITION_EXHAUST)
setConditionParam(exhaust, CONDITION_PARAM_TICKS, 2000) -- time in seconds x1000

-- under function onSay(cid, words, param, channel) 
if(hasCondition(cid, CONDITION_EXHAUST)) then
        doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) 
	doPlayerSendCancel(cid, "You are exhausted")
	return true
end

-- where you want people to get the exhaustion
doAddCondition(cid, exhaust)
 
There is another way but used when there is long exhaustion..so when you logout you will be affected by cool down
LUA:
local s = 901 -- storage
local t = 500 -- Time in Second
if exhaustion.check(cid, s) then
  doPlayerSendCancel(cid, "You Are Exhausted")
  return true
end
-------------------Add This to place of exhaustion
exhaustion.set(cid, s, t)
 
You could also add one using storages and os.time() that way the exhaustion wont affect spells and the like.

LUA:
local exhaust = 1000

if os.time() > getPlayerStorageValue(cid, exhaust) then


-----talk action---------

setPlayerStorageValue(cid, exhaust, 10000 + os.time()) --- setting the exhaust ten = one second I believe. ----
else
return
end
 
Last edited:
You could also add one using storages and os.time() that way the exhaustion wont affect spells and the like.

LUA:
local exhaust = 1000

if os.time() > getPlayerStorageValue(cid, exhaust) then


-----talk action---------

setPlayerStorageValue(cid, exhaust, 10000 + os.time()) --- setting the exhaust ten = one second I believe. ----
else
return
end


Exhaustion does that believe it or not =) it's a really cool function look into it.
 
You can set a specific storage for each one? Before spewing some smart ass remark out of your mouth, take into account I don't have time to search for 15 minutes on these forums in the slim chance I'll actually find a thread that has documentation for it, more like sift through 40 help threads that use function. In 0.2 there's no documentation for it. I check the doc's in my TFS, it its not there and there is another extremely easy way I'm going to do it. If by doing that I someway offend you, go cry in a corner somewhere else. Thanks.

Haha dude? I didn't make a smart ass remark I was being serious, but thank you for making yourself look like a fool ya moron xD.
 
The way you conveyed your messaged made it seem exactly that way. But text is text, my bad if you didn't mean it that way then. I'm pretty sure most people would read that as a smart remark though.
 
Back
Top