Ir para conteúdo

Featured Replies

Postado

OLA COMUNIDADE SE ALGUEM PUDER ME AJUDAR FICAREI MUITO GRATO!
PRECISO DE UMA SCRIPT PRA UMA  ARENA,  É UM QUADRADO!
PLAYER ENTRA NELA E AO MORRER ELE NAO PERDE NADA VOLTA PRO TEMPLO!
DESDE JA OBRIGADO PELA ATENÇAO

  • Respostas 8
  • Visualizações 306
  • Created
  • Última resposta

Top Posters In This Topic

Postado

vamos lá, primeiramente iremos instalar uma função na sua lib, vá em data/lib, abra o 050-function.lua ou function.lua, na última linha de todas, pule 2 e cole:

function getPlayersInArea(area)
    local players = {}
    
    -- Verifica se as coordenadas estão dentro dos limites do mapa
    local function isValidCoordinate(x, y, z)
        return x >= area.fromx and x <= area.tox and
               y >= area.fromy and y <= area.toy and
               z >= area.fromz and z <= area.toz
    end

    for x = area.fromx, area.tox do
        for y = area.fromy, area.toy do
            for z = area.fromz, area.toz do
                if isValidCoordinate(x, y, z) then
                    local creature = getTopCreature({x = x, y = y, z = z})
                    if creature.uid ~= 0 and isPlayer(creature.uid) then
                        table.insert(players, creature.uid)
                    end
                end
            end
        end
    end
    
    return players
end

agora iremos criar as alavancas, vá em data/actions/scripts, crie um arquivo chamado leverpvp.lua e adicione dentro:

function onUse(cid, item, frompos, item2, topos)
    local cfg = {
        firstSquare = {x = 500, y = 400, z = 7},
        secondSquare = {x = 400, y = 500, z = 7},
        arenaPos1 = {x = 450, y = 540, z = 7},
        arenaPos2 = {x = 460, y = 540, z = 7},
    }

    local area = {fromx = 1008, fromy = 1018, fromz = 7, tox = 1025, toy = 1033, toz = 7} -- Posições da área
    local check = getPlayersInArea(area)

    -- Verifica se há mais de um jogador na área antes de iniciar o teletransporte
    if #check > 1 then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Aguarde o término da batalha atual.")
        return true
    end

    -- Verifica se o jogador ativou o item e está em firstSquare
    if isPlayer(getThingFromPos(cfg.firstSquare).uid) and getCreaturePosition(cid) == cfg.firstSquare then
        doTeleportThing(cid, cfg.arenaPos1)
        doSendAnimatedText(cfg.arenaPos1, "COMEÇAR!", math.random(1, 255))
        return true
    end

    -- Verifica se o jogador ativou o item e está em secondSquare
    if isPlayer(getThingFromPos(cfg.secondSquare).uid) and getCreaturePosition(cid) == cfg.secondSquare then
        doTeleportThing(cid, cfg.arenaPos2)
        doSendAnimatedText(cfg.arenaPos2, "COMEÇAR!", math.random(1, 255))
        return true
    end

    -- Se nenhum jogador estiver presente nas áreas designadas ou se o jogador não ativou o item, não faz nada
    return false
end

Configurando:

local cfg = { firstSquare = {x = 500, y = 400, z = 7}, secondSquare = {x = 400, y = 500, z =7}, arenaPos1 = {x = 450, y = 540, z = 7}, arenaPos2 = {x = 450, y = 540, z = 7}, }

firstSquare, você coloca as coordenadas do SQM da alavanca do player1, e secondSquare é a mesma coisa, só que do player2. arenaPos1 você coloca a posição do SQM de dentro da arena do player1, e arenaPos2 a mesma coisa só que para o player2. Essa parte: local area = {fromx = 1008, fromy = 1018, fromz = 7, tox = 1025, toy = 1033, toz = 7} -- Positions local check = getPlayersInArea(area) fromx , fromy e fromz são as coordenadas (X,Y,Z), coloque nesses 3 as coordenadas do canto esquerdo superior da arena, e tox, toy e toz coloca do canto inferior direito.

 

Em actions.xml adicione essa tag:

 

<action actionid="19229" event="script" value="leverpvp.lua"/>

Agora adicione ACTION ID 19229 nas 2 alavancas, pelo RME MAP EDITOR

 

 

agora vamos criar o código da arena, aonde ao morrer ali irão ser teleportados para o templo e não perderão vida/loot, correto? Vá em data/creaturescripts/scripts, crie um arquivo chamado arenadeath.lua e adicione dentro:

 

function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)
    local area = {fromx = 1008, fromy = 1018, fromz = 7, tox = 1025, toy = 1033, toz = 7} -- Definição da área

    -- Verifica se o personagem que está prestes a morrer está dentro da área especificada
    if isInRange(getCreaturePosition(cid), area) then
        -- Desabilita a geração de loot para o personagem que está morrendo
        doCreatureSetDropLoot(cid, false)

        -- Teleporta o personagem para o templo da cidade
        doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))

        -- Envia uma mensagem para o personagem que morreu
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você perdeu!")

        -- Recupera a saúde do personagem para o máximo + um valor extra
        local maxHealth = getCreatureMaxHealth(cid)
        doCreatureAddHealth(cid, maxHealth + 65500, true)

        -- Verifica se houve um último atacante (lastHitKiller) e se é um jogador
        if lastHitKiller ~= nil and isPlayer(lastHitKiller) then
            -- Teleporta o último atacante para o templo da cidade
            doTeleportThing(lastHitKiller, getTownTemplePosition(getPlayerTown(lastHitKiller)))

            -- Envia uma mensagem para o último atacante
            doPlayerSendTextMessage(lastHitKiller, MESSAGE_STATUS_CONSOLE_BLUE, "Parabéns, você venceu!")
        end
    end
    return true
end

Em creaturescripts.xml adicione essa tag:

<event type="preparedeath" name="Arenadeath" event="script" value="arenadeath.lua"/>

 

 

O autor deste script é Roksas.

 

Mas não sei qual versão você está usando no Motor Engine, TFS 0.4 ou TFS 1.x+.

Esses scripts foram feitos para o TFS 0.4. Se estiver usando o TFS 1.x, posso adaptá-los para essa versão. Alternativamente, você pode baixar um OT OTG 11x que tenha o sistema de arena 2x2 ou 10x10. Basta copiar e colar no seu servidor; deve funcionar dessa maneira também.

Editado por GM Vortex (veja o histórico de edições)

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo