Ir para conteúdo
  • Cadastre-se

Posts Recomendados

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

Link para o post
Compartilhar em outros sites

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)
Link para o post
Compartilhar em outros sites

Muito obrigado amigo pela atenção uso tfs 1.3

Esses que você comento otg 11 aí eles tem mesmo os script, mais só o script da arena não funciona, deve ter mais completo o script aí não consigo

Link para o post
Compartilhar em outros sites
https://github.com/otg-br/global/blob/main/data/creaturescripts/scripts/arenapvp.lua
https://github.com/otg-br/global/blob/main/data/actions/scripts/arena_pvp/arena2x2.lua
https://github.com/otg-br/global/tree/main/data

 

Se você não conseguir, eu tenho uma arena PvP para o TFS 1.x, mas está em casa. Estou no trabalho agora, mas assim que chegar em casa, enviarei o script completo.

Link para o post
Compartilhar em outros sites

Ok

2 horas atrás, GM Vortex disse:

https://github.com/otg-br/global/blob/main/data/creaturescripts/scripts/arenapvp.lua

https://github.com/otg-br/global/blob/main/data/actions/scripts/arena_pvp/arena2x2.lua

https://github.com/otg-br/global/tree/main/data

 

Se você não conseguir, eu tenho uma arena PvP para o TFS 1.x, mas está em casa. Estou no trabalho agora, mas assim que chegar em casa, enviarei o script completo.

Ok amigo se puder me mandar agradeço muito

Também tou serviço, em casa testo melhor obrigado.

Link para o post
Compartilhar em outros sites

 data/creaturescripts/scripts, 

pvparena.lua

local arena = {
    frompos = {x = 720, y = 660, z = 7},  -- Posição inicial da arena.
    topos = {x = 727, y = 666, z = 7},    -- Posição final da arena.
    exitpos = {x = 718, y = 664, z = 7},  -- Posição de teleporte ao sair da arena.
    exitpos2 = {x = 729, y = 664, z = 7}  -- Segunda posição de teleporte para um jogador específico.
}


-- Verifica se o jogador está dentro da arena
function isPlayerInArena(position)
    return position.x >= arena.frompos.x and position.x <= arena.topos.x and
           position.y >= arena.frompos.y and position.y <= arena.topos.y and
           position.z == arena.frompos.z
end


function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)
    local player = Player(cid)
    if player then
        local playerPos = player:getPosition()
        if isPlayerInArena(playerPos) then
            local killer = Player(lastHitKiller)
            if killer then
                killer:sendTextMessage(MESSAGE_STATUS_WARNING, "[Arena]: Parabéns, você venceu!")
                killer:teleportTo(arena.exitpos2)
            end

            player:setDropLoot(false)
            player:teleportTo(arena.exitpos)
            player:sendTextMessage(MESSAGE_STATUS_WARNING, "[Arena]: Você perdeu!")

           
            player:addHealth(player:getMaxHealth() + 65500)
            player:addMana(player:getMaxMana() + 65500)
        else
          
        end
    end

    return true
end

function onLogin(player)
    player:registerEvent("pvparena")
    return true
end

TAG XML.

<!-- pvp arena -->
	<event type="preparedeath" name="pvparena" script="pvparena.lua"/>
	<event type="login" name="pvparena_r" script="pvparena.lua"/>

data/actions/scripts.

pvparena.lua

function onUse(cid, item, frompos, item2, topos)
    local player = Player(cid)

    if iswar() then
        player:sendCancelMessage('Outra luta está em andamento.')
        return false
    end

    local poss1 = configs_arena.pos_tile1
    local poss2 = configs_arena.pos_tile2
    local pos1 = { x = poss1.x, y = poss1.y, z = poss1.z, stackpos = 255 }
    local pos2 = { x = poss2.x, y = poss2.y, z = poss2.z, stackpos = 255 }

    local uid1 = Tile(pos1):getTopCreature()
    local uid2 = Tile(pos2):getTopCreature()

    if item:getId() == 1945 then
        if not Player(uid1) or not Player(uid2) then
            player:say("Você precisa de dois jogadores para entrar na arena.", TALKTYPE_ORANGE_1)
            return false
        end

        if player:getLevel(uid1) < 50 or player:getLevel(uid2) < 50 then
            player:sendCancelMessage('Todos os jogadores precisam estar no mínimo no nível 50!')
            return false
        end

        start_arena(uid1.uid, uid2.uid) -- Assuming start_arena receives player UIDs
        return true
    end

    return false
end

TAG XML.

	<action uniqueid="1245" event="script" value="pvparena.lua"/>

data/lib.

pvparena.lua

configs_arena = {
    pos_tile1 = {x = 722, y = 658, z = 7},
    pos_tile2 = {x = 724, y = 658, z = 7},
    pos_dest_player1 = {x = 722, y = 663, z = 7},
    pos_dest_player2 = {x = 725, y = 663, z = 7},
    storage1 = 31000,
    storage2 = 31001,
    global_storage = 31000,
    pos_lose = {x = 718, y = 664, z = 7},
    pos_gain = {x = 729, y = 664, z = 7},
    pos_busy = {x = 718, y = 664, z = 7}
}

function iswar()
    return Game.getStorageValue(configs_arena.global_storage) == 1
end

function stop_arena(uid)
    local player = Player(uid)
    if player:getStorageValue(configs_arena.storage1) == 1 then
        player:addHealth(player:getMaxHealth())
        player:removeCondition(CONDITION_INFIGHT)
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'A partida terminou empatada!')
        player:teleportTo(configs_arena.pos_busy)
        player:setStorageValue(configs_arena.storage2, -1)
    end
    return true
end

function start_arena(uid1, uid2)
    if iswar() then
        return false
    end

    local player1 = Player(uid1)
    local player2 = Player(uid2)

    if not(player1 and player2) then
        return false
    end

    if player1:getLevel() < 50 or player2:getLevel() < 50 then
        return false
    end

    player1:setStorageValue(configs_arena.storage2, 1)
    player2:setStorageValue(configs_arena.storage2, 1)

    player1:setStorageValue(configs_arena.storage1, addEvent(stop_arena, (5 * 60 * 1000), uid1))
    player2:setStorageValue(configs_arena.storage1, addEvent(stop_arena, (5 * 60 * 1000), uid2))

    player1:removeCondition(CONDITION_INFIGHT)
    player2:removeCondition(CONDITION_INFIGHT)

    player1:addHealth(player1:getMaxHealth())
    player2:addHealth(player2:getMaxHealth())

    player1:teleportTo(configs_arena.pos_dest_player1)
    player2:teleportTo(configs_arena.pos_dest_player2)

    Game.setStorageValue(configs_arena.global_storage, 1)

    player1:say("Fight!", TALKTYPE_MONSTER_SAY)
    player2:say("Fight!", TALKTYPE_MONSTER_SAY)

    return true
end

data/global.lua.

-- Arena Pvp.
dofile('data/lib/pvparena.lua')

Esses scripts foram originalmente desenvolvidos para o TFS 0.4 e adaptados por mim para funcionar no TFS 1.x. Eles foram testados e funcionam perfeitamente, sem problemas. Esses scripts são destinados ao uso na arena PvP, e é isso.

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Underewar
      https://www.eternalglobal.online/
      Server Features
      Protocol 8.60 and 12.30 Features (working 100%) Bestiary -> Janela  Em Contrução para Client 8.60 ja funcional no servidor. Charm -> Janela Em Contrução para Client 8.60 ja funcional no servidor. Store -> Janela  Em construção para CLIENT 8.60 Quickloot -> Janela  Em Contrução para Client 8.60 ja funcional no servidor. Cast system Wrap system  Custom spawns loading syste WarSystem RaidSystem Offline Trainers Sala de Trainers Stamina Refil Itens Donate Boosted Boss Boosted Creature 5 Eventos Automaticos.
      12x Updates

      NEW ITEMS
      Umbral Items ,Cobra Items,Falcon Items,Warzone Items,Gnome Item

       
      NEW AREAS

      Issavi


       
      Roshamuul

      Oramond

      Cobras

       
       
      Falcons



       
      Warzone 1,2,3


      Warzones 4,5,6


       
       

       

       
       
       
       
       
       
    • Por lordzetros
      Introdução
         Estive procurando no fórum e não encontrei esse sistema de TP para versões com modal, aliás, até achei um semelhante, só que possuía algumas instabilidades e também com uma ideia de waypoints (que estava também fazendo dessa forma, mas não vem ao caso o motivo disso não ser viável no Tibia). O que trago aqui é algo mais simples, porém o necessário.
         O sistema de TP é muito importante em alguns servidores que fogem um pouco de RPG (não que seja exclusivamente para estes), ele possibilita viagens de um local para outro em instantes, como por exemplo, do Templo para o Depot ou para qualquer outra localização configurada no script (a seu gosto). Uma coisa adicional que coloquei no script, foi de listar também a house do jogador que utilizar o comando, onde você poderá configurar se será necessário pagar ou não para o mesmo ser teleportado, enfim, dê uma olhada no código depois, tá tudo comentado.
       
      Informações do sistema
      - Locais configuráveis
      - Configurável se é necessário pagar ou não para determinado local
      - Configurável a quantidade de dinheiro de cada local
      - Condições ao utilizar o comando (Protect Zone e tempo para utilizar o comando novamente)
      - É requisitado o jogador está possuindo a quantia necessária para o teleport
       
      Instalação
       
      1 - crie um arquivo chamado teleportSystem.lua em data/talkactions/scripts/ e cole o código abaixo:
       
      2 - Em seguida, cole este trecho de código em data/talkactions/talkactions.xml abaixo de algum semelhante:
       

      3 - Agora crie um arquivo chamado modalTpSystem.lua em data/creaturescripts/scripts/ e cole o código abaixo nele:
       
      4 - E para finalizar, cole este código em data/creaturescripts/creaturescripts.xml abaixo de um semelhante:
       
       
      Explicação do script
      A única coisa que você vai mexer é no teleportSystem, onde terá a opção de configurar os preços, locais, etc.
      Configurando as houses:

      houses_modal = Se será habilitado o player teleportar para a house dele
      house_pago = Se será pago o teleport para a house
      house_custo = Custo do teleport para a house, caso seja pago

      Configurando o local:

      nome = Nome do local a ser mostrado na janela
      pago = Se ele vai ser pago ou não, coloque false caso queira que não cobre nada do jogador
      custo = Caso tenha colocado como pago, o custo do teleport para o local
      pos = Posição do local (X,Y,Z)
       
      Quando for adicionar outro, copie esta mesma parte acima e altera o número [3] para [4] e os outros dados também, assim por diante.
      O restante também tá explicado no script, basta ler.
       
      Demonstração
      UTILIZE O COMANDO !fly

       
      Enfim, script simples, tem para outras versões, mas como falei, não tinha encontrado ainda para 1.x com esse funcionamento. Qualquer coisa, só comentar, .
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo