Ir para conteúdo
  • 0

[PEDIDO] Arrumar script de quest


jvcasarin

Pergunta

Bom gente, eu vi aqui na internet um script que, quando você matar X monster, abrirá um portal em certa posição, que levará a tal lugar, e o teleport durará X tempo.

 

Bom, eu gostaria de saber, se tem como adaptar o script, para precisar matar X quantidade de X monsters para abrir o portal entenderam?

 

Ai vai o script da quest:

tpmonster.lua

 

 

local tpId = 1387
local tps = {
["Orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30},
}

function removeTp(tp)
local t = getTileItemById(tp.pos, tpId)
if t then
doRemoveItem(t.uid, 1)
doSendMagicEffect(tp.pos, CONST_ME_POFF)
end
end

function onDeath(cid)
local tp = tps[getCreatureName(cid)]
if tp then
doCreateTeleport(tpId, tp.toPos, tp.pos)
doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
addEvent(removeTp, tp.time*1000, tp)
end
return TRUE
end

 

 

 

Vermelho - Monstro

Azul - Local em que o TP aparece na quest

Verde Escuro - Local onde o TP vai te teleportar

Roxo - Tempo em segundos que o TP fica aberto

Verde Claro - ID do TP no RME

Creaturescripts.xml

 

 

<event type="death" name="MonsterQuest" event="script" value="tpmonster.lua"/>

Tag do evento no monster:

 

<script>

<event name="MonsterQuest"/>
</script>

Créditos pelo script:

TonyHalk

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

 

local tpId = 1387
local tp = {
    info = {
        pos = {x = 761, y = 57, z = 7},
        toPos = {x = 767, y = 52, z = 7},
        time = 30,
    },
    kill = {
        ["Hell's Knight"] = {count = 2, str = 10629},
        ["Lok"] = {count = 1, str = 10630},
    },
}
 
function checkTask()
    for name, info in pairs(tp.kill) do
        if getGlobalStorageValue(info.str) < info.count then
            return false
        end
    end
    return true
end
 
function removeTp(tp)
    local t = getTileItemById(tp.info.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.info.pos, CONST_ME_POFF)
    end
end
 
function onDeath(cid)
    local m = tp.kill[getCreatureName(cid)]
    if not tp then
        return true
    end
    setGlobalStorageValue(m.str, getGlobalStorageValue(m.str) < 0 and 1 or getGlobalStorageValue(m.str) + 1)
    if checkTask() then
        doCreateTeleport(tpId, tp.info.toPos, tp.info.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.info.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.info.time * 1000, tp)
        for _, info in pairs(tp.kill) do
            setGlobalStorageValue(info.str, -1)
        end
    end
    return true
end
Link para o comentário
Compartilhar em outros sites

  • 0

Não sei se vai funcionar.

local tpId = 1387
local tps = {
    ["Orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid)]
    local x = 5 -- qtd de monstros que tem que matar.
    if tp >= x then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time*1000, tp)
    end
    return TRUE
end
Editado por Fawz
Link para o comentário
Compartilhar em outros sites

  • 0

 

Não sei se vai funcionar.

local tpId = 1387
local tps = {
    ["Orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid)]
    local x = 5 -- qtd de monstros que tem que matar.
    if tp >= x then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time*1000, tp)
    end
    return TRUE
end

 

Espero que você esteja aberto a críticas construtivas, Fawz:

  • Um possível bug fácil de evitar é que existe variação nos servidores do nome começar com letra maiúscula ou não. O ideal é orientar o usuário a colocar todos os nomes em letras minúsculas e usar getCreatureName(cid):lower() que converte a string para letras minúsculas, facilitando a comparação
  • Quando você faz tp >= x vai dar problema, porque tp é uma tabela e não pode ser comparado dessa forma com um número. Você precisa criar alguma forma de contagem e depois resetá-la quando o contador chegar em x. Aconselho usar global storage (getGlobalStorageValue(str) e setGlobalStorageValue(str, num))
  • Por último e menos importante, true possui valor verdadeiro padrão em Lua, enquanto TRUE surgiu de algum lugar nos scripts e parece mais legal, então usam porque tem uma gambiarra que faz com que funcione. Moral da história: utilize true em vez de TRUE.
Link para o comentário
Compartilhar em outros sites

  • 0

 

Não sei se vai funcionar.

local tpId = 1387
local tps = {
    ["Orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid)]
    local x = 5 -- qtd de monstros que tem que matar.
    if tp >= x then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time*1000, tp)
    end
    return TRUE
end

 

 

Vlw a tentativa, mas ao matar o monstro pela primeira vez, apareceu o seguinte erro no distrô TFS 0.4:

 

[2:21:32.958] [Error - CreatureScript Interface]

[2:21:32.959] data/creaturescripts/scripts/tpmonster.lua:onDeath
[2:21:32.959] Description:
[2:21:32.960] data/creaturescripts/scripts/tpmonster.lua:17: attempt to compare number with table
[2:21:32.960] stack traceback:
[2:21:32.961] data/creaturescripts/scripts/tpmonster.lua:17: in function <data/creaturescripts/scripts/tpmonster.lua:14>

 

 

Quando eu mato pela segunda vez, não acontece nada, obvio... Se você conseguir consertar, se puder, adicionar uma configuração para matar tipo, 2 demon e 2 dragon, ou sla, algo assim tendeu?

 

Obg.

 

 

 

 

Edit:

 

 

Espero que você esteja aberto a críticas construtivas, Fawz:

  • Um possível bug fácil de evitar é que existe variação nos servidores do nome começar com letra maiúscula ou não. O ideal é orientar o usuário a colocar todos os nomes em letras minúsculas e usar getCreatureName(cid):lower() que converte a string para letras minúsculas, facilitando a comparação
  • Quando você faz tp >= x vai dar problema, porque tp é uma tabela e não pode ser comparado dessa forma com um número. Você precisa criar alguma forma de contagem e depois resetá-la quando o contador chegar em x. Aconselho usar global storage (getGlobalStorageValue(str) e setGlobalStorageValue(str, num))
  • Por último e menos importante, true possui valor verdadeiro padrão em Lua, enquanto TRUE surgiu de algum lugar nos scripts e parece mais legal, então usam porque tem uma gambiarra que faz com que funcione. Moral da história: utilize true em vez de TRUE.

 

 

Cara, você poderia ajudar? hehehe eu achei muito útil esse script.

 

Editado por jvcasarin
Link para o comentário
Compartilhar em outros sites

  • 0

Tentei aqui, mas não testei:

 

 

local tpId = 1387
local tps = {
	--[[ 
	["nome do monstro (letras minúsculas)"] = {pos = {posição da criação do tp}, 
		toPos = {para onde o tp irá levar}, time = tempo para o tp sumir, 
		killAmount = quantos montros deve matar, str = número aleatório para storage}	]]
    ["orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30, killAmount = 5, str = 10629},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid):lower()]
	if not tp then
		return true
	end
    if getGlobalStorageValue(tp.str) + 1 >= tp.killAmount then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time * 1000, tp)
		setGlobalStorageValue(tp.str, -1)
    end
    return true
end

 

 

Só fiz algumas alterações no script do Fawz.

Link para o comentário
Compartilhar em outros sites

  • 0

Tentei aqui, mas não testei:

 

 

local tpId = 1387
local tps = {
	--[[ 
	["nome do monstro (letras minúsculas)"] = {pos = {posição da criação do tp}, 
		toPos = {para onde o tp irá levar}, time = tempo para o tp sumir, 
		killAmount = quantos montros deve matar, str = número aleatório para storage}	]]
    ["orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30, killAmount = 5, str = 10629},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid):lower()]
	if not tp then
		return true
	end
    if getGlobalStorageValue(tp.str) + 1 >= tp.killAmount then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time * 1000, tp)
		setGlobalStorageValue(tp.str, -1)
    end
    return true
end

 

 

Só fiz algumas alterações no script do Fawz.

 

Cara, não apareceu nenhum erro no distrô, porém, quando eu matei os monsters, não apareceu o teleport.

 

Eu gostaria de saber como tira a função de "letras minúsculas", e como eu ativo a opção de monsters diferentes e X quantidade de CADA um deles.

Link para o comentário
Compartilhar em outros sites

  • 0

É, esqueci de um 'pequeno' detalhe fundamental

 

 

local tpId = 1387
local tps = {
	--[[ 
	["nome do monstro (letras minúsculas)"] = {pos = {posição da criação do tp}, 
		toPos = {para onde o tp irá levar}, time = tempo para o tp sumir, 
		killAmount = quantos montros deve matar, str = número aleatório para storage}	]]
    ["orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30, killAmount = 5, str = 10629},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid):lower()]
	if not tp then
		return true
	end
    if getGlobalStorageValue(tp.str) + 2 >= tp.killAmount then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time * 1000, tp)
		setGlobalStorageValue(tp.str, -1)
	else
		setGlobalStorageValue(tp.str, getGlobalStorageValue(tp.str) + 1)
    end
    return true
end 

 

 

Engraçado que minha identação tá saindo destorcida...

Link para o comentário
Compartilhar em outros sites

  • 0

É, esqueci de um 'pequeno' detalhe fundamental

 

 

local tpId = 1387
local tps = {
	--[[ 
	["nome do monstro (letras minúsculas)"] = {pos = {posição da criação do tp}, 
		toPos = {para onde o tp irá levar}, time = tempo para o tp sumir, 
		killAmount = quantos montros deve matar, str = número aleatório para storage}	]]
    ["orshabaal"] = {pos = {x=761, y=57, z=7}, toPos = {x=767, y=52, z=7}, time = 30, killAmount = 5, str = 10629},
}

function removeTp(tp)
    local t = getTileItemById(tp.pos, tpId)
    if t then
        doRemoveItem(t.uid, 1)
        doSendMagicEffect(tp.pos, CONST_ME_POFF)
    end
end

function onDeath(cid)
    local tp = tps[getCreatureName(cid):lower()]
	if not tp then
		return true
	end
    if getGlobalStorageValue(tp.str) + 2 >= tp.killAmount then
        doCreateTeleport(tpId, tp.toPos, tp.pos)
        doCreatureSay(cid, "O teleport irá sumir em "..tp.time.." segundos.", TALKTYPE_ORANGE_1)
        addEvent(removeTp, tp.time * 1000, tp)
		setGlobalStorageValue(tp.str, -1)
	else
		setGlobalStorageValue(tp.str, getGlobalStorageValue(tp.str) + 1)
    end
    return true
end 

 

 

Engraçado que minha identação tá saindo destorcida...

 

Funcionou, porém eu queria saber como ativar a função de precisar matar tipo, 3 hydras e 2 demons pra abrir o portal.

 

Se matar 2 ou menos hydras e 2 demons, n funciona

Se matar 1 demon e 3 hydras n funciona tbm, e assim por diante entendeu?

 

Mas ta funcionando com 1 tipo de monstro!

 

Ah, como desativa essa função de letra minuscula?

@Omega

 

Você poderia fazer isso? Eu gostaria de tipo, pra liberar o portal, precisar matar 2 Hell's Knight e 1 Lok...

 

Por favor, quero muito fazer uma quest.... Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Só um porém, usando globalStorage, se outro player matar 2 bichos e precisar de 3, você irá matar 1 e liberar o portal.

Seria isso?

Ou cada player teria que matar uma quantidade x para liberar o portal?

Link para o comentário
Compartilhar em outros sites

  • 0

Nnn, a quest pode ser feita com mais players, não faz mal isso ai!

 

 

Edit:

Só um porém, usando globalStorage, se outro player matar 2 bichos e precisar de 3, você irá matar 1 e liberar o portal.

Seria isso?

Ou cada player teria que matar uma quantidade x para liberar o portal?

 

 

Se eu trocar por playerStorage, vai funcionar ou vai ser acusado algum erro?

 

 

Edit 2:

 

@zipter98

 

Funcionou perfeitamente, só que o que o Bruno disse, eu percebi que é verdade mesmo... Qualquer player faria... É só pedir pra algum player blockar a quest e ja era -'-

Editado por jvcasarin
Link para o comentário
Compartilhar em outros sites

  • 0

Mesmo se a task fosse individual, assim que algum jogador a completasse, o teleporte seria aberto. Daria na mesma, praticamente.

 

Verdade! Obrigado cara!

 

Se você puder, me ajuda no meu tópico do Zombie System!

 

http://www.xtibia.com/forum/topic/235745-ajuda-erro-zombie-system/

 

Estou com alguns erros...

 

Obrigado desde ja!

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...