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

Rank Reset - TFS 1.3

adriez

New Member
Joined
Aug 14, 2011
Messages
73
Reaction score
1
any add my reset in rank too, my reset of storage 378378

local top = 10
local rankcolor = MESSAGE_STATUS_CONSOLE_ORANGE
local errorcolor = MESSAGE_STATUS_CONSOLE_BLUE
local popup = true -- set to false if you want it in local chat
local exhaustvalue = 78692 -- storage to avoid command spam
local exhausttime = 5 -- seconds before you may request rank again
local maxgroup = 1 -- set to 2 to include gms, 3 to include gods

local ranks = {
['level'] = 1,
['lvl'] = 1,
['exp'] = 1,
['xp'] = 1,
['magic'] = 2,
['ml'] = 2,
['bank'] = 3,
['balance'] = 3,
['cash'] = 3,
['money'] = 3,
['gp'] = 3,
['fist'] = 4,
['club'] = 5,
['sword'] = 6,
['axe'] = 7,
['distance'] = 8,
['dist'] = 8,
['shielding'] = 9,
['shield'] = 9,
['fishing'] = 10,
['fish'] = 10,
['frags'] = 11
}

local voc = {
['none'] = 0,
['sorcerer'] = {1, 5},
['ms'] = {1, 5},
['druid'] = {2, 6},
['ed'] = {2, 6},
['paladin'] = {3, 7},
['rp'] = {3, 7},
['knight'] = {4, 8},
['ek'] = {4, 8}
}

local stats = {
-- {"order by this", "show this first"}
[1] = {"experience", "level"},
[2] = {"manaspent", "maglevel"},
[3] = {"balance"},
[4] = {"skill_fist"},
[5] = {"skill_club"},
[6] = {"skill_sword"},
[7] = {"skill_axe"},
[8] = {"skill_dist"},
[9] = {"skill_shielding"},
[10] = {"skill_fishing"}
}

local stats_names = {
[1] = {"exp", "level"},
[2] = {"mana spent", "magic level"},
[3] = {"account balance"},
[4] = {"fist fighting"},
[5] = {"club fighting"},
[6] = {"sword fighting"},
[7] = {"axe fighting"},
[8] = {"distance fighting"},
[9] = {"shielding"},
[10] = {"fishing"},
[11] = {"frags"}
}

local stats_short = {
[1] = {"xp: ", ""},
[2] = {"mana: ", ""},
[3] = {""},
[4] = {""},
[5] = {""},
[6] = {""},
[7] = {""},
[8] = {""},
[9] = {""},
[10] = {""},
[11] = {""}
}

function table.find(table, value)
for i, v in pairs(table) do
if v == value then
return i
end
end
return nil
end

function getHighest(check, values)
local highest = 0
local highestVal = nil
local highestI = nil
for i = 1, #values do
if check[values] > highest then
highest = check[values]
highestVal = values
highestI = i
end
end

return {highest, highestVal, highestI}
end

function getTopFraggers(vocs)
local fraggers = {}
local resultId = db.storeQuery("SELECT `player_id`, `killed_by` FROM `player_deaths` WHERE `is_player` = 1")
if resultId then
repeat
table.insert(fraggers, result.getDataString(resultId, "killed_by"))
until not result.next(resultId)
result.free(resultId)
end

local fraggers_names = {}
for i = 1, #fraggers do
if not table.find(fraggers_names, fraggers) then
table.insert(fraggers_names, fraggers)
end
end

local fraggers_total = {}
for i = 1, #fraggers do
for j = 1, #fraggers_names do
if fraggers_names[j] == fraggers then
if not fraggers_total[fraggers_names[j]] then fraggers_total[fraggers_names[j]] = 0 end
fraggers_total[fraggers_names[j]] = fraggers_total[fraggers_names[j]] + 1
end
end
end

local place = 0
local fraggers_top = {}
repeat
local v = getHighest(fraggers_total, fraggers_names)
if not v[2] then
break
end

if vocs then
local resultId = db.storeQuery("SELECT `vocation` FROM `players` WHERE `name` = '" .. v[2] .. "' LIMIT 1")
if isInArray(vocs, result.getDataInt(resultId, "vocation")) then
place = place + 1
table.insert(fraggers_top, {v[1], v[2]})
end
else
place = place + 1
table.insert(fraggers_top, {v[1], v[2]})
end
table.remove(fraggers_names, v[3])
until (place == top) or (not v[3])

local msg = ""
for i = 1, #fraggers_top do
if fraggers_top[2] then
msg = msg .. "\n[" .. i .. "] [" .. fraggers_top[2] .. "] [" .. fraggers_top[1] .. "]"
else
break
end
end
return msg
end

function onSay(player, words, param)
if player:getStorageValue(exhaustvalue) >= os.time() then
player:sendTextMessage(errorcolor, "Please do not spam.")
return false
end

player:setStorageValue(exhaustvalue, os.time() + exhausttime)

local split = param:split(",")
if #split == 0 then
local ranks2 = {}
for i = 1, #stats_names do
table.insert(ranks2, stats_names[#stats_names])
end
player:popupFYI("Example: " .. words .. " balance, knight(optional)\n\nAvailable ranks:\n" .. table.concat(ranks2, "\n"))
return false
end

for i = 1, #split do
split = split:gsub("^%s*(.-)%s*$", "%1")
end

if ranks[split[1]] then
local msg = "Top players on server, " .. stats_names[ranks[split[1]]][#stats_names[ranks[split[1]]]] .. (voc[split[2]] and (", " .. split[2]) or "") .. ":"

if ranks[split[1]] == 11 then
if popup then
player:popupFYI(msg .. getTopFraggers(voc[split[2]]))
else
player:sendTextMessage(rankcolor, msg .. getTopFraggers(voc[split[2]]))
end
return false
else
local resultId = db.storeQuery("SELECT `name`, `" .. table.concat(stats[ranks[split[1]]], "`, `") .. "` FROM `players` WHERE `group_id` <= " .. maxgroup .. (voc[split[2]] and (" AND `vocation` IN (" .. table.concat(voc[split[2]], ",") .. ")") or "") .. " ORDER BY `" .. stats[ranks[split[1]]][#stats[ranks[split[1]]]] .. "` DESC LIMIT " .. top)
local place = 0
repeat
place = place + 1
msg = msg .. "\n[" .. place .. "] [" .. result.getDataString(resultId, "name") .. "] "

for i = 1, #stats[ranks[split[1]]] do
local s = #stats[ranks[split[1]]] + 1 - i
msg = msg .. "[" .. stats_short[ranks[split[1]]] .. result.getDataInt(resultId, stats[ranks[split[1]]]) .. "]" .. (s > 1 and " " or "")
end
until not result.next(resultId)
result.free(resultId)
if popup then
player:popupFYI(msg)
else
player:sendTextMessage(rankcolor, msg)
end
end
return false
end

player:sendTextMessage(errorcolor, "Incorrect list name. Execute command without parameters to see available lists.")
return false
end
 
any add my reset in rank too, my reset of storage 378378

local top = 10
local rankcolor = MESSAGE_STATUS_CONSOLE_ORANGE
local errorcolor = MESSAGE_STATUS_CONSOLE_BLUE
local popup = true -- set to false if you want it in local chat
local exhaustvalue = 78692 -- storage to avoid command spam
local exhausttime = 5 -- seconds before you may request rank again
local maxgroup = 1 -- set to 2 to include gms, 3 to include gods

local ranks = {
['level'] = 1,
['lvl'] = 1,
['exp'] = 1,
['xp'] = 1,
['magic'] = 2,
['ml'] = 2,
['bank'] = 3,
['balance'] = 3,
['cash'] = 3,
['money'] = 3,
['gp'] = 3,
['fist'] = 4,
['club'] = 5,
['sword'] = 6,
['axe'] = 7,
['distance'] = 8,
['dist'] = 8,
['shielding'] = 9,
['shield'] = 9,
['fishing'] = 10,
['fish'] = 10,
['frags'] = 11
}

local voc = {
['none'] = 0,
['sorcerer'] = {1, 5},
['ms'] = {1, 5},
['druid'] = {2, 6},
['ed'] = {2, 6},
['paladin'] = {3, 7},
['rp'] = {3, 7},
['knight'] = {4, 8},
['ek'] = {4, 8}
}

local stats = {
-- {"order by this", "show this first"}
[1] = {"experience", "level"},
[2] = {"manaspent", "maglevel"},
[3] = {"balance"},
[4] = {"skill_fist"},
[5] = {"skill_club"},
[6] = {"skill_sword"},
[7] = {"skill_axe"},
[8] = {"skill_dist"},
[9] = {"skill_shielding"},
[10] = {"skill_fishing"}
}

local stats_names = {
[1] = {"exp", "level"},
[2] = {"mana spent", "magic level"},
[3] = {"account balance"},
[4] = {"fist fighting"},
[5] = {"club fighting"},
[6] = {"sword fighting"},
[7] = {"axe fighting"},
[8] = {"distance fighting"},
[9] = {"shielding"},
[10] = {"fishing"},
[11] = {"frags"}
}

local stats_short = {
[1] = {"xp: ", ""},
[2] = {"mana: ", ""},
[3] = {""},
[4] = {""},
[5] = {""},
[6] = {""},
[7] = {""},
[8] = {""},
[9] = {""},
[10] = {""},
[11] = {""}
}

function table.find(table, value)
for i, v in pairs(table) do
if v == value then
return i
end
end
return nil
end

function getHighest(check, values)
local highest = 0
local highestVal = nil
local highestI = nil
for i = 1, #values do
if check[values] > highest then
highest = check[values]
highestVal = values
highestI = i
end
end

return {highest, highestVal, highestI}
end


function getTopFraggers(vocs)
local fraggers = {}
local resultId = db.storeQuery("SELECT `player_id`, `killed_by` FROM `player_deaths` WHERE `is_player` = 1")
if resultId then
repeat
table.insert(fraggers, result.getDataString(resultId, "killed_by"))
until not result.next(resultId)
result.free(resultId)
end


local fraggers_names = {}
for i = 1, #fraggers do
if not table.find(fraggers_names, fraggers) then
table.insert(fraggers_names, fraggers)
end
end


local fraggers_total = {}
for i = 1, #fraggers do
for j = 1, #fraggers_names do
if fraggers_names[j] == fraggers then
if not fraggers_total[fraggers_names[j]] then fraggers_total[fraggers_names[j]] = 0 end
fraggers_total[fraggers_names[j]] = fraggers_total[fraggers_names[j]] + 1
end
end
end


local place = 0
local fraggers_top = {}
repeat
local v = getHighest(fraggers_total, fraggers_names)
if not v[2] then
break
end

if vocs then
local resultId = db.storeQuery("SELECT `vocation` FROM `players` WHERE `name` = '" .. v[2] .. "' LIMIT 1")
if isInArray(vocs, result.getDataInt(resultId, "vocation")) then
place = place + 1
table.insert(fraggers_top, {v[1], v[2]})
end
else
place = place + 1
table.insert(fraggers_top, {v[1], v[2]})
end
table.remove(fraggers_names, v[3])
until (place == top) or (not v[3])

local msg = ""
for i = 1, #fraggers_top do
if fraggers_top[2] then
msg = msg .. "\n[" .. i .. "] [" .. fraggers_top[2] .. "] [" .. fraggers_top[1] .. "]"
else
break
end
end
return msg
end


function onSay(player, words, param)
if player:getStorageValue(exhaustvalue) >= os.time() then
player:sendTextMessage(errorcolor, "Please do not spam.")
return false
end


player:setStorageValue(exhaustvalue, os.time() + exhausttime)

local split = param:split(",")
if #split == 0 then
local ranks2 = {}
for i = 1, #stats_names do
table.insert(ranks2, stats_names[#stats_names])
end
player:popupFYI("Example: " .. words .. " balance, knight(optional)\n\nAvailable ranks:\n" .. table.concat(ranks2, "\n"))
return false
end


for i = 1, #split do
split = split:gsub("^%s*(.-)%s*$", "%1")
end

if ranks[split[1]] then
local msg = "Top players on server, " .. stats_names[ranks[split[1]]][#stats_names[ranks[split[1]]]] .. (voc[split[2]] and (", " .. split[2]) or "") .. ":"

if ranks[split[1]] == 11 then
if popup then
player:popupFYI(msg .. getTopFraggers(voc[split[2]]))
else
player:sendTextMessage(rankcolor, msg .. getTopFraggers(voc[split[2]]))
end
return false
else
local resultId = db.storeQuery("SELECT `name`, `" .. table.concat(stats[ranks[split[1]]], "`, `") .. "` FROM `players` WHERE `group_id` <= " .. maxgroup .. (voc[split[2]] and (" AND `vocation` IN (" .. table.concat(voc[split[2]], ",") .. ")") or "") .. " ORDER BY `" .. stats[ranks[split[1]]][#stats[ranks[split[1]]]] .. "` DESC LIMIT " .. top)
local place = 0
repeat
place = place + 1
msg = msg .. "\n[" .. place .. "] [" .. result.getDataString(resultId, "name") .. "] "

for i = 1, #stats[ranks[split[1]]] do
local s = #stats[ranks[split[1]]] + 1 - i
msg = msg .. "[" .. stats_short[ranks[split[1]]] .. result.getDataInt(resultId, stats[ranks[split[1]]]) .. "]" .. (s > 1 and " " or "")
end
until not result.next(resultId)
result.free(resultId)
if popup then
player:popupFYI(msg)
else
player:sendTextMessage(rankcolor, msg)
end
end
return false
end

player:sendTextMessage(errorcolor, "Incorrect list name. Execute command without parameters to see available lists.")
return false
end

You need to take a second and learn how to code tags work.

1547855456316.png
 
@Apollos ok

Code:
local top = 10
local rankcolor = MESSAGE_STATUS_CONSOLE_ORANGE
local errorcolor = MESSAGE_STATUS_CONSOLE_BLUE
local popup = true -- set to false if you want it in local chat
local exhaustvalue = 78692 -- storage to avoid command spam
local exhausttime = 5 -- seconds before you may request rank again
local maxgroup = 1 -- set to 2 to include gms, 3 to include gods

local ranks = {
    ['level'] = 1,
    ['lvl'] = 1,
    ['exp'] = 1,
    ['xp'] = 1,
    ['magic'] = 2,
    ['ml'] = 2,
    ['bank'] = 3,
    ['balance'] = 3,
    ['cash'] = 3,
    ['money'] = 3,
    ['gp'] = 3,
    ['fist'] = 4,
    ['club'] = 5,
    ['sword'] = 6,
    ['axe'] = 7,
    ['distance'] = 8,
    ['dist'] = 8,
    ['shielding'] = 9,
    ['shield'] = 9,
    ['fishing'] = 10,
    ['fish'] = 10,
    ['frags'] = 11
}

local voc = {
    ['none'] = 0,
    ['sorcerer'] = {1, 5},
    ['ms'] = {1, 5},
    ['druid'] = {2, 6},
    ['ed'] = {2, 6},
    ['paladin'] = {3, 7},
    ['rp'] = {3, 7},
    ['knight'] = {4, 8},
    ['ek'] = {4, 8}
}

local stats = {
-- {"order by this", "show this first"}
    [1] = {"experience", "level"},
    [2] = {"manaspent", "maglevel"},
    [3] = {"balance"},
    [4] = {"skill_fist"},
    [5] = {"skill_club"},
    [6] = {"skill_sword"},
    [7] = {"skill_axe"},
    [8] = {"skill_dist"},
    [9] = {"skill_shielding"},
    [10] = {"skill_fishing"}
}

local stats_names = {
    [1] = {"exp", "level"},
    [2] = {"mana spent", "magic level"},
    [3] = {"account balance"},
    [4] = {"fist fighting"},
    [5] = {"club fighting"},
    [6] = {"sword fighting"},
    [7] = {"axe fighting"},
    [8] = {"distance fighting"},
    [9] = {"shielding"},
    [10] = {"fishing"},
    [11] = {"frags"}
}

local stats_short = {
    [1] = {"xp: ", ""},
    [2] = {"mana: ", ""},
    [3] = {""},
    [4] = {""},
    [5] = {""},
    [6] = {""},
    [7] = {""},
    [8] = {""},
    [9] = {""},
    [10] = {""},
    [11] = {""}
}

function table.find(table, value)
   for i, v in pairs(table) do
     if v == value then
       return i
     end
   end
   return nil
end

function getHighest(check, values)
   local highest = 0
   local highestVal = nil
   local highestI = nil
   for i = 1, #values do
     if check[values[i]] > highest then
       highest = check[values[i]]
       highestVal = values[i]
       highestI = i
     end
   end
  
   return {highest, highestVal, highestI}
end

function getTopFraggers(vocs)
    local fraggers = {}
    local resultId = db.storeQuery("SELECT `player_id`, `killed_by` FROM `player_deaths` WHERE `is_player` = 1")
    if resultId then
        repeat
            table.insert(fraggers, result.getDataString(resultId, "killed_by"))       
        until not result.next(resultId)
        result.free(resultId)
    end

    local fraggers_names = {}
    for i = 1, #fraggers do
        if not table.find(fraggers_names, fraggers[i]) then
            table.insert(fraggers_names, fraggers[i])
        end
    end

    local fraggers_total = {}
    for i = 1, #fraggers do
        for j = 1, #fraggers_names do
            if fraggers_names[j] == fraggers[i] then
            if not fraggers_total[fraggers_names[j]] then fraggers_total[fraggers_names[j]] = 0 end
                fraggers_total[fraggers_names[j]] = fraggers_total[fraggers_names[j]] + 1
            end
        end   
    end

    local place = 0
    local fraggers_top = {}
    repeat
        local v = getHighest(fraggers_total, fraggers_names)
        if not v[2] then
            break
        end
        
        if vocs then
            local resultId = db.storeQuery("SELECT `vocation` FROM `players` WHERE `name` = '" .. v[2] .. "' LIMIT 1")
            if isInArray(vocs, result.getDataInt(resultId, "vocation")) then
                place = place + 1
                table.insert(fraggers_top, {v[1], v[2]})
            end
        else
            place = place + 1
            table.insert(fraggers_top, {v[1], v[2]})
        end
        table.remove(fraggers_names, v[3])
    until (place == top) or (not v[3])
    
    local msg = ""
    for i = 1, #fraggers_top do
        if fraggers_top[i][2] then
            msg = msg .. "\n[" .. i .. "] [" .. fraggers_top[i][2] .. "] [" .. fraggers_top[i][1] .. "]"
        else
            break
        end
    end
return msg
end

function onSay(player, words, param)
    if player:getStorageValue(exhaustvalue) >= os.time() then
        player:sendTextMessage(errorcolor, "Please do not spam.")
        return false
    end

    player:setStorageValue(exhaustvalue, os.time() + exhausttime)

    local split = param:split(",")
    if #split == 0 then
        local ranks2 = {}
        for i = 1, #stats_names do
            table.insert(ranks2, stats_names[i][#stats_names[i]])
        end
        player:popupFYI("Example: " .. words .. " balance, knight(optional)\n\nAvailable ranks:\n" .. table.concat(ranks2, "\n"))
        return false
    end

    for i = 1, #split do
        split[i] = split[i]:gsub("^%s*(.-)%s*$", "%1")
    end
    
    if ranks[split[1]] then
        local msg = "Top players on server, " .. stats_names[ranks[split[1]]][#stats_names[ranks[split[1]]]] .. (voc[split[2]] and (", " .. split[2]) or "") .. ":"
        
        if ranks[split[1]] == 11 then
            if popup then
                player:popupFYI(msg .. getTopFraggers(voc[split[2]]))
            else
                player:sendTextMessage(rankcolor, msg .. getTopFraggers(voc[split[2]]))
            end
            return false
        else
            local resultId = db.storeQuery("SELECT `name`, `" .. table.concat(stats[ranks[split[1]]], "`, `") .. "` FROM `players` WHERE `group_id` <= " .. maxgroup .. (voc[split[2]] and (" AND `vocation` IN (" .. table.concat(voc[split[2]], ",") .. ")") or "") .. " ORDER BY `" .. stats[ranks[split[1]]][#stats[ranks[split[1]]]] .. "` DESC LIMIT " .. top)
            local place = 0
            repeat
                place = place + 1
                msg = msg .. "\n[" .. place .. "] [" .. result.getDataString(resultId, "name") .. "] "
                
                for i = 1, #stats[ranks[split[1]]] do
                    local s = #stats[ranks[split[1]]] + 1 - i
                    msg = msg .. "[" .. stats_short[ranks[split[1]]][s] .. result.getDataInt(resultId, stats[ranks[split[1]]][s]) .. "]" .. (s > 1 and " " or "")
                end
            until not result.next(resultId)
            result.free(resultId)
            if popup then
                player:popupFYI(msg)
            else
                player:sendTextMessage(rankcolor, msg)
            end
        end
        return false
    end
    
    player:sendTextMessage(errorcolor, "Incorrect list name. Execute command without parameters to see available lists.")
    return false
end
 
Back
Top