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

TFS 1.X+ war

alcapone

Member
Joined
Jan 13, 2021
Messages
246
Reaction score
19
Lua:
 local minPlayersOnline = 1
local minLevel = 100

local function hasMinimumMembersInGuild(guild)
    local membersOnline = guild:getMembersOnline()
    local total = 0
    for _, member in ipairs(membersOnline) do
        if member:getLevel() >= minLevel then
            total = total + 1
        end
    end

    if total >= minPlayersOnline then
        return true
    end

    return false
end
local war = TalkAction("!war")

function war.onSay(player, words, param)
 
 
 
    local guild = player:getGuild()
    if not guild then
        player:sendCancelMessage("Voce precisa estar em uma Guild para usar esse comando.")
        return false
    end

    if player:getGuildLevel() ~= 3 then
        player:sendCancelMessage("Voce precisa ser leader de uma Guild para usar esse comando.")
        return false
    end

    local p = param:split(',')
    local action, targetGuildName = p[1], p[2]
    if not action or not targetGuildName then
        player:popupFYI('Utilize o comando corretamente:' .. '\n\n' .. '\n\n AVISO\n\n O NOME DA GUILD DEVER ESTÁ IGUAL AO SITE \n\nPara invitar warmode contra a guild Undead por 30 frags:\n' .. '--> !war invite,Undead,30' .. '\n\n' .. 'Para aceitar o pedido de warmode contra a guild Undead:\n' .. '--> !war accept,Undead' .. '\n\n' .. 'Para rejeitar o pedido de warmode da guild Undead:\n' .. '--> !war reject,Undead' .. '\n\n' .. 'Para cancelar o pedido de warmode da guild Undead:\n' .. '--> !war cancel,Undead' .. '\n\n' .. 'Para terminar a warmode contra a guild Undead:\n' .. '--> !war end,Undead')
        return true
    end

    local resultName = db.storeQuery(string.format('SELECT `id` FROM `guilds` WHERE `name` = %s', db.escapeString(targetGuildName)))
    if not resultName then
        player:sendCancelMessage(string.format("A guild %s nao existe.", targetGuildName))
        return false
    end

    local targetGuildId = result.getNumber(resultName, "id")
    result.free(resultName)

    local guildId, guildName = guild:getId(), guild:getName()
    if action:lower() == "invite" then
        if not hasMinimumMembersInGuild(guild) then
            player:sendTextMessage(MESSAGE_INFO_DESCR, string.format('Voce precisa ter no mínimo %d player%s online na sua Guild que sejam maior que o level %d para usar esse comando.', minPlayersOnline, minPlayersOnline ~= 1 and 's', minLevel))
            return false
        end

        if #p ~= 3 then
            player:sendTextMessage(MESSAGE_INFO_DESCR, 'Por favor utilize o comando corretamente:\n!war invite, nome_da_guild_inimiga, frags\n\nPor exemplo:\n!war invite,Blackout,100')
            return false
        end

        local frags = p[3]
        if targetGuildName:lower() == guildName:lower() or guildId == targetGuildId then
            player:sendTextMessage(MESSAGE_INFO_DESCR, "Voce nao pode invitar a sua propria guild para warmode.")
            return false
        end

        local resultInvite = db.storeQuery(string.format("SELECT `id` FROM `guild_wars` WHERE (((guild1 = %d AND guild2 = %d) OR (guild1 = %d AND guild2 = %d)) AND (status = 0 OR status = 1))", guildId, targetGuildId, targetGuildId, guildId))
        if resultInvite then
            player:sendCancelMessage("Voce ja enviou um convite de warmode para essa guild.")
            result.free(resultInvite)
            return false
        end
      
        local fragsLimit = tonumber(frags)
        if not fragsLimit then
            player:sendCancelMessage("Por favor utilize so numeros nos frags.")
            return false
        end

        if fragsLimit < 20 or fragsLimit > 999 then
            player:sendCancelMessage("A quantidade minima eh de 20 frags e 999 a maxima.")
            return false
        end
      
        db.query(string.format('INSERT INTO `guild_wars`(`guild1`, `guild2`, `name1`, `name2`, `status`, `started`, `ended`, `fraglimit`) VALUES (%d, %d, %s, %s, %d, %d, %d, %d)', guildId, targetGuildId, db.escapeString(guildName), db.escapeString(targetGuildName), 0, 0, 0, fragsLimit))
        Game.broadcastMessage(string.format('[WARMODE] %s invitou a guild %s para warmode de %d frags!', guild:getName(), targetGuildName, fragsLimit), MESSAGE_EVENT_ADVANCE)
    elseif action:lower() == "accept" then
        if not hasMinimumMembersInGuild(guild) then
            player:sendTextMessage(MESSAGE_INFO_DESCR, string.format('Voce precisa ter no minimo %d player%s online na sua Guild que sejam maior que o level %d para usar esse comando.', minPlayersOnline, minPlayersOnline ~= 1 and 's', minLevel))
            return false
        end

        local acceptResult = db.storeQuery(string.format("SELECT `id`, `guild1`, `guild2` FROM `guild_wars` WHERE (`status` = 0 AND (name1 = %s AND name2 = %s) OR (name2 = %s AND name1 = %s))", db.escapeString(targetGuildName), db.escapeString(guildName), db.escapeString(guildName), db.escapeString(targetGuildName)))
        if not acceptResult then
            player:sendCancelMessage('Nao tem nenhum convite pendente de warmode contra essa guild.')
            return false
        end
      
        local invitationId = result.getNumber(acceptResult, "id")
        local guildInvited = result.getNumber(acceptResult, "guild1")
        local guildReceived = result.getNumber(acceptResult, "guild2")
        result.free(acceptResult)
        if guildInvited == guildId then
            player:sendCancelMessage('Voce nao pode aceitar uma Warmode que foi voce que invitou.')
            return false
        end

        db.query(string.format('UPDATE `guild_wars` SET `status` = 1, `started` = %d WHERE `id` = %d', os.time(), invitationId))
        Game.broadcastMessage(string.format('[WARMODE] A guild %s aceitou o pedido de warmode da guild %s.', guildName, targetGuildName), MESSAGE_EVENT_ADVANCE)
    elseif action:lower() == "reject" then   
        if not hasMinimumMembersInGuild(guild) then
            player:sendTextMessage(MESSAGE_INFO_DESCR, string.format('Voce precisa ter no minimo %d player%s online na sua Guild que sejam maior que o level %d para usar esse comando.', minPlayersOnline, minPlayersOnline ~= 1 and 's', minLevel))
            return false
        end

        local rejectId = db.storeQuery(string.format("SELECT `id`, `guild1`, `guild2` FROM `guild_wars` WHERE (`status` = 0 AND (name1 = %s AND name2 = %s) OR (name2 = %s AND name1 = %s))", db.escapeString(targetGuildName), db.escapeString(guildName), db.escapeString(guildName), db.escapeString(targetGuildName)))
        if not rejectId then
            player:sendCancelMessage('Nao tem nenhum convite pendente de warmode contra essa guild.')
            return false
        end

        local invitationId = result.getNumber(rejectId, "id")
        local guildInvited = result.getNumber(rejectId, "guild2")
        result.free(rejectId)
        if guildInvited == guildId then
            player:sendCancelMessage('Voce nao pode rejeitar uma Warmode que foi voce que invitou.')
            return false
        end
      
        db.query(string.format('UPDATE `guild_wars` SET `status` = 2 WHERE `id` = %d', invitationId))
        Game.broadcastMessage(string.format('A guild %s rejeitou o pedido de warmode da guild %s.', guildName, targetGuildName), MESSAGE_EVENT_ADVANCE)
    elseif action:lower() == "end" then       
        local endResult = db.storeQuery(string.format("SELECT `id`, `guild1`, `guild2` FROM `guild_wars` WHERE (`status` = 1 AND (name1 = %s AND name2 = %s) OR (name2 = %s AND name1 = %s))", db.escapeString(targetGuildName), db.escapeString(guildName), db.escapeString(guildName), db.escapeString(targetGuildName)))
        if not endResult then
            player:sendCancelMessage('Atualmente a sua Guild nao esta em nenhuma warmode ativa com essa guild.')
            return false
        end

        local warId = result.getNumber(endResult, "id")   
        local guildInvited = result.getNumber(endResult, "guild1")
        local guildReceived = result.getNumber(endResult, "guild2")
        result.free(endResult)

        db.query(string.format('UPDATE `guild_wars` SET `status` = 4, `ended` = %d WHERE `id` = %d', os.time(), warId))
        Game.broadcastMessage(string.format('A guild %s encerrou a warmode contra a guild %s.', guildName, targetGuildName), MESSAGE_EVENT_ADVANCE)
    elseif action:lower() == "cancel" then   
        if not hasMinimumMembersInGuild(guild) then
            player:sendTextMessage(MESSAGE_INFO_DESCR, string.format('Voce precisa ter no minimo %d player%s online na sua Guild que sejam maior que o level %d para usar esse comando.', minPlayersOnline, minPlayersOnline ~= 1 and 's', minLevel))
            return false
        end

        local resultCancel = db.storeQuery(string.format("SELECT `id`, `guild1` FROM `guild_wars` WHERE (`status` = 0 AND (name1 = %s AND name2 = %s) OR (name2 = %s AND name1 = %s))", db.escapeString(targetGuildName), db.escapeString(guildName), db.escapeString(guildName), db.escapeString(targetGuildName)))
        if not resultCancel then
            player:sendCancelMessage('Nao tem nenhum convite pendente de warmode contra essa guild.')
            return false
        end

        local invitationId = result.getNumber(resultCancel, "id")
        local guildInvited = result.getNumber(resultCancel, "guild1")
        result.free(resultCancel)
        if guildInvited ~= guildId then
            player:sendCancelMessage('Voce nao pode cancelar uma War que nao foi voce que invitou.')
            return false
        end
      
        db.query(string.format('UPDATE `guild_wars` SET `status` = 3 WHERE `id` = %d', invitationId))
        Game.broadcastMessage(string.format('A guild %s cancelou o pedido de warmode a guild %s.', guildName, targetGuildName), MESSAGE_EVENT_ADVANCE)
    end
  
    return false
end

war:separator(" ")
war:register()


1650172000646.png

When the player accepts a war for the same guild, he will create a new one plus the update active in the old one.
 
Thats how it should work
On previous war you can see status = 4 and also a timestamp on ended colum which means war was ended (probably status 4 means forced ending), so its nothing wrong and basically it doesnt get removed to make proper information about guild wars on site
 
Last edited:
Thats how it should work
On previous war you can see status = 4 and also a timestamp on ended colum which means war was ended (probably status 4 means forced ending), so its nothing wrong and basically it doesnt get removed to make proper information about guild wars on site
in this case, the second one should be with status 1 because it is a new war, but what it does is change the status of the first one to 1 and the second one, which is the new one, is 0
 
in this case, the second one should be with status 1 because it is a new war, but what it does is change the status of the first one to 1 and the second one, which is the new one, is 0
I get it now. Weird tho, i dont see anything wrong (on Accept)
 
Last edited:
Back
Top