Ir para conteúdo

Featured Replies

Postado

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.

  • Respostas 35
  • Visualizações 2.1k
  • Created
  • Última resposta

Top Posters In This Topic

Most 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

  • 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 == to

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

Postado
  • Autor

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>

Postado

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

Postado

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)

Postado
  • Autor

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>

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.7k

Informação Importante

Confirmação de Termo