Ir para conteúdo

Posts Recomendados

Dice Arena

Esse evento foi postado para o Script de Terça, para ver os outros scripts de terça, clique aqui.

Como o evento funciona?

Um número configurado de jogadores deve permanecer em posições configuradas (Igual na annihilator). Quando todas as posições tiverem ocupadas, o primeiro jogador puxa a alavanca, levando todos para dentro da Arena. Dentro da arena, tem um dado que, quando usado, sorteia um monstro. Quando os jogadores matam o monstro, um loot cai no chão (Quanto menor o número do dado, mais forte será o monstro e melhor será o item que dropa).

- Se já tiver gente dentro da arena, outro time não poderá entrar.

- Uma vez dentro da arena, cada jogador só pode rodar o dado uma vez.

- Cada jogador só pode entrar na arena uma vez por dia (tempo configurável).

- Os monstros e loots são configuráveis.

Vídeo do evento

(obrigado ao por me ajudar a gravar)

Instalação

Lib

 

Crie diceArena.lua em data/lib e coloque:

-- Dice Arena Event criado por Killua, XTibia.com

dice_cfg = {
    positions_ = {{x = 164, y = 17, z = 7}, {x = 164, y = 18, z = 7}},
    arena_pos = {x = 501, y = 141, z = 7},
    wait_ = 60*60*24,
    max_time = 1800,
    
    numbers = {
        [1] = {"Orshabaal", "Morgaroth", "Ferumbras"},
        [2] = {"Demodras", "Juggernaut"},
        [3] = {"Demon", "Behemoth"},
        [4] = {"Dragon Lord", "Hydra"},
        [5] = {"Dragon", "Cyclops"},
        [6] = {"Rotworm", "Rat"}
    },
    
    noob_item = {2158, 10},
    pro_item = {2160, 5},

    arena_frompos = {x = 491, y = 125, z = 7},
    arena_topos = {x = 512, y = 144, z = 7}
}

function removeDiceMonsters()
    for x = dice_cfg.arena_frompos.x, dice_cfg.arena_topos.x do
        for y = dice_cfg.arena_frompos.y, dice_cfg.arena_topos.y do
            local area_ = {x = x, y = y, z = dice_cfg.arena_frompos.z}
            local creature = getTopCreature(area_)
            if isMonster(creature.uid) then
                doRemoveCreature(creature.uid)
            end
        end
    end
end

 

Actions

 

 

Crie diceLever.lua em data/actions/scripts e coloque:


-- Dice Arena Event criado por Killua, XTibia.com

function onUse(cid, item, fromPosition, itemEx, toPosition)
    local check = 0
    local players = {}
    if item.actionid == 8733 then       
        for i = 1, #dice_cfg.positions_ do
            if isPlayer(getTopCreature(dice_cfg.positions_[i]).uid) then
                check = check + 1
            end
        end
        
        if check == #dice_cfg.positions_ then 
            if getGlobalStorageValue(182221) == -1 then 
                for j = 1, #dice_cfg.positions_ do
                    table.insert(players, getTopCreature(dice_cfg.positions_[j]).uid)
                end
                for e = 1, #players do
                    if getPlayerStorageValue(players[e], 181293) > os.time() then
                        check = check- 1
                    end
                end
                    
                    if check == #dice_cfg.positions_ then
                        for u = 1, #players do
                            doTeleportThing(players[u], dice_cfg.arena_pos, false)
                            doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945)
                            doPlayerSendTextMessage(players[u], MESSAGE_STATUS_CONSOLE_BLUE, "Voce entrou na arena do dado! Teste sua sorte...")
                            setGlobalStorageValue(182221, #dice_cfg.positions_ - 1)
                            doPlayerSetStorageValue(players[u], 181293, os.time() + dice_cfg.wait_)
                            addEvent(function()
                                if isInArea(getThingPos(players[u]), dice_cfg.arena_frompos, dice_cfg.arena_topos) then
                                    doTeleportThing(players[u], getTownTemplePosition(getPlayerTown(players[u])), false)
                                    setGlobalStorageValue(182221, -1)
                                    removeDiceMonsters()
                                end
                            end, dice_cfg.max_time * 1000)
                        end
                    else
                        doPlayerSendCancel(cid, "Alguem do seu time ja entrou na arena nos ultimos "..dice_cfg.wait_" segundos.")
                    end
            else
                doPlayerSendCancel(cid, "Ja tem alguem dentro da arena, aguarde...") 
            end
        else
            doPlayerSendCancel(cid, "Sao necessarios pelo menos "..#dice_cfg.positions_.." jogadores para entrar na arena.")
        end    
    elseif item.uid == 8734 then
        if getPlayerStorageValue(cid, 281811) <= os.time() then
            doPlayerSetStorageValue(cid, 281811, os.time() + dice_cfg.wait_ - dice_cfg.wait_ / 3)
            local value = math.random(5792, 5797)
            doSendMagicEffect(fromPosition, CONST_ME_CRAPS)
            doTransformItem(item.uid, value)
            doCreatureSay(cid, getCreatureName(cid) .. " rolled a " .. value - 5791 .. ".", TALKTYPE_ORANGE_1)
            if dice_cfg.numbers[value - 5791] then
                local rand = math.random(1, #dice_cfg.numbers[value - 5791])
                doCreateMonster(dice_cfg.numbers[value - 5791][rand], getClosestFreeTile(cid, fromPosition))
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce criou um "..dice_cfg.numbers[value - 5791][rand].."! Um monstro de nivel " .. value - 5791 .. ", derrote-o para conseguir seu premio!")
            end
        else
            doPlayerSendCancel(cid, "Voce so podera usar o dado daqui a "..getPlayerStorageValue(cid, 281811) - os.time().." segundos.")
        end
    end
    return true
end

Em actions.xml, coloque essas TAGs:

<action actionid="8733" script="diceLever.lua"/>
<action uniqueid="8734" script="diceLever.lua"/>

 

Creaturescripts

 

Em data/creaturescripts/scripts crie diceKill.lua e coloque:


-- Dice Arena Event criado por Killua, XTibia.com

local function getMonsterCategory(name)
    for index, names in pairs(dice_cfg.numbers) do
        if isInArray(names, ""..name.."") then
            return index
        end
    end
end

function onKill(cid, target, lastHit)
    if isMonster(target) and isPlayer(cid) then
        if isInArea(getThingPos(target), dice_cfg.arena_frompos, dice_cfg.arena_topos) then
            if getGlobalStorageValue(8181818) <= os.time() then
                setGlobalStorageValue(8181818, os.time() + 1)
                if getMonsterCategory(getCreatureName(target)) then
                    if getMonsterCategory(getCreatureName(target)) > 2 then
                        addEvent(doCreateItem, 200, dice_cfg.noob_item[1], math.random(1, dice_cfg.noob_item[2]), getThingPos(target))
                    elseif getMonsterCategory(getCreatureName(target)) == 2 then
                        local chance = math.random(1,100)
                        if chance <= 20 then
                            addEvent(doCreateItem, 200, dice_cfg.pro_item[1], math.random(1, dice_cfg.pro_item[2]), getThingPos(target))
                        else
                            addEvent(doCreateItem, 200, dice_cfg.noob_item[1], math.random(1, dice_cfg.noob_item[2]), getThingPos(target))
                        end
                    elseif getMonsterCategory(getCreatureName(target)) == 1 then
                        addEvent(doCreateItem, 200, dice_cfg.pro_item[1], math.random(1, dice_cfg.pro_item[2]), getThingPos(target))
                    end
                    doSendMagicEffect(getThingPos(target), 38)
                    doCreatureSay(target, "You have gained a special loot!", TALKTYPE_ORANGE_1)
                end
            end
        end
    end
    return true
end

function onLogin(cid)
    if isInArea(getThingPos(cid), dice_cfg.arena_frompos, dice_cfg.arena_topos) then
        doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
    end
    registerCreatureEvent(cid, "diceKill")
    return true
end

Em creaturescripts.xml, coloque essas TAGs:

<event type="kill" name="diceKill" event="script" value="diceKill.lua"/>
<event type="login" name="diceLogin" event="script" value="diceKill.lua"/>

 

Movements

 

Em data/movements/scripts crie diceMove.lua e coloque:


-- Dice Arena Event criado por Killua, XTibia.com

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)  
    doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false)
    if getGlobalStorageValue(182221) == 0 then
        removeDiceMonsters() 
    elseif getGlobalStorageValue(182221) > 0 then
        setGlobalStorageValue(182221, getGlobalStorageValue(182221) - 1)
    end
    return true
end

Em movements.xml, coloque essa TAG:

<movevent type="StepIn" actionid="8730" event="script" value="diceMove.lua"/>

 

Globalevents

 

Em data/globalevents/scripts crie diceStart.lua e coloque:

function onStartup()
    setGlobalStorageValue(182221, -1)
    return true
end

Em globalevents.xml, coloque essa TAG:

<globalevent name="diceStart" type="start" event="script" value="diceStart.lua"/>

Configuração
A configuração é feita inteiramente na lib, nesta tabela:

dice_cfg = {    

    positions_ = {{x = 164, y = 17, z = 7}, {x = 164, y = 18, z = 7}},
    arena_pos = {x = 501, y = 141, z = 7},
    wait_ = 60*60*24,
    max_time = 1800,
    
    numbers = {
        [1] = {"Orshabaal", "Morgaroth", "Ferumbras"},
        [2] = {"Demodras", "Juggernaut"},
        [3] = {"Demon", "Behemoth"},
        [4] = {"Dragon Lord", "Hydra"},
        [5] = {"Dragon", "Cyclops"},
        [6] = {"Rotworm", "Rat"}
    },
    
    noob_item = {2158, 10},
    pro_item = {2160, 5},

    arena_frompos = {x = 491, y = 125, z = 7},
    arena_topos = {x = 512, y = 144, z = 7}
}

Em positions_, coloque as posições que os jogadores devem ficar para poder puxar a alavanca (Pode por quantas quiser).

Em arena_pos, coloque a posição da arena (Pra onde os jogadores vão quando puxarem a alavanca).

Em wait_, coloque o tempo que o jogador deve esperar para entrar na arena novamente (em segundos). 60*60*24 = 1 dia, aconselho deixar assim.

Em max_time, coloque o tempo máximo que os jogadores podem permanecer na arena (em segundos (após esse tempo, eles serão teleportados para o templo)).

Em numbers, coloque o nome dos monstros que podem vir dependendo do número sorteado pelo dado (quanto menor o número, mais forte devem ser os monstros).

Em noob_item, coloque o {id, quantidade} do item que dropa dos monstros mais fracos/médios

Em pro_item, coloque o {id, quantidade} do item que pode dropar dos monstros mais fortes/médios

Em arena_frompos, coloque a posição do canto superior esquerdo da arena.

Em arena_topos, coloque a posição do canto inferior direito da arena.

Coloque NO-LOGOUT TOOL na arena inteira.
Siga as imagens para facilitar a configuração:

Arena:
mtph82.jpg
Entrando na arena:
30c117t.jpg

Se alguém se dispuser a fazer um mapa pro evento para eu disponibilizar para download, eu agradeceria.
Espero que gostem do evento.
Editado por Killua
Link para o comentário
Compartilhar em outros sites

  • 1 year later...
  • 1 month later...

Todos falaram bem do script, porem não funciona corretamente.

Ao matar o boss e entrar no TP e ir para o templo, qualquer pessoa que tentei puxar alavanca diz que "ja tem alguem dentro da arena, aguarde.."

Caso você morra pro boss, acontece a mesma coisa.

Link para o comentário
Compartilhar em outros sites

  • 3 years later...
Em 10/05/2015 em 12:47, Killua disse:

Do jeito que está aí vc pode escolher um item "noob" e um item "pro" e suas quantidades máximas. Quanto mais forte o monstro, maior a quantidade de item q vai cair.

estou com essa mesmo problema

alguem pode ajudar?

Todos falaram bem do script, porem não funciona corretamente.

Ao matar o boss e entrar no TP e ir para o templo, qualquer pessoa que tentei puxar alavanca diz que "ja tem alguem dentro da arena, aguarde.."

Caso você morra pro boss, acontece a mesma coisa.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...