Ir para conteúdo
  • Cadastre-se

(Resolvido)Arena Que Só Pode Haver Um Player Por Vez. Ajude-me e Torne Meu Projeto Mais Perto De Ser Inaugurado


Ir para solução Resolvido por Wise,

Posts Recomendados

Seguinte, remova todos os scripts relacionados a essa sua arena, pra evitar possíveis erros. Remova também o monstro da arena pelo RME, não vai ser necessário.

Adicione esse script ao arquivo da sua alavanca (action script):

-- Coded by Suicide
local tab = {
    boss = "Infernatil", -- "Monster Name"
    storages = {27771, 27772}, -- {globalstorage, storage}
    apos = {x=1882, y=2080, z=14}, -- pos x, y, z que o player será teleportado ao puxar a alavanca
    rangex = {x=123, y=456, z=7}, -- pos x, y, z do sqm do canto superior da área (total)
    rangey = {x=321, y=654, z=7}, -- pos x, y, z do sqm do canto inferior da área (total)
    atime = 10 -- tempo máximo de permanência na arena, em minutos
}

-- xWhiteWolfs functions \/
function isOnSameFloor(fromPos, toPos)
    return fromPos.z == toPos.z and true or false
end


function isEven(arg)
    return arg % 2 == 0 and true or false
end

function getMiddlePos(fromPos, toPos)
    if not isOnSameFloor(fromPos, toPos) then
        return false
    end
    
    local middle = {x = 0, y = 0, z = 0}    
        middle.x = isEven(fromPos.x + toPos.x) and (fromPos.x + toPos.x)/2 or math.floor((fromPos.x + toPos.x)/2) + 1
        middle.y = isEven(fromPos.y + toPos.y) and (fromPos.y + toPos.y)/2 or math.floor((fromPos.y + toPos.y)/2) + 1
        middle.z = fromPos.z or toPos.z
    return middle
end

function clearArea(middlePos, rangex, rangey, mob, player)
    for i = -rangex, rangex do
        for j = -rangey, rangey do
            pos = {x = middlePos.x + i, y = middlePos.y + j, z = middlePos.z}
            creature = getTopCreature(pos).uid
        
            if isMonster(creature) and mob then
                doSendMagicEffect(getThingPos(creature), 14)
                addEvent(doCreateMonster, 1000, tab.boss, pos)
                doRemoveCreature(creature)
            end
            
            if isPlayer(creature) and player then
                doSendMagicEffect(getThingPos(creature), 14)
                doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)))
            end
        end
    end
    
    return true
end

function getDistanceRadius(fromPos, toPos)
    if not isOnSameFloor(fromPos, toPos) then
        return false
    end
    
    local distance = getDistanceBetween(fromPos, toPos)
    return isEven(distance) and (distance/2) or math.floor(distance/2) + 1
end
-- xWhiteWolfs functions /\

function onUse(cid, item, frompos, item2, topos)
    if getGlobalStorageValue(tab.storage[1]) - os.time() < 1 then
        setGlobalStorageValue(tab.storages[1], os.time() + (tab.atime * 60))
        setPlayerStorageValue(cid, tab.storages[2], 1)
        local rx = getDistanceRadius(tab.rangex, tab.rangey)
        addEvent(clearArea, 1000, getMiddlePos(tab.rangex, tab.rangey), rx, rx, true, false)
        doTeleportThing(cid, tab.apos)
        doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "E que comece o desafio!!")
    else
        doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Há alguém fazendo a Quest.")
    end
    
    return true
end



 

Apenas substitua o que continha no meu outro script dos creature events, por esse script:

-- Coded by Suicide
local tab = {
	storages = {27771, 27772, 27773}, -- {globalstorage, storage}
	boss = "Infernatil", -- "Monster Name"
	roompos = {x=123, y=456, z=7}, -- pos x, y, z da sala da recompensa que o player será teleportado
	msgs = {"Você sobreviveu ao BOSS, agora pegue a recompensa.", "Você sobreviveu mais uma vez, porém não vai receber outra recompensa.", "O tempo para matar o BOSS se esgotou, tente novamente."} -- menssagens {"nunca matou o boss antes", "já matou o boss antes", "esgotou o tempo de permanência"}
}

function onKill(cid, target, lastHit)
	if getCreatureName(target) == tab.boss and getPlayerStorageValue(cid, tab.storages[2]) > 0 then
		if getPlayerStorageValue(cid, tab.storages[3]) < 1 then
			setGlobalStorageValue(tab.storages[1], -1)
			setPlayerStorageValue(cid, tab.storages[2], -1)
			setPlayerStorageValue(cid, tab.storages[3], 1)
			doTeleportThing(cid, tab.roompos)
			doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[1])
		else
			setGlobalStorageValue(tab.storages[1], -1)
			setPlayerStorageValue(cid, tab.storages[2], -1)
			doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
			doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
			doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[2])
		end
	end
	return true
end

function onThink(cid)
	if getGlobalStorageValue(tab.storages[1]) - os.time() < 1 and getPlayerStorageValue(cid, tab.storages[2]) > 0 then
		setGlobalStorageValue(tab.storages[1], -1)
		setPlayerStorageValue(cid, tab.storages[2], -1)
		doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
		doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
		doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[3])
	end
	
	return true
end

function onDeath(cid)
	if getPlayerStorageValue(cid, tab.storages[2]) > 0 then
		setGlobalStorageValue(tab.storages[1], -1)
		setPlayerStorageValue(cid, tab.storages[2], -1)
	end
	
	return true
end

function onLogout(cid)
	if getPlayerStorageValue(cid, tab.storages[2]) > 0 then
		setGlobalStorageValue(tab.storages[1], -1)
		setPlayerStorageValue(cid, tab.storages[2], -1)
		doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
	end
	
	return true
end




Adicione as tags - creaturescripts.xml (data/creaturescripts):

<event type="think" name="ArenaTime" script="survivalarena.lua"/>
<event type="kill" name="ArenaKill" script="survivalarena.lua"/>
<event type="death" name="ArenaDeath" script="survivalarena.lua"/>
<event type="logout" name="ArenaLogout" script="survivalarena.lua"/>




E não se esqueça dos registros dos creature events em login.lua (data/creaturescripts/scripts):

registerCreatureEvent(cid, "ArenaTime")
registerCreatureEvent(cid, "ArenaKill")
registerCreatureEvent(cid, "ArenaDeath")



 

Enquanto a configuração da tabela da action script (rangex/rangey), faça como o exemplo (totalmente desproporcional que eu "desenhei"):
rangex -- pos do sqm do canto superior da arena;
rangey -- pos do sqm do canto inferior da arena.

sqm_positions.png



Agradecimentos ao meu professor e grande amigo, xWhiteWolf, pelas 5 funções dele que usei num dos scripts.
Não testei, mas tudo coincide. Espero que ajude.

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

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites
  • Respostas 35
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

Seguinte, remova todos os scripts relacionados a essa sua arena, pra evitar possíveis erros. Remova também o monstro da arena pelo RME, não vai ser necessário. Adicione esse script ao arquivo da sua alavanca (action script): -- Coded by Suicide local tab = {     boss = "Infernatil", -- "Monster Name"     storages = {27771, 27772}, -- {globalstorage, storage}     apos = {x=1882, y=2080, z=14}, -- pos x, y, z que o player será teleportado ao puxar a alavanca     rangex = {x=123, y=456, z=7}, -

falha minha, aqui estão as funções que faltavam: só colocar elas no começo do script logo abaixo da tabela que deve funcionar perfeito function isOnSameFloor(fromPos, toPos) return fromPos.z == toPos.z and true or false end function isEven(arg) return arg % 2 == 0 and true or false end Edit: essas funções fazem parte de uma lib nova que to fazendo pra postar em breve, não era pra elas terem vazado tão cedo e por isso não tão da maneira correta como deveriam mas em todo caso eu confio no e

data/creaturescripts/scripts/Login.lua   tente adicionar isso antes do ultimo return true       if getGlobalStorageValue(cid, 55554) == 1 then         setGlobalStorageValue(cid, 55554, -1)     end

valeu suicide, daqui a pouco vo testar aqui e já posto o que deu. de qualquer forma toma um rep + ai pela colaboração e pelo trabalho que você teve.


ta dando o seguinte erro:

 

data/creaturescripts/scripts:survivalarena.lua:onThink

Description

data/creaturescripts/scripts/survivalarena.lua:30: attempt to inde x field 'storages'  <a nil value>

Link para o post
Compartilhar em outros sites

Faltou um "S" suicide.

Substitua o que está dentro do suvivalarena.lua no creaturescripts por isso:

-- Coded by Suicide
local tab = {
storages = {27771, 27772, 27773}, -- {globalstorage, storage}
boss = "Infernatil", -- "Monster Name"
roompos = {x=123, y=456, z=7}, -- pos x, y, z da sala da recompensa que o player será teleportado
msgs = {"Você sobreviveu ao BOSS, agora pegue a recompensa.", "Você sobreviveu mais uma vez, porém não vai receber outra recompensa.", "O tempo para matar o BOSS se esgotou, tente novamente."} -- menssagens {"nunca matou o boss antes", "já matou o boss antes", "esgotou o tempo de permanência"}
}
 
function onKill(cid, target, lastHit)
if getCreatureName(target) == tab.boss and getPlayerStorageValue(cid, tab.storages[2]) > 0 then
if getPlayerStorageValue(cid, tab.storages[3]) < 1 then
setGlobalStorageValue(tab.storages[1], -1)
setPlayerStorageValue(cid, tab.storages[2], -1)
setPlayerStorageValue(cid, tab.storages[3], 1)
doTeleportThing(cid, tab.roompos)
doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[1])
else
setGlobalStorageValue(tab.storages[1], -1)
setPlayerStorageValue(cid, tab.storages[2], -1)
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[2])
end
end
return true
end
 
function onThink(cid)
if getGlobalStorageValue(tab.storages[1]) - os.time() < 1 and getPlayerStorageValue(cid, tab.storages[2]) > 0 then
setGlobalStorageValue(tab.storages[1], -1)
setPlayerStorageValue(cid, tab.storages[2], -1)
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, tab.msgs[3])
end
 
return true
end
 
function onDeath(cid)
if getPlayerStorageValue(cid, tab.storages[2]) > 0 then
setGlobalStorageValue(tab.storages[1], -1)
setPlayerStorageValue(cid, tab.storages[2], -1)
end
 
return true
end
 
function onLogout(cid)
if getPlayerStorageValue(cid, tab.storages[2]) > 0 then
setGlobalStorageValue(tab.storages[1], -1)
setPlayerStorageValue(cid, tab.storages[2], -1)
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
end
 
return true
end

Não se esqueça de dar REP+ para quem te ajudou e caso seja a solução marcar como melhor resposta!

 

NÃO CLIQUE AQUI!

NEM AQUI!

________________________________________________________________________________________________________________________________________________________________________________________________________________________

 

A imaginação é mais importante que o conhecimento.” Albert Einstein

Link para o post
Compartilhar em outros sites

na linha 30 tá escrito tab.storage[1] e o correto é tab.storages[1], só isso.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

agora ta dando esses dois outros erros ao puxar a alavanca. 

 

data/actions/scripts:s/arena.lua:onUse

Description

data/actions/scripts:s/arena.lua:47: attempt to call global 'isOnSameFloor' <a nil value>

stack traceback:

data/actions/scripts:s/arena.lua:47: in function 'getDistanceRadius'

 

 

 

 

data/actions/scripts:s/arena.lua:60: in function <data/actions/scripts:s/arena.lua:56>
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 10victory10
      Ola amigos! Bem... eu tou com um grave problema no meu Arena Svargrond Quest!
       
      Obs.: Não vou sacanear quem me ajudar! Eu logarei todos os dias pra reputa-lo até alcançar os 15 dias!
       
       - O problema é que eu até consigo comprar a permissão pelo NPC Halvar e passo pela porta, mas quando entro no teleport de Action ID: 42300 o personagem apenas fica em cima do teleport e aparece a seguinte mensagem de erro no distro:
       

       
       Obs.: Se eu sumonar uma das criaturas da primeira room da arena eu consigo fazer toda a quest, pegar o prêmio e o goblet!
       
       - Ou seja, o problema está apenas no teleport de Action ID: 42300 (Teleport responsável para iniciar a arena).
       
      - E como o erro aponta para o arquivo arenaroom.lua lá vai ele:
       



       
      |
      |
      '--> Distro: TFS 0.3.7.0. [9.60].
       
       
       - Eu já chequei e os 3 teleports para iniciar a arena estão com o Action ID: 42300! O que pode ser então?
  • Estatísticas dos Fóruns

    96846
    Tópicos
    519603
    Posts



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo