Postado Dezembro 10, 2023 1 ano 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
Postado Dezembro 11, 2023 1 ano Autor 21 horas atrás, Underewar disse: Como o player entra na arena ? Tem um actionid pra teleporta o player, seria uma statua Clika na statua e entra na arena
Postado Dezembro 13, 2023 1 ano 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 Dezembro 13, 2023 1 ano 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.