• 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!

Ingame war system tfs 1.2

Axelor

Member
Joined
Sep 2, 2010
Messages
505
Reaction score
9
Anyone know how to make this tfs 1.1 war system work on tfs 1.2?

Warabsoluta.lua (talkactions)
PHP:
[LIST=1]
function onSay(cid, words, param)
 
        local player = Player(cid)
        local guild = player:getGuild()
        if(guild == nil) then
                player:sendCancelMessage("You need to be in a guild in order to execute this talkaction.")
                return false
        end
 
        local guild = getPlayerGuildId(cid)
        if not guild or (player:getGuildLevel() < GUILDLEVEL_LEADER) then
                player:sendCancelMessage("You cannot execute this talkaction.")
                return false
        end
 
        local t = string.split(param, ",")
        if(not t[2]) then      
                player:sendChannelMessage("", "Not enough param(s).", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                return false
        end
 
        local enemy = getGuildId(t[2])
        if(not enemy) then
                player:sendChannelMessage("", "Guild \"" .. t[2] .. "\" does not exists.", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                return false
        end
 
        if(enemy == guild) then
                player:sendChannelMessage("", "You cannot perform war action on your own guild.", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                return false
        end
 
        local enemyName, tmp = "", db.storeQuery("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy)
        if tmp ~= false then
                enemyName = result.getDataString(tmp, "name")
                result.free(tmp)
        end
 
        if(isInArray({"accept", "reject", "cancel"}, t[1])) then
                local query = "`guild1` = " .. enemy .. " AND `guild2` = " .. guild
                if(t[1] == "cancel") then
                        query = "`guild1` = " .. guild .. " AND `guild2` = " .. enemy
                end
 
                tmp = db.storeQuery("SELECT `id`, `started`, `ended`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0")
                if(tmp == false) then
                        player:sendChannelMessage("", "Currently there's no pending invitation for a war with " .. enemyName .. ".", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                        return false
                end
 
                if(t[1] == "accept") then
                        local _tmp = db.storeQuery("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
                        local state = result.getDataInt(_tmp, "balance") < result.getDataInt(tmp, "payment")
 
                        result.free(_tmp)
                        if(state) then
                                player:sendChannelMessage("", "Your guild balance is too low to accept this invitation.", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                                return false
                        end
 
                        db.query("UPDATE `guilds` SET `balance` = `balance` - " .. result.getDataInt(tmp, "payment") .. " WHERE `id` = " .. guild)
                end
 
                query = "UPDATE `guild_wars` SET "
                local msg = "accepted " .. enemyName .. " invitation to war."
                if(t[1] == "reject") then
                        query = query .. "`ended` = " .. os.time() .. ", `status` = 2"
                        msg = "rejected " .. enemyName .. " invitation to war."
                elseif(t[1] == "cancel") then
                        query = query .. "`ended` = " .. os.time() .. ", `status` = 3"
                        msg = "canceled invitation to a war with " .. enemyName .. "."
                else
                        query = query .. "`started` = " .. os.time() .. ", `ended` = " .. (result.getDataInt(tmp, "ended") > 0 and (os.time() + ((result.getDataInt(tmp, "started") - result.getDataInt(tmp, "ended")) / 86400)) or 0) .. ", `status` = 1"
                end
 
                query = query .. " WHERE `id` = " .. result.getDataInt(tmp, "id")
                result.free(tmp)
                db.query(query)
                broadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
                return false
        end
 
        if(t[1] == "invite") then
                local str = ""
                tmp = db.storeQuery("SELECT `guild1`, `status` FROM `guild_wars` WHERE `guild1` IN (" .. guild .. "," .. enemy .. ") AND `guild2` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)")
        if(tmp ~= false) then
                      
                        if(result.getDataInt(tmp, "status") == 0) then
                                if(result.getDataInt(tmp, "guild1") == 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
 
                        result.free(tmp)
                end
 
                if(str ~= "") then
                        player:sendChannelMessage("", str, TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                        return false
                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.floor(payment)+1000
                        tmp = db.storeQuery("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
 
                        local state = result.getDataInt(tmp, "balance") < payment
                        result.free(tmp)
                        if(state) then
                                player:sendChannelMessage("", "Your guild balance is too low for such payment.", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                                return false
                        end
 
                        db.query("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.query("INSERT INTO `guild_wars` (`guild1`, `guild2`, `started`, `ended`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");")
                broadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
                return false
        end
 
        if(not isInArray({"end", "finish"}, t[1])) then
                return false
        end
 
        local status = (t[1] == "end" and 1 or 4)
        tmp = db.storeQuery("SELECT `id` FROM `guild_wars` WHERE `guild1` = " .. guild .. " AND `guild2` = " .. enemy .. " AND `status` = " .. status)
        if(tmp ~= false) then
                local query = "UPDATE `guild_wars` SET `ended` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. result.getDataInt(tmp, "id")
                result.free(tmp)
 
                db.query(query)
                broadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
                return false
        end
 
        if(status == 4) then
                player:sendChannelMessage("", "Currently there's no pending war truce from " .. enemyName .. ".", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                return false
        end
 
        tmp = db.storeQuery("SELECT `id`, `ended` FROM `guild_wars` WHERE `guild1` = " .. enemy .. " AND `guild2` = " .. guild .. " AND `status` = 1")
        if(tmp ~= false) then
                if(result.getDataInt(tmp, "ended") > 0) then
                        result.free(tmp)
                        player:sendChannelMessage("", "You cannot request ending for war with " .. enemyName .. ".", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                        return false
                end
 
                local query = "UPDATE `guild_wars` SET `status` = 4, `ended` = " .. os.time() .. " WHERE `id` = " .. result.getDataInt(tmp, "id")
                result.free(tmp)
 
                db.query(query)
                broadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
                return false
        end
      
        player:sendChannelMessage("", "Currently there's no active war with " .. enemyName .. ".", TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
        return false
end
[/LIST]
and

warbalance.lua (talkactions)
PHP:
[LIST=1]
local function isValidMoney(value)
        if(value == nil) then
                return false
        end
        return (value > 0 and value <= 99999999999999)
end
 
function onSay(cid, words, param)
 
        local player = Player(cid)
        local guild = player:getGuild():getId()
        if(guild == nil) then
                return true
        end
 
        local t = string.split(param, ' ', 1)
      
        if(player:getGuildLevel() == GUILDLEVEL_LEADER and isInArray({'pick'}, t[1])) then
                if(t[1] == 'pick') then
                        local money = {tonumber(t[2])}
                        if(not isValidMoney(money[1])) then
                                player:sendChannelMessage('', 'Invalid amount of money specified.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                                return false
                        end
 
                        local resultId = db.storeQuery("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
                        if resultId == false then
                                return false
                        end
                      
                        money[2] = result.getDataInt(resultId, "balance")
                        result.free(resultId)
 
                        if(money[1] > money[2]) then
                                player:sendChannelMessage('', 'The balance is too low for such amount.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                                return false
                        end
 
                        if(not db.query('UPDATE `guilds` SET `balance` = `balance` - ' .. money[1] .. ' WHERE `id` = ' .. guild .. ' LIMIT 1;')) then
                                return false
                        end
 
                        doPlayerAddMoney(cid, money[1])
                        player:sendChannelMessage('', 'You have just picked ' .. money[1] .. ' money from your guild balance.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                else
                        player:sendChannelMessage('', 'Invalid sub-command.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                end
        elseif(t[1] == 'donate') then
                local money = tonumber(t[2])
                if(not isValidMoney(money)) then
                        player:sendChannelMessage('', 'Invalid amount of money specified.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                        return true
                end
 
                if(getPlayerMoney(cid) < money) then
                        player:sendChannelMessage('', 'You don\'t have enough money.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                        return true
                end
 
                if(not doPlayerRemoveMoney(cid, money)) then
                        return false
                end
 
                db.query('UPDATE `guilds` SET `balance` = `balance` + ' .. money .. ' WHERE `id` = ' .. guild .. ' LIMIT 1;')
                player:sendChannelMessage('', 'You have transfered ' .. money .. ' money to your guild balance.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
        else
                local resultId = db.storeQuery('SELECT `name`, `balance` FROM `guilds` WHERE `id` = ' .. guild)
                if resultId == false then
                        return false
                end
                player:sendChannelMessage('', 'Current balance of guild ' .. result.getDataString(resultId, "name") .. ' is: ' .. result.getDataInt(resultId, "balance") .. ' bronze coins.', TALKTYPE_CHANNEL_R1, CHANNEL_GUILD)
                result.free(resultId)
        end
end
[/LIST]
I used this for tfs 1.2 and it gave me this error:

PHP:
Lua Script Error: [TalkAction Interface] data/talkactions/scripts/warabsolute.lua:onSay data/talkactions/scripts/warabsolute.lua:11: attempt to compare number with nil stack traceback:         [C]: in function 'lt' data/talkactions/scripts/warabsolute.lua:11: in function <data/talkactions/scripts/warabsolute.lua:1> Lua Script Error: [TalkAction Interface] data/talkactions/scripts/warabsolute.lua:onSay data/talkactions/scripts/warabsolute.lua:11: attempt to compare number with nil stack traceback: [C]: in function 'lt'         data/talkactions/scripts/warabsolute.lua:11: in function <data/talkactions/scripts/warabsolute.lua:1>
 
Im guessing you are using Gesior 2012 since znote seems to use znote_(in this case guilds) tables, if thats the case everything is handeld via the website, just add this: [GESIOR2012] Wars on WWW [TFS 1.0 only] - beta version

But regarding the script here is the problem;
LUA:
if not guild or (player:getGuildLevel() < GUILDLEVEL_LEADER) then

One of them are nil = does not exist.
My guess if GUILDLEVEL_LEADER, you are then trying to compare that to Player:getGuildLevel() that returns an integer.
 
Back
Top