Ir para conteúdo
  • 0

[Pedido] Modificação em Script de Prêmio


Farathor

Pergunta

Eu tenho um script de evento que funciona assim, O evento é o seguinte, existe um castelo, e nesse castelo são criadas varias torres, e os jogadores irão matar essas torres, no fim do evento, que é quando toda as torres morrem, o jogador que mais bateu, ou seja que rancou mais vida de todas as torres vence, e a guild que mais rancou vida de todas as torres vence também

 

Esse script abaixo, só da o prêmio, para 1 jogador, o que mais rancou vida das torres, mas eu queria fazer uma modificação, colocar para todas as vocações ganharam, ou seja,

 

O Sorcerer que mais rancar vida ganha,

O Druid também

Paladin também

Knight também, conseguiram entender

Esse script atual, também tem o seguinte, ele manda uma mensagem que o jogador venceu o evento, e eu gostaria que ele mandasse uma mensagem para cada vocação

{Castle War} O jogador com maior desempenho da vocação Sorcerer foi ...

local query = db.query or db.executeQuery
local premios = { --  -- [chance] -- itemid,amount
[{1, 5}] = {{12674}, {11754}},
[{10, 30}] = {{2390}, {2469}, {2646}, {8306,5}, {2408}},
[{80, 100}] = {{2160,1000}}
}
 
local function getGuildNameById(id)
    local name = ""
    local query = db.getResult('SELECT `name` FROM `guilds` WHERE `id` = "'.. id ..'"')
    if query:getID() == -1 then
        return true
    end
    name = query:getDataString("name")
    query:free()
    return name
end 
function pointNumber(number)
    if not tonumber(number) then
        return false
    end
    local str = ""
    number = tostring(number):reverse()
    local count = 0
    for i = 1, number:len() do
        count = count + 1
        if count <= 3 then
            if str == "" then
                str = number:sub(i, i)
            else
                str = str..number:sub(i, i)
            end
        else
            count = 1
            str = str.."."..number:sub(i, i)
        end
    end
    return str:reverse()
end 
function onStatsChange(cid, attacker, type, combat, value)
    if isMonster(cid) and isPlayer(attacker) and type == STATSCHANGE_HEALTHLOSS then 
        if isInArray({"Castle Guardian I", "Castle Guardian II", "Castle Guardian III", "Castle Guardian IV", "Castle Generator", "Ice Crystal"}, getCreatureName(cid)) then            
doPlayerSetStorageValue(attacker, 1827311, getPlayerStorageValue(attacker, 1827311) + value)
            local quant = guild_hit_count[getPlayerGuildId(attacker)] and guild_hit_count[getPlayerGuildId(attacker)] or 0
            guild_hit_count[getPlayerGuildId(attacker)] = quant + value
        end
    end
    return true
end
 
 
function onDeath(cid, corpse, deathList)
    local gid = 0
    local winner = 0
    if isMonster(cid) and getCreatureName(cid) == "Ice Crystal" then
       if not getPlayingGuilds() then
           return true
       end
       local guilds = getPlayingGuilds()
       local max = 0
       for index, var in pairs(guild_hit_count) do
           if var > max then
               max = var
               gid = index
           end
       end
       setGlobalStorageValue(1823999, gid)
  query("UPDATE `castle_dono` SET `guild_id` = '"..gid.."' WHERE `guild_id` > 0")
       doBroadcastMessage("{Castle War} O evento acabou, a guild com maior desempenho foi "..getGuildNameById(gid)..", com "..pointNumber(max).." pontos sobre o castelo.")
       updateCastleData()
       setGlobalStorageValue(18219113, -1)
       if gid > 0 then
           local mx = 0
           for _, pid in pairs(getPlayersOnline()) do
               if getPlayerGuildId(pid) == gid then
                   local st = getPlayerStorageValue(pid, 1827311)
                   if st > mx then
                       mx = st
                       winner = pid
                   end
               end
           end
           if isPlayer(winner) then        
           local r = math.random(1,100)
                 for v, k in pairs(premios) do
                     if r >= v[1] and r <= v[2] then
                        local rand = k[math.random(#k)]
                        itemr, amountr = rand[1], (not rand[2] and 1 or rand[1] and rand[2] or 1)
                        end
                        end
                        local recompensa = doPlayerAddItem(winner, itemr, amountr) 
                        doBroadcastMessage("{Castle War} O jogador com maior desempenho foi "..getCreatureName(winner)..", com "..pointNumber(mx).." pontos sobre o castelo. Ele recebeu "..pointNumber(amountr).."x "..getItemNameById(itemr).." como premio.")   
                        doItemSetAttribute(recompensa, 'description', "Premio do jogador "..getCreatureName(winner).." ganho no evento castle war do dia "..os.date("%d/%m/%y")..".")                    
                 local medal = doPlayerAddItem(winner, 10127, 1)
                 doItemSetAttribute(medal, 'description', "Trofeu ganho pelo jogador "..getCreatureName(winner).." no evento castle war do dia "..os.date("%d/%m/%y")..".")
          end
        end
        for _, pid in pairs(getPlayersOnline()) do
            if isInArea(getThingPos(pid), {x = 500, y = 574, z = 6}, {x = 575, y = 620, z = 6}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 5}, {x = 556, y = 607, z = 5}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 4}, {x = 556, y = 607, z = 4}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 3}, {x = 556, y = 607, z = 3}) or isInArea(getThingPos(pid), {x = 481, y = 580, z = 7}, {x = 683, y = 798, z = 7}) then
                doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)))
            end
        end
         guild_hit_count = {}
    end
    return true
end
Editado por Farathor
Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Se der erro me explica direitinho o que esse script faz que fica melhor de eu entender ele, aí tento de novo.

edit: E manda o erro também, claro.

local query = db.query or db.executeQuery
local premios = { --  -- [chance] -- itemid,amount
[{1, 5}] = {{12674}, {11754}},
[{10, 30}] = {{2390}, {2469}, {2646}, {8306,5}, {2408}},
[{80, 100}] = {{2160,1000}}
}


local function getGuildNameById(id)
    local name = ""
    local query = db.getResult('SELECT `name` FROM `guilds` WHERE `id` = "'.. id ..'"')
    if query:getID() == -1 then
        return true
    end
    name = query:getDataString("name")
    query:free()
    return name
end 
function pointNumber(number)
    if not tonumber(number) then
        return false
    end
    local str = ""
    number = tostring(number):reverse()
    local count = 0
    for i = 1, number:len() do
        count = count + 1
        if count <= 3 then
            if str == "" then
                str = number:sub(i, i)
            else
                str = str..number:sub(i, i)
            end
        else
            count = 1
            str = str.."."..number:sub(i, i)
        end
    end
    return str:reverse()
end 
function onStatsChange(cid, attacker, type, combat, value)
    if isMonster(cid) and isPlayer(attacker) and type == STATSCHANGE_HEALTHLOSS then 
        if isInArray({"Castle Guardian I", "Castle Guardian II", "Castle Guardian III", "Castle Guardian IV", "Castle Generator", "Ice Crystal"}, getCreatureName(cid)) then            
doPlayerSetStorageValue(attacker, 1827311, getPlayerStorageValue(attacker, 1827311) + value)
            local quant = guild_hit_count[getPlayerGuildId(attacker)] and guild_hit_count[getPlayerGuildId(attacker)] or 0
            guild_hit_count[getPlayerGuildId(attacker)] = quant + value
        end
    end
    return true
end




function onDeath(cid, corpse, deathList)
    local gid = 0
    local winner = {0, 0, 0, 0}
    if isMonster(cid) and getCreatureName(cid) == "Ice Crystal" then
       if not getPlayingGuilds() then
           return true
       end
       local guilds = getPlayingGuilds()
       local max = 0
       for index, var in pairs(guild_hit_count) do
           if var > max then
               max = var
               gid = index
           end
       end
       setGlobalStorageValue(1823999, gid)
  query("UPDATE `castle_dono` SET `guild_id` = '"..gid.."' WHERE `guild_id` > 0")
       doBroadcastMessage("{Castle War} O evento acabou, a guild com maior desempenho foi "..getGuildNameById(gid)..", com "..pointNumber(max).." pontos sobre o castelo.")
       updateCastleData()
       setGlobalStorageValue(18219113, -1)
       if gid > 0 then
           local mx = {0, 0, 0, 0}
           for _, pid in pairs(getPlayersOnline()) do
               if getPlayerGuildId(pid) == gid then
                   local st = getPlayerStorageValue(pid, 1827311)
  local voc = getPlayerVocation(cid) -1
                   if st > mx[voc] then
                       mx[voc] = st
                       winner[voc] = pid
                   end
               end
           end
  
for i = 0, 3, 1 do
if isPlayer(winner[i]) then        
local r = math.random(1,100)
for v, k in pairs(premios) do
if r >= v[1] and r <= v[2] then
local rand = k[math.random(#k)]
itemr, amountr = rand[1], (not rand[2] and 1 or rand[1] and rand[2] or 1)
end
end
local recompensa = doPlayerAddItem(winner[i], itemr, amountr) 
doBroadcastMessage("{Castle War} O jogador com maior desempenho foi "..getCreatureName(winner[i])..", com "..pointNumber(mx).." pontos sobre o castelo. Ele recebeu "..pointNumber(amountr).."x "..getItemNameById(itemr).." como premio.")   
doItemSetAttribute(recompensa, 'description', "Premio do jogador "..getCreatureName(winner[i]).." ganho no evento castle war do dia "..os.date("%d/%m/%y")..".")                    
local medal = doPlayerAddItem(winner[i], 10127, 1)
doItemSetAttribute(medal, 'description', "Trofeu ganho pelo jogador "..getCreatureName(winner[i]).." no evento castle war do dia "..os.date("%d/%m/%y")..".")
end
end


        end
        for _, pid in pairs(getPlayersOnline()) do
            if isInArea(getThingPos(pid), {x = 500, y = 574, z = 6}, {x = 575, y = 620, z = 6}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 5}, {x = 556, y = 607, z = 5}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 4}, {x = 556, y = 607, z = 4}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 3}, {x = 556, y = 607, z = 3}) or isInArea(getThingPos(pid), {x = 481, y = 580, z = 7}, {x = 683, y = 798, z = 7}) then
                doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)))
            end
        end
         guild_hit_count = {}
    end
    return true
end
Editado por OtheReality
Link para o comentário
Compartilhar em outros sites

  • 0

Poderia me informar, o que você fez nesse script?

 

Esse script, é o script final que vai dá o prêmio para o jogador que venceu o evento, e o atual script, o q eu postei, só dá o premio a 1 jogador, e eu gostaria que ele desse esse primeiro a 4 jogadores, 1 de cada vocação

 

explicando melhor - O jogador que ganha o evento, é o que mais tirou vida dos geradores no evento, o meu evento funciona assim, sao criados alguns montros e a guild que tirar mais vida desses monstros ganha, e o jogador que mais tirar vida ganha

e eu gostaria de colocar para que cada jogador de cada vocação ganha-se

Link para o comentário
Compartilhar em outros sites

  • 0
[10/2/2016 2:44:55] [Error - CreatureScript Interface]

[10/2/2016 2:44:55] data/creaturescripts/scripts/CastleWar/CastleWar.lua:onDeath

[10/2/2016 2:44:56] Description:

[10/2/2016 2:44:56] (LuaInterface::internalGetPlayerInfo) Player not found when requesting player info #6


[10/2/2016 2:44:56] [Error - CreatureScript Interface]

[10/2/2016 2:44:56] data/creaturescripts/scripts/CastleWar/CastleWar.lua:onDeath

[10/2/2016 2:44:56] Description:

[10/2/2016 2:44:56] data/creaturescripts/scripts/CastleWar/CastleWar.lua:80: attempt to perform arithmetic on a boolean value

[10/2/2016 2:44:56] stack traceback:

[10/2/2016 2:44:56] data/creaturescripts/scripts/CastleWar/CastleWar.lua:80: in function <data/creaturescripts/scripts/CastleWar/CastleWar.lua:55>




já teria como adicionar as mensagens como eu pedi no tópico principal ?

Link para o comentário
Compartilhar em outros sites

  • 0

Pelo que entendi o problema foi que não deu pra subtrair 1 do id da vocation, sabe dizer a qual seu OT? nome versão?
Tenta isso:

local query = db.query or db.executeQuery
local premios = { --  -- [chance] -- itemid,amount
[{1, 5}] = {{12674}, {11754}},
[{10, 30}] = {{2390}, {2469}, {2646}, {8306,5}, {2408}},
[{80, 100}] = {{2160,1000}}
}


local function getGuildNameById(id)
    local name = ""
    local query = db.getResult('SELECT `name` FROM `guilds` WHERE `id` = "'.. id ..'"')
    if query:getID() == -1 then
        return true
    end
    name = query:getDataString("name")
    query:free()
    return name
end 
function pointNumber(number)
    if not tonumber(number) then
        return false
    end
    local str = ""
    number = tostring(number):reverse()
    local count = 0
    for i = 1, number:len() do
        count = count + 1
        if count <= 3 then
            if str == "" then
                str = number:sub(i, i)
            else
                str = str..number:sub(i, i)
            end
        else
            count = 1
            str = str.."."..number:sub(i, i)
        end
    end
    return str:reverse()
end 
function onStatsChange(cid, attacker, type, combat, value)
    if isMonster(cid) and isPlayer(attacker) and type == STATSCHANGE_HEALTHLOSS then 
        if isInArray({"Castle Guardian I", "Castle Guardian II", "Castle Guardian III", "Castle Guardian IV", "Castle Generator", "Ice Crystal"}, getCreatureName(cid)) then            
doPlayerSetStorageValue(attacker, 1827311, getPlayerStorageValue(attacker, 1827311) + value)
            local quant = guild_hit_count[getPlayerGuildId(attacker)] and guild_hit_count[getPlayerGuildId(attacker)] or 0
            guild_hit_count[getPlayerGuildId(attacker)] = quant + value
        end
    end
    return true
end




function onDeath(cid, corpse, deathList)
    local gid = 0
    local winner = {0, 0, 0, 0, 0}
    if isMonster(cid) and getCreatureName(cid) == "Ice Crystal" then
       if not getPlayingGuilds() then
           return true
       end
       local guilds = getPlayingGuilds()
       local max = 0
       for index, var in pairs(guild_hit_count) do
           if var > max then
               max = var
               gid = index
           end
       end
       setGlobalStorageValue(1823999, gid)
  query("UPDATE `castle_dono` SET `guild_id` = '"..gid.."' WHERE `guild_id` > 0")
       doBroadcastMessage("{Castle War} O evento acabou, a guild com maior desempenho foi "..getGuildNameById(gid)..", com "..pointNumber(max).." pontos sobre o castelo.")
       updateCastleData()
       setGlobalStorageValue(18219113, -1)
       if gid > 0 then
           local mx = {0, 0, 0, 0, 0}
           for _, pid in pairs(getPlayersOnline()) do
               if getPlayerGuildId(pid) == gid then
                   local st = getPlayerStorageValue(pid, 1827311)
  local voc = getPlayerVocation(cid)
                   if st > mx[voc] then
                       mx[voc] = st
                       winner[voc] = pid
                   end
               end
           end
  
for i = 1, 4, 1 do
if isPlayer(winner[i]) then        
local r = math.random(1,100)
for v, k in pairs(premios) do
if r >= v[1] and r <= v[2] then
local rand = k[math.random(#k)]
itemr, amountr = rand[1], (not rand[2] and 1 or rand[1] and rand[2] or 1)
end
end
local recompensa = doPlayerAddItem(winner[i], itemr, amountr) 
doBroadcastMessage("{Castle War} O jogador com maior desempenho foi "..getCreatureName(winner[i])..", com "..pointNumber(mx).." pontos sobre o castelo. Ele recebeu "..pointNumber(amountr).."x "..getItemNameById(itemr).." como premio.")   
doItemSetAttribute(recompensa, 'description', "Premio do jogador "..getCreatureName(winner[i]).." ganho no evento castle war do dia "..os.date("%d/%m/%y")..".")                    
local medal = doPlayerAddItem(winner[i], 10127, 1)
doItemSetAttribute(medal, 'description', "Trofeu ganho pelo jogador "..getCreatureName(winner[i]).." no evento castle war do dia "..os.date("%d/%m/%y")..".")
end
end


        end
        for _, pid in pairs(getPlayersOnline()) do
            if isInArea(getThingPos(pid), {x = 500, y = 574, z = 6}, {x = 575, y = 620, z = 6}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 5}, {x = 556, y = 607, z = 5}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 4}, {x = 556, y = 607, z = 4}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 3}, {x = 556, y = 607, z = 3}) or isInArea(getThingPos(pid), {x = 481, y = 580, z = 7}, {x = 683, y = 798, z = 7}) then
                doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)))
            end
        end
         guild_hit_count = {}
    end
    return true
end
Editado por OtheReality
Link para o comentário
Compartilhar em outros sites

  • 0

É OTX 8.6


[10/2/2016 15:4:45] [Error - CreatureScript Interface]
[10/2/2016 15:4:45] data/creaturescripts/scripts/CastleWar/CastleWar.lua:onDeath
[10/2/2016 15:4:45] Description:
[10/2/2016 15:4:45] (LuaInterface::internalGetPlayerInfo) Player not found when requesting player info #6
[10/2/2016 15:4:45] [Error - CreatureScript Interface]
[10/2/2016 15:4:45] data/creaturescripts/scripts/CastleWar/CastleWar.lua:onDeath
[10/2/2016 15:4:45] Description:
[10/2/2016 15:4:45] data/creaturescripts/scripts/CastleWar/CastleWar.lua:81: attempt to compare nil with number
[10/2/2016 15:4:45] stack traceback:
[10/2/2016 15:4:45] data/creaturescripts/scripts/CastleWar/CastleWar.lua:81: in function <data/creaturescripts/scripts/CastleWar/CastleWar.lua:55>
Link para o comentário
Compartilhar em outros sites

  • 0

Tenta isso ai: (só confere a ordem das vocações se druid é 1, sorc 2, etc mesmo.

local vocation = {
    druid,
    sorcerer,
    paladin,
    knight
}

function onDeath(cid, corpse, deathList)
    local gid = 0
    local winner = {}
    if isMonster(cid) and getCreatureName(cid) == "Ice Crystal" then
       if not getPlayingGuilds() then
           return true
       end
       local guilds = getPlayingGuilds()
       local max = 0
       for index, var in pairs(guild_hit_count) do
           if var > max then
               max = var
               gid = index
           end
       end
       setGlobalStorageValue(1823999, gid)
       query("UPDATE `castle_dono` SET `guild_id` = '"..gid.."' WHERE `guild_id` > 0")
       doBroadcastMessage("{Castle War} O evento acabou, a guild com maior desempenho foi "..getGuildNameById(gid)..", com "..pointNumber(max).." pontos sobre o castelo.")
       updateCastleData()
       setGlobalStorageValue(18219113, -1)
        if gid > 0 then
           local mx = {}
           for _, pid in pairs(getPlayersOnline()) do
               if getPlayerGuildId(pid) == gid then
                   local st = getPlayerStorageValue(pid, 1827311)
                   local i = getPlayerVocation(pid)
                   if st > mx[i%4] then
                       mx[i%4] = st
                       winner[i%4] = pid
                   end
               end
           end
           for i = 0, #winner do
               if isPlayer(winner[i]) then
                   local r = math.random(1,100)
                       for v, k in pairs(premios) do
                           if r >= v[1] and r <= v[2] then
                               local rand = k[math.random(#k)]
                               itemr, amountr = rand[1], (not rand[2] and 1 or rand[1] and rand[2] or 1)
                           end
                       end
                   local recompensa = doPlayerAddItem(winner[i], itemr, amountr)
                   doBroadcastMessage("{Castle War} O jogador com maior desempenho da vocação " ..vocation[i].." foi "..getCreatureName(winner[i])..", com "..pointNumber(mx).." pontos sobre o castelo. Ele recebeu "..pointNumber(amountr).."x "..getItemNameById(itemr).." como premio.")
                   doItemSetAttribute(recompensa, 'description', "Premio do jogador "..getCreatureName(winner[i]).." ganho no evento castle war do dia "..os.date("%d/%m/%y")..".")
                   local medal = doPlayerAddItem(winner[i], 10127, 1)
                   doItemSetAttribute(medal, 'description', "Trofeu ganho pelo jogador "..getCreatureName(winner[i]).." no evento castle war do dia "..os.date("%d/%m/%y")..".")
               end
           end
        end
        for _, pid in pairs(getPlayersOnline()) do
            if isInArea(getThingPos(pid), {x = 500, y = 574, z = 6}, {x = 575, y = 620, z = 6}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 5}, {x = 556, y = 607, z = 5}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 4}, {x = 556, y = 607, z = 4}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 3}, {x = 556, y = 607, z = 3}) or isInArea(getThingPos(pid), {x = 481, y = 580, z = 7}, {x = 683, y = 798, z = 7}) then
                doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)))
            end
        end
        guild_hit_count = {}
    end
    return true
end
Editado por Skulls
Link para o comentário
Compartilhar em outros sites

  • 0

cara, teria como colocar assim

Sorcerer, Master Sorcerer

Druid, Elder Druid

Paladin, Royal Paladin

Knight, Elite Knight ?

 

ou, caso o jogador sera master sorcerer, o script ira funfar de boa?


esse é o script completo?


A, e caso alguma vocação não participe do evento, iria dar algum bug ?

Link para o comentário
Compartilhar em outros sites

  • 0
  Em 14/02/2016 em 05:15, Farathor disse:

cara, teria como colocar assim

Sorcerer, Master Sorcerer

Druid, Elder Druid

Paladin, Royal Paladin

Knight, Elite Knight ?

 

ou, caso o jogador sera master sorcerer, o script ira funfar de boa?

 

esse é o script completo?

 

A, e caso alguma vocação não participe do evento, iria dar algum bug ?

Da forma que eu pus ele considera a vocação e sua promoção como uma so, mas da pra mudar. Nao, nao daria bug. Testa e me fala. Editado por Skulls
Link para o comentário
Compartilhar em outros sites

  • 0
[14/2/2016 19:23:20] [Error - CreatureScript Interface]
[14/2/2016 19:23:21] data/creaturescripts/scripts/CastleWar/CastleWar.lua:onDeath
[14/2/2016 19:23:21] Description:
[14/2/2016 19:23:21] data/creaturescripts/scripts/CastleWar/CastleWar.lua:84: attempt to compare nil with number
[14/2/2016 19:23:21] stack traceback:
[14/2/2016 19:23:21] data/creaturescripts/scripts/CastleWar/CastleWar.lua:84: in function <data/creaturescripts/scripts/CastleWar/CastleWar.lua:58>

deu esse erro, quando eu testei com 1 druid e 1 paladin, vou testar o resto


testei com todas as vocações e deu o mesmo erro

Link para o comentário
Compartilhar em outros sites

  • 0
  Em 14/02/2016 em 21:31, Farathor disse:

 

[14/2/2016 19:23:20] [Error - CreatureScript Interface]
[14/2/2016 19:23:21] data/creaturescripts/scripts/CastleWar/CastleWar.lua:onDeath
[14/2/2016 19:23:21] Description:
[14/2/2016 19:23:21] data/creaturescripts/scripts/CastleWar/CastleWar.lua:84: attempt to compare nil with number
[14/2/2016 19:23:21] stack traceback:
[14/2/2016 19:23:21] data/creaturescripts/scripts/CastleWar/CastleWar.lua:84: in function <data/creaturescripts/scripts/CastleWar/CastleWar.lua:58>

deu esse erro, quando eu testei com 1 druid e 1 paladin, vou testar o resto

testei com todas as vocações e deu o mesmo erro

 

Posta o script completo apos as modificações, pra eu saber em qual linha ta o erro.

Link para o comentário
Compartilhar em outros sites

  • 0

 

local query = db.query or db.executeQuery
local premios = { --  -- [chance] -- itemid,amount
[{1, 5}] = {{12674}, {11754}},
[{10, 30}] = {{2390}, {2469}, {2646}, {8306,5}, {2408}},
[{80, 100}] = {{2160,1000}}
}
 
local function getGuildNameById(id)
    local name = ""
    local query = db.getResult('SELECT `name` FROM `guilds` WHERE `id` = "'.. id ..'"')
    if query:getID() == -1 then
        return true
    end
    name = query:getDataString("name")
    query:free()
    return name
end 
function pointNumber(number)
    if not tonumber(number) then
        return false
    end
    local str = ""
    number = tostring(number):reverse()
    local count = 0
    for i = 1, number:len() do
        count = count + 1
        if count <= 3 then
            if str == "" then
                str = number:sub(i, i)
            else
                str = str..number:sub(i, i)
            end
        else
            count = 1
            str = str.."."..number:sub(i, i)
        end
    end
    return str:reverse()
end 
function onStatsChange(cid, attacker, type, combat, value)
    if isMonster(cid) and isPlayer(attacker) and type == STATSCHANGE_HEALTHLOSS then 
        if isInArray({"Castle Guardian I", "Castle Guardian II", "Castle Guardian III", "Castle Guardian IV", "Castle Generator", "Ice Crystal"}, getCreatureName(cid)) then            
doPlayerSetStorageValue(attacker, 1827311, getPlayerStorageValue(attacker, 1827311) + value)
            local quant = guild_hit_count[getPlayerGuildId(attacker)] and guild_hit_count[getPlayerGuildId(attacker)] or 0
            guild_hit_count[getPlayerGuildId(attacker)] = quant + value
        end
    end
    return true
end
 
local vocation = {
    druid,
    sorcerer,
    paladin,
    knight
}
 
function onDeath(cid, corpse, deathList)
    local gid = 0
    local winner = {}
    if isMonster(cid) and getCreatureName(cid) == "Ice Crystal" then
       if not getPlayingGuilds() then
           return true
       end
       local guilds = getPlayingGuilds()
       local max = 0
       for index, var in pairs(guild_hit_count) do
           if var > max then
               max = var
               gid = index
           end
       end
       setGlobalStorageValue(1823999, gid)
       query("UPDATE `castle_dono` SET `guild_id` = '"..gid.."' WHERE `guild_id` > 0")
       doBroadcastMessage("{Castle War} O evento acabou, a guild com maior desempenho foi "..getGuildNameById(gid)..", com "..pointNumber(max).." pontos sobre o castelo.")
       updateCastleData()
       setGlobalStorageValue(18219113, -1)
        if gid > 0 then
           local mx = {}
           for _, pid in pairs(getPlayersOnline()) do
               if getPlayerGuildId(pid) == gid then
                   local st = getPlayerStorageValue(pid, 1827311)
                   local i = getPlayerVocation(pid)
                   if st > mx[i%4] then
                       mx[i%4] = st
                       winner[i%4] = pid
                   end
               end
           end
           for i = 0, #winner do
               if isPlayer(winner[i]) then
                   local r = math.random(1,100)
                       for v, k in pairs(premios) do
                           if r >= v[1] and r <= v[2] then
                               local rand = k[math.random(#k)]
                               itemr, amountr = rand[1], (not rand[2] and 1 or rand[1] and rand[2] or 1)
                           end
                       end
                   local recompensa = doPlayerAddItem(winner[i], itemr, amountr)
                   doBroadcastMessage("{Castle War} O jogador com maior desempenho da vocação " ..vocation[i].." foi "..getCreatureName(winner[i])..", com "..pointNumber(mx).." pontos sobre o castelo. Ele recebeu "..pointNumber(amountr).."x "..getItemNameById(itemr).." como premio.")
                   doItemSetAttribute(recompensa, 'description', "Premio do jogador "..getCreatureName(winner[i]).." ganho no evento castle war do dia "..os.date("%d/%m/%y")..".")
                   local medal = doPlayerAddItem(winner[i], 10127, 1)
                   doItemSetAttribute(medal, 'description', "Trofeu ganho pelo jogador "..getCreatureName(winner[i]).." no evento castle war do dia "..os.date("%d/%m/%y")..".")
               end
           end
        end
        for _, pid in pairs(getPlayersOnline()) do
            if isInArea(getThingPos(pid), {x = 500, y = 574, z = 6}, {x = 575, y = 620, z = 6}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 5}, {x = 556, y = 607, z = 5}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 4}, {x = 556, y = 607, z = 4}) or isInArea(getThingPos(pid), {x = 511, y = 588, z = 3}, {x = 556, y = 607, z = 3}) or isInArea(getThingPos(pid), {x = 481, y = 580, z = 7}, {x = 683, y = 798, z = 7}) then
                doTeleportThing(pid, getTownTemplePosition(getPlayerTown(pid)))
            end
        end
        guild_hit_count = {}
    end
    return true
end
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...