• 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!
  • If you're using Gesior 2012 or MyAAC, please review this thread for information about a serious security vulnerability and a fix.

Lua teambattle event error Tfs 1.2

abdala ragab

Banned User
Joined
Aug 18, 2018
Messages
306
Solutions
10
Reaction score
272
He's working and he takes me to the waiting room and he takes 1 or 2 people to the fight room and the rest are waiting in the waiting room with this bug in the picturebatel bug.png

Lua:
--first team
    TEAM_BATTLE_A = {
        name = 'Blue',
        color = 88
    }
--second team              
    TEAM_BATTLE_B = {
        name = 'Red',
        color = 94
    }

CONDITION_TEAM_A_MALE = createConditionObject(CONDITION_OUTFIT)
setConditionParam(CONDITION_TEAM_A_MALE, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(CONDITION_TEAM_A_MALE, 0, 131, TEAM_BATTLE_A.color, TEAM_BATTLE_A.color, TEAM_BATTLE_A.color, TEAM_BATTLE_A.color)

CONDITION_TEAM_A_FEMALE = createConditionObject(CONDITION_OUTFIT)
setConditionParam(CONDITION_TEAM_A_FEMALE, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(CONDITION_TEAM_A_FEMALE, 0, 139, TEAM_BATTLE_A.color, TEAM_BATTLE_A.color, TEAM_BATTLE_A.color, TEAM_BATTLE_A.color)

CONDITION_TEAM_B_MALE = createConditionObject(CONDITION_OUTFIT)
setConditionParam(CONDITION_TEAM_B_MALE, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(CONDITION_TEAM_B_MALE, 0, 131, TEAM_BATTLE_B.color, TEAM_BATTLE_B.color, TEAM_BATTLE_B.color, TEAM_BATTLE_B.color)

CONDITION_TEAM_B_FEMALE = createConditionObject(CONDITION_OUTFIT)
setConditionParam(CONDITION_TEAM_B_FEMALE, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(CONDITION_TEAM_B_FEMALE, 0, 139, TEAM_BATTLE_B.color, TEAM_BATTLE_B.color, TEAM_BATTLE_B.color, TEAM_BATTLE_B.color)

function getIndex(array, v)
    for index, value in ipairs(array) do
        if v == value then
            return index
        end
    end
end

function table.clone(t)
    local t_type = type(t)
    local copy
    if t_type == 'table' then
        copy = {}
        for t_key, t_value in pairs(t) do
            copy[t_key] = t_value
        end
    else -- number, string, boolean, etc
        copy = t
    end
    return copy
end

function getTeamLevel(t)
    local v = 0
    for _, player in ipairs(t) do
        v = v + player:getLevel()
    end
    return v
end

-->[[
    --> CONSTANTS
--<]]
    team_battle = {
        --minutes to begin event
            start_time = 1,
        --minutes to finish event
            finish_time = 20,
        --min players required for event
            min_players = 2,
        --max players allowed in event
            max_players = 100,
        --custom channel to broadcast event messages
            channel = 11,
        --delay in minutes to broadcast event stats
            event_info = 3,
        --mininum level of player
            player_level = 500,
        --reward for winner team
            reward = {2638, 10},
        --allow players with same IP in event? [false = allow, true = don't allow]
            ip_check = false,
    -->[[
        --> STORAGES & DATA
    --<]]  
        --event's stat globalstorage
            status = 1000,
        --team a's score globalstorage
            team_a_frags = 1001,
        --team b's score globalstorage
            team_b_frags = 1002,
        --team a players
            team_a = {},
        --team b players
            team_b = {},
        --player's storages
            stor_team = 20000,
    -->[[
        --> STRINGS (do not alter %d or %s)
    --<]]
            msg_call = 'Team Battle will begin in %s! Write "!teambattle" to join the event.',
            msg_join = '[Team Battle] %s has joined the event.',
            msg_cancel = 'Team Battle was canceled for insufficient players.',
            msg_begin = 'Team Battle has started!',
            msg_finish = 'Team Battle will finish in %d minutes...',
            msg_win = 'Team Battle has finished and team %s is the winner with %d frags! [' .. TEAM_BATTLE_A.name .. ': %d - ' .. TEAM_BATTLE_B.name .. ': %d] A tibia coin voucher has been added to the players of winner team.',
            msg_draw = 'Team Battle has ended with a draw! Both teams scored %s frags...',
            msg_kill = '[Team Battle] %s killed %s. [' .. TEAM_BATTLE_A.name .. ': %d - ' .. TEAM_BATTLE_B.name .. ': %d]',
            msg_stat = '[Team Battle] [' .. TEAM_BATTLE_A.name .. ': %d - ' .. TEAM_BATTLE_B.name .. ': %d].',
            msg_defeat = '[Team Battle] %s.',
            msg_bonus = '[Team Battle] You have been awarded with x%d %s.',
    -->[[
        --> POSITIONS (map wait_room with PZ+NO-LOGOUT, arena with PVP+NO-LOGOUT)
    --<]]
            wait_room = {from = Position(119, 599, 7), to = Position(125, 602, 7)},
            arena = {from = Position(83, 510, 7), to = Position(142, 514, 7)},
    -->[[
        --> FUNCTIONS
    --<]]          
            isEnemy = function (player, attacker)
                local enemy = attacker
                if attacker:isCreature() == nil then
                    return true
                end

                if (enemy:getMaster() ~= nil) and (enemy:getMaster():isPlayer() ~= nil) then
                    enemy = enemy:getMaster()
                end
               
                return player:getOutfit().lookBody ~= enemy:getOutfit().lookBody      
            end,

            broadcast = function (msg, class)
                for _, player in ipairs(Game.getPlayers()) do
                    player:sendChannelMessage('', msg, class, team_battle.channel)
                end
            end,

            getData = function (player, data)
                local key = {
                    ['team'] = team_battle.stor_team
                }
                return player:getStorageValue(key[data])
            end,
                                 
            hasDuplicateIP = function (player1)
                for _, player2 in ipairs(Game.getPlayers()) do
                    if player2:getPosition():isInRange(team_battle.wait_room.from, team_battle.wait_room.to) then
                        if player1:getIp() == player2:getIp() then
                            return true
                        elseif player2:getIp() == 0 then
                            player2:remove()
                        end
                    end
                end
                return false
            end,
                       
            getTeamInArena = function (t)
                local count = 0
                for _, player in ipairs(Game.getPlayers()) do
                    if player:getPosition():isInRange(team_battle.arena.from, team_battle.arena.to) and (team_battle.getData(player, 'team') == t) then
                        count = count + 1
                    end
                end
                return count      
            end,
           
            setOutfit = function (player, team)
                local condition = {
                    {[0] = CONDITION_TEAM_A_FEMALE, [1] = CONDITION_TEAM_A_MALE},
                    {[0] = CONDITION_TEAM_B_FEMALE, [1] = CONDITION_TEAM_B_MALE}
                }
                player:addCondition(condition[team][player:getSex()], true)
            end,
           
            setTeams = function ()
                local players = {}          
                for _, player in ipairs(Game.getPlayers()) do
                    if player:getPosition():isInRange(team_battle.wait_room.from, team_battle.wait_room.to) then
                        table.insert(players, player)
                    end
                   end

                   local size = math.floor(#players/2)
                local team_battle_a, team_battle_b = {}, {}
                   for i = 1, 100 do
                    math.randomseed(i)                      
                    team_battle_a, team_battle_b = {}, {}
                    local _players = table.clone(players)
                    repeat
                        local v = _players[math.random(#_players)]
                        table.insert(#team_battle_a < size and team_battle_a or team_battle_b, v)
                        table.remove(_players, getIndex(_players, v))
                    until #_players == 0
                    if math.abs(getTeamLevel(team_battle_a) - getTeamLevel(team_battle_b)) < 100 then
                        break
                    end                      
                   end

                   for _, player in ipairs(team_battle_a) do              
                    team_battle.setOutfit(player, 1)
                    player:setStorageValue(team_battle.stor_team, 1)
                    team_battle.register(player)
                    team_battle.team_a[player:getName()] = {}
                   end
                   for _, player in ipairs(team_battle_b) do              
                    team_battle.setOutfit(player, 2)
                    player:setStorageValue(team_battle.stor_team, 2)
                    team_battle.register(player)
                    team_battle.team_b[player:getName()] = {}
                   end
            end,
           
            teleport = function (player, from, to)
                player:teleportTo(Position(math.random(from.x, to.x), math.random(from.y, to.y), from.z))
            end,
                                             
            heal = function (player)
                player:addHealth(player:getMaxHealth())
                player:addMana(player:getMaxMana())
                local condition = 1
                player:removeCondition(condition)
                for n = 1, 27 do
                    condition = condition * 2
                    if condition ~= 64 then
                        player:removeCondition(condition)
                    end
                end
            end,
           
            onEnd = function (player)
                team_battle.heal(player)
                player:removeCondition(CONDITION_OUTFIT)
                team_battle.unregister(player)
                player:teleportTo(player:getTown():getTemplePosition())
            end,
                                   
            sendLongMessage = function (array, class, init)
                local strings, i, position, added = {""}, 1, 1, false
                for index = 1, #array do
                    if(added) then
                        if(i > (position * 10)) then
                            strings[position] = strings[position] .. ","
                            position = position + 1
                            strings[position] = ""
                        else
                            strings[position] = i == 1 and "" or strings[position] .. ", "
                        end
                    end
                    strings[position] = strings[position] .. array[index]
                    i = i + 1
                    added = true
                end
                for i, str in ipairs(strings) do
                    if(str:sub(str:len()) ~= ",") then
                        str = str .. "."
                    end
                    sendChannelMessage(team_battle.channel, class, (init and i == 1) and (init .. str) or str)
                end
            end,
                           
            info_event = function ()
                if getGlobalStorageValue(team_battle.status) == 1 then
                    sendChannelMessage(team_battle.channel, 8, team_battle.msg_stat:format(getGlobalStorageValue(team_battle.team_a_frags), getGlobalStorageValue(team_battle.team_b_frags)))
                    addEvent(team_battle.info_event, team_battle.event_info*60*1000)
                end
            end,

            getTeamPlayers = function (t)
                local list = {}
                for _, player in ipairs(Game.getPlayers()) do
                    if team_battle.getData(player, 'team') == t then
                        table.insert(list, player:getName())
                    end
                end
                return list
            end,
                       
            register = function (player)
                player:registerEvent('teambattle_stats')
                player:registerEvent('teambattle_death')
            end,
           
            unregister = function (player)
                player:unregisterEvent('teambattle_stats')
                player:unregisterEvent('teambattle_death')
                player:setStorageValue(team_battle.stor_team, -1)
            end,
                           
            cancel = function ()
                setGlobalStorageValue(team_battle.status, -1)
                for _, player in ipairs(Game.getPlayers()) do
                    if player:getPosition():isInRange(team_battle.wait_room.from, team_battle.wait_room.to) then
                        player:teleportTo(player:getTown():getTemplePosition())
                    end
                end    
            end,
           
            finish = function ()
                if getGlobalStorageValue(team_battle.status) == 1 then
                    if getGlobalStorageValue(team_battle.team_a_frags) > getGlobalStorageValue(team_battle.team_b_frags) then
                        sendChannelMessage(team_battle.channel, 14, team_battle.msg_win:format(TEAM_BATTLE_A.name, getGlobalStorageValue(team_battle.team_a_frags), getGlobalStorageValue(team_battle.team_a_frags), getGlobalStorageValue(team_battle.team_b_frags)))
                        for k, v in pairs(team_battle.team_a) do
                            local player = Player(k)
                            if player ~= nil then
                                player:addItem(team_battle.reward[1], team_battle.reward[2])
                                player:sendChannelMessage('', team_battle.msg_bonus:format(team_battle.reward[2],ItemType(team_battle.reward[1]):getName()), 14, team_battle.channel)
                                team_battle.team_a[k] = nil
                            else
                                team_battle.team_a[k] = {team_battle.reward[1], team_battle.reward[2]}
                            end
                        end
                    elseif getGlobalStorageValue(team_battle.team_b_frags) > getGlobalStorageValue(team_battle.team_a_frags) then
                        sendChannelMessage(team_battle.channel, 14, team_battle.msg_win:format(TEAM_BATTLE_B.name, getGlobalStorageValue(team_battle.team_b_frags), getGlobalStorageValue(team_battle.team_a_frags), getGlobalStorageValue(team_battle.team_b_frags)))
                        for k, v in pairs(team_battle.team_b) do
                            local player = Player(k)
                            if player ~= nil then
                                player:addItem(team_battle.reward[1], team_battle.reward[2])
                                player:sendChannelMessage('', team_battle.msg_bonus:format(team_battle.reward[2],ItemType(team_battle.reward[1]):getName()), 14, team_battle.channel)
                                team_battle.team_b[k] = nil
                            else
                                team_battle.team_b[k] = {team_battle.reward[1], team_battle.reward[2]}
                            end
                        end
                    elseif getGlobalStorageValue(team_battle.team_a_frags) == getGlobalStorageValue(team_battle.team_b_frags) then
                        sendChannelMessage(team_battle.channel, 14, team_battle.msg_draw:format(getGlobalStorageValue(team_battle.team_a_frags)))
                    end
                    setGlobalStorageValue(team_battle.status, -1)
                    setGlobalStorageValue(team_battle.team_a_frags, -1)
                    setGlobalStorageValue(team_battle.team_b_frags, -1)          
                    for _, player in ipairs(Game.getPlayers()) do
                        if team_battle.getData(player, 'team') > 0 then
                            team_battle.onEnd(player)
                        end
                    end                    
                end
            end,
           
            start = function ()
                if getGlobalStorageValue(team_battle.status) == 0 then
                    local count = 0
                    for i, player in ipairs(Game.getPlayers()) do
                        if player:getPosition():isInRange(team_battle.wait_room.from, team_battle.wait_room.to) then
                            count = count + 1
                        end
                    end
                    if count < team_battle.min_players then
                        team_battle.cancel()
                        return broadcastMessage(team_battle.msg_cancel, MESSAGE_EVENT_ADVANCE)
                    end
                    team_battle.team_a = {}
                    team_battle.team_b = {}
                    team_battle.setTeams()
                    sendChannelMessage(team_battle.channel, 14, team_battle.msg_begin)
                    team_battle.sendLongMessage(team_battle.getTeamPlayers(1), 8, '[Team ' .. TEAM_BATTLE_A.name .. ' Players] ')
                    team_battle.sendLongMessage(team_battle.getTeamPlayers(2), 8, '[Team ' .. TEAM_BATTLE_B.name .. ' Players] ')
                    setGlobalStorageValue(team_battle.status, 1)
                    setGlobalStorageValue(team_battle.team_a_frags, 0)
                    setGlobalStorageValue(team_battle.team_b_frags, 0)
                    broadcastMessage(team_battle.msg_begin, MESSAGE_EVENT_ADVANCE)
                    addEvent(team_battle.info_event, team_battle.event_info*60*1000)
                    for _, player in ipairs(Game.getPlayers()) do
                        if team_battle.getData(player, 'team') > 0 then
                            player:openChannel(team_battle.channel)
                            team_battle.teleport(player, team_battle.arena.from, team_battle.arena.to)
                            player:say('Go!', TALKTYPE_MONSTER_YELL)
                        end
                    end
                    addEvent(team_battle.finish, team_battle.finish_time*60*1000)
                    addEvent(sendChannelMessage, (team_battle.finish_time-2)*60*1000, team_battle.channel, 14, team_battle.msg_finish:format(2))
                end
            end,
        }

function Position:isInRange(fromPosition, toPosition)
    return (self.x >= fromPosition.x and self.y >= fromPosition.y and self.z >= fromPosition.z
        and self.x <= toPosition.x and self.y <= toPosition.y and self.z <= toPosition.z)
end
 
Top