Ir para conteúdo
  • 0

Teleport permitido apenas em certo SQM.


LbrS

Pergunta

Olá, tenho aqui um script de teleport por comando.

Funciona simplesmente da seguinte forma :
Você executa um comando + o lugar que quer ir (exemplo : "!teleport Cidade 1", e você é teleportado para o lugar escolhido.

Porém, tem restrições. No caso do meu código, você não pode teleportar se estiver durante estado de Battle, fora de Protection Zones, sem um certo item na bag e se não for premium.

Até aí tudo bem, consegui deixar da forma que eu desjava, mas tem uma coisa.
Quero que o comando só execute em certo SQM. Já tentei de diversas formas porém não consegui, e estou pedindo ajuda.

Aqui está o comando :

function onSay(cid, words, param)

local config = {
pz = true,
battle = true,
need_level = true,
premium = true,
need_Item = true, 
Item = 2010
}

local lugar = {
["Cidade 1"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 2"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 3"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 4"] ={ -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
}

if (param == "Lista") then
local str = ""
str = str .. "Ilhas disponíveis :\n\n"
for name, pos in pairs(lugar) do
str = str..name.."\n"

end

str = str .. ""
doShowTextDialog(cid, 6579, str)
return TRUE

end

local a = lugar[param]
if not(a) then 
doPlayerSendTextMessage(cid, 22, "Esta ilha não existe.")
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
return TRUE
elseif config.premium == true and isPremium(cid) == FALSE then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players Premium Accounts podem teleportar. Para comprar Premium Account acesse : \n www.???.com")
return TRUE
elseif config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você só pode teleportar dentro de Protection Zones. ")
return TRUE
elseif config.need_Item == true and getPlayerItemCount(cid,config.Item) < 1 then
doPlayerSendCancel(cid,"Você precisa da " .. getItemNameById(config.Item) .. " para teleportar para " .. param .. " Island.")
return TRUE
elseif config.battle == true and getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode teleportar durante o estado de battle.")
return TRUE
elseif config.need_level == true and getPlayerLevel(cid) < a.level then
doPlayerSendTextMessage(cid, 22, "Você não tem level suficiente. \n Você precisa ser Lv."..a.level.."+ para poder teleportar para " .. param .. " Island.")
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
return TRUE

end

doTeleportThing(cid, a.pos)
doSendMagicEffect(a.pos, CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, 22, " Você foi teleportado para \n " .. param .. ". Island.")

end

Para quem não entendeu, quero que o comando só teleporte caso você esteja encima de certo SQM. Caso contrário (else), ele envia uma mensagem :

"doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você não pode utilizar este comando fora do SQM correto.")"

Se alguém for resolver, na hora de colocar as coordenadas, pode por x,y e z = 0 , que depois eu configuro.

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

11 respostass a esta questão

Posts Recomendados

  • 0

tenta isso:

function onSay(cid, words, param)

local config = {
pz = true,
battle = true,
need_level = true,
premium = true,
need_Item = true, 
Item = 2010
}

local lugar = {
["Cidade 1"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 2"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 3"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 4"] ={ -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
}

if getPlayerPosition(cid,{x = 247, y = 662, z = 13}) then
if (param == "Lista") then
local str = ""
str = str .. "Ilhas disponíveis :\n\n"
for name, pos in pairs(lugar) do
str = str..name.."\n"

end

str = str .. ""
doShowTextDialog(cid, 6579, str)
return TRUE

end

local a = lugar[param]
if not(a) then 
doPlayerSendTextMessage(cid, 22, "Esta ilha não existe.")
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
return TRUE
elseif config.premium == true and isPremium(cid) == FALSE then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players Premium Accounts podem teleportar. Para comprar Premium Account acesse : \n www.???.com")
return TRUE
elseif config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você só pode teleportar dentro de Protection Zones. ")
return TRUE
elseif config.need_Item == true and getPlayerItemCount(cid,config.Item) < 1 then
doPlayerSendCancel(cid,"Você precisa da " .. getItemNameById(config.Item) .. " para teleportar para " .. param .. " Island.")
return TRUE
elseif config.battle == true and getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode teleportar durante o estado de battle.")
return TRUE
elseif config.need_level == true and getPlayerLevel(cid) < a.level then
doPlayerSendTextMessage(cid, 22, "Você não tem level suficiente. \n Você precisa ser Lv."..a.level.."+ para poder teleportar para " .. param .. " Island.")
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
return TRUE

end

doTeleportThing(cid, a.pos)
doSendMagicEffect(a.pos, CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, 22, " Você foi teleportado para \n " .. param .. ". Island.")
else
doPlayerSendCancel(cid, "Você precis estar no X piso para usar o comando.")
end
end

altera a pos ali no:

if getThingFromPos({x = 247, y = 662, z = 13}) then

Não testei, foi apenas uma suposição que ira pegar.

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

  • 0

Tenta assim, fiz rapidinho aqui, sono = raciocínio lento.

 

function onSay(cid, words, param)
 
local config = {
pz = true,
battle = true,
need_level = true,
premium = true,
need_Item = true, 
Item = 2010
}
 
local lugar = {
["Cidade 1"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 2"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 3"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 4"] ={ -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
}
 
local posis = {x = xxx, y = yyy, z = zzz}     --Posição que o jogador deverá ficar.
 
if (param == "Lista") then
local str = ""
str = str .. "Ilhas disponíveis :\n\n"
for name, pos in pairs(lugar) do
str = str..name.."\n"
 
end
 
str = str .. ""
doShowTextDialog(cid, 6579, str)
return TRUE
 
end
 
local a = lugar[param]
    if not(a) then 
        doPlayerSendTextMessage(cid, 22, "Esta ilha não existe.")
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return TRUE
    elseif config.premium == true and isPremium(cid) == FALSE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players Premium Accounts podem teleportar. Para comprar Premium Account acesse : \n www.???.com")
        return TRUE
    elseif config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você só pode teleportar dentro de Protection Zones. ")
        return TRUE
    elseif config.need_Item == true and getPlayerItemCount(cid,config.Item) < 1 then
        doPlayerSendCancel(cid,"Você precisa da " .. getItemNameById(config.Item) .. " para teleportar para " .. param .. " Island.")
        return TRUE
    elseif config.battle == true and getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode teleportar durante o estado de battle.")
        return TRUE
    elseif config.need_level == true and getPlayerLevel(cid) < a.level then
        doPlayerSendTextMessage(cid, 22, "Você não tem level suficiente. \n Você precisa ser Lv."..a.level.."+ para poder teleportar para " .. param .. " Island.")
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return TRUE
    elseif getThingPos(cid).x ~= posis.x or getThingPos(cid).y ~= posis.y or getThingPos(cid).z ~= posis.z then
        return doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode utilizar este comando fora do SQM correto.")
    end
 
doTeleportThing(cid, a.pos)
doSendMagicEffect(a.pos, CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, 22, " Você foi teleportado para \n " .. param .. ". Island.")
 
end
Link para o comentário
Compartilhar em outros sites

  • 0

O código do zipter98 funcionou !
Muito obrigado cara. Ontem estava tentando pelas minhas próprias mãos fazer isso, e vendo seu código funcionando percebi que por pouco eu não havia conseguido.

Aproveitando, zipter98 ou AnneMotta, vocês provavelmente entendem mais do que eu de .lua, então gostaria de fazer uma pergunta pra ampliar meu conhecimento.

Estes parâmetros como :

getCreatureCondition
getPlayerLevel
getThingPos (O que você utilizou para resolver minha dúvida)

Entre outros, vocês sabem de cabeça todos estes parâmetros ou tem alguma lista, algum lugar que eu possa descobrir essas coisas, para quando eu precisar ? Ontem eu estava tentando fazer e não consegui por não saber quando função/parâmetro utilizar ..

Obrigado !

obs.: Dei rep+ aos dois por terem tentado me ajudar / me ajudado.
Você curtiu isso -> AnneMotta.
Você curtiu isso -> Zipter98.

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

  • 0

 

Tenta assim, fiz rapidinho aqui, sono = raciocínio lento.

function onSay(cid, words, param)
 
local config = {
pz = true,
battle = true,
need_level = true,
premium = true,
need_Item = true, 
Item = 2010
}
 
local lugar = {
["Cidade 1"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 2"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 3"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 4"] ={ -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
}
 
local posis = {x = xxx, y = yyy, z = zzz}     --Posição que o jogador deverá ficar.
 
if (param == "Lista") then
local str = ""
str = str .. "Ilhas disponíveis :\n\n"
for name, pos in pairs(lugar) do
str = str..name.."\n"
 
end
 
str = str .. ""
doShowTextDialog(cid, 6579, str)
return TRUE
 
end
 
local a = lugar[param]
    if not(a) then 
        doPlayerSendTextMessage(cid, 22, "Esta ilha não existe.")
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return TRUE
    elseif config.premium == true and isPremium(cid) == FALSE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players Premium Accounts podem teleportar. Para comprar Premium Account acesse : \n www.???.com")
        return TRUE
    elseif config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você só pode teleportar dentro de Protection Zones. ")
        return TRUE
    elseif config.need_Item == true and getPlayerItemCount(cid,config.Item) < 1 then
        doPlayerSendCancel(cid,"Você precisa da " .. getItemNameById(config.Item) .. " para teleportar para " .. param .. " Island.")
        return TRUE
    elseif config.battle == true and getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode teleportar durante o estado de battle.")
        return TRUE
    elseif config.need_level == true and getPlayerLevel(cid) < a.level then
        doPlayerSendTextMessage(cid, 22, "Você não tem level suficiente. \n Você precisa ser Lv."..a.level.."+ para poder teleportar para " .. param .. " Island.")
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return TRUE
    elseif getThingPos(cid).x ~= posis.x or getThingPos(cid).y ~= posis.y or getThingPos(cid).z ~= posis.z then
        return doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode utilizar este comando fora do SQM correto.")
    end
 
doTeleportThing(cid, a.pos)
doSendMagicEffect(a.pos, CONST_ME_TELEPORT)
doPlayerSendTextMessage(cid, 22, " Você foi teleportado para \n " .. param .. ". Island.")
 
end

uhum

Link para o comentário
Compartilhar em outros sites

  • 0

amoeba13, Muito obrigado cara, era exatamente isso que eu precisava !

zipter98, Seu código funcionou perfeitamente, porém, eu gostaria de saber como faço para que eu possa adicionar mais SQM's além de apenas um, em que possa utilizar o comando e teleportar. Eu tentei de 3 formas, porém nenhuma funcionou.

Segue aí como eu tentei :

local posis = {x = xxx, y = yyy, z = zzz} and {x = xxx2, y = yyy2, z = zzz2}

Não deu certo, eu pensei que fosse por estar o "and" nessa lógica, então tentei :

local posis = {x = xxx, y = yyy, z = zzz} or {x = xxx2, y = yyy2, z = zzz2}

Também não deu certo, então me espelhei em outra parte do código e tentei :

local posis = {
pos = {x = xxx, y = yyy, z = zzz},
pos = {x = xxx2, y = yyy2, z = zzz2}
}

Nenhuma das minhas tentativas funcionou. Tem como me ajudar ?
Obrigado !

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

  • 0

Tem sim uma maneira (que eu acabei de encontrar). Porém, ela é um pouco mais confusa de configurar. Vou tentar explicar:

para cada posição, terá uma variável.

Por exemplo, 3 posições:

local pos_one = {x = 1056, y = 1056, z = 7}
                local pos_two = {x = 1056, y = 1057, z = 7}
                local pos_three = {x = 1056, y = 1058, z = 7}
Terá uma variável que irá, digamos assim, "checar" a posição do jogador. Valor inicial desta é 0.
local check = 0
Assim, para cada posição, você fará uma verificação de posição. E, a cada posição "errada", o valor de check será aumentado em 1.
Como são 3 posições, serão 3 verificações.
if getThingPos(cid).x ~= pos_one.x or getThingPos(cid).y ~= pos_one.y or getThingPos(cid).z ~= pos_one.z then   --Primeira verificação, da primeira posição (pos_one).
            check = check + 1    --Se a posição do jogador for diferente da posição configurada em pos_one, check terá seu valor aumentado em 1 (ficando 1).
        end
        
        if check == 1 then    --Se o valor de check for 1 (ou seja, a posição do jogador for diferente de pos_one), ocorrerá essa segunda verificação.
            if getThingPos(cid).x ~= pos_two.x or getThingPos(cid).y ~= pos_two.y or getThingPos(cid).z ~= pos_two.z then   --Segunda verificação, da segunda posição (pos_two).
                check = check + 1    --Se a posição do jogador for diferente da posição configurada em pos_two, check terá seu valor aumentado em 1 (ficando 2).
            end
        end
        
        if check == 2 then   --Se o valor de check for 2 (ou seja, a posição do jogador for diferente de pos_one e pos_two), ocorrerá a terceira verificação. 
            if getThingPos(cid).x ~= pos_three.x or getThingPos(cid).y ~= pos_three.y or getThingPos(cid).z ~= pos_three.z then   --Terceira verificação, da terceira posição (pos_three).
                return doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode utilizar este comando fora do SQM correto.")   --Se a posição do jogador for diferente da posição configurada em pos_three (a terceira e última), será enviada essa mensagem à ele (já que a posição do mesmo é diferente da de pos_one, pos_two e pos_three).
            end
        end

Seu código poderia, então, ficar assim:

 

 

 

function onSay(cid, words, param)
 
local config = {
    pz = true,
    battle = true,
    need_level = true,
    premium = true,
    need_Item = true, 
    Item = 2010
}
 
local lugar = {
["Cidade 1"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 2"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 3"] = { -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
["Cidade 4"] ={ -- nome do lugar
pos = {x=1090, y=1236, z=7},level = 8},
}
 
--Posições.
local pos_one = {x = 1056, y = 1056, z = 7}    
local pos_two = {x = 1056, y = 1057, z = 7}
local pos_three = {x = 1056, y = 1058, z = 7}
 
--Variável que irá "verificar" a posição do jogador.
local check = 0
 
    if (param == "Lista") then
        local str = ""
        str = str .. "Ilhas disponíveis :\n\n"
        for name, pos in pairs(lugar) do
            str = str..name.."\n"
        end
 
        str = str .. ""
        doShowTextDialog(cid, 6579, str)
        return TRUE
    end
 
local a = lugar[param]
 
    if getThingPos(cid).x ~= pos_one.x or getThingPos(cid).y ~= pos_one.y or getThingPos(cid).z ~= pos_one.z then   --Primeira verificação, da primeira posição (pos_one).
        check = check + 1    --Se a posição do jogador for diferente da posição configurada em pos_one, check terá seu valor aumentado em 1 (ficando 1).
    end
        
    if check == 1 then    --Se o valor de check for 1 (ou seja, a posição do jogador for diferente de pos_one), ocorrerá essa segunda verificação.
        if getThingPos(cid).x ~= pos_two.x or getThingPos(cid).y ~= pos_two.y or getThingPos(cid).z ~= pos_two.z then   --Segunda verificação, da segunda posição (pos_two).
            check = check + 1    --Se a posição do jogador for diferente da posição configurada em pos_two, check terá seu valor aumentado em 1 (ficando 2).
        end
    end
        
    if check == 2 then   --Se o valor de check for 2 (ou seja, a posição do jogador for diferente de pos_one e pos_two), ocorrerá a terceira verificação. 
        if getThingPos(cid).x ~= pos_three.x or getThingPos(cid).y ~= pos_three.y or getThingPos(cid).z ~= pos_three.z then   --Terceira verificação, da terceira posição (pos_three).
            return doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode utilizar este comando fora do SQM correto.")   --Se a posição do jogador for diferente da posição configurada em pos_three (a terceira e última), será enviada essa mensagem à ele (já que a posição do mesmo é diferente da de pos_one, pos_two e pos_three).
        end
    end
    
    if not(a) then 
        doPlayerSendTextMessage(cid, 22, "Esta ilha não existe.")
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return TRUE
    elseif config.premium == true and isPremium(cid) == FALSE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players Premium Accounts podem teleportar. Para comprar Premium Account acesse : \n www.???.com")
        return TRUE
    elseif config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Você só pode teleportar dentro de Protection Zones. ")
        return TRUE
    elseif config.need_Item == true and getPlayerItemCount(cid,config.Item) < 1 then
        doPlayerSendCancel(cid,"Você precisa da " .. getItemNameById(config.Item) .. " para teleportar para " .. param .. " Island.")
        return TRUE
    elseif config.battle == true and getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE then
        doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você não pode teleportar durante o estado de battle.")
        return TRUE
    elseif config.need_level == true and getPlayerLevel(cid) < a.level then
        doPlayerSendTextMessage(cid, 22, "Você não tem level suficiente. \n Você precisa ser Lv."..a.level.."+ para poder teleportar para " .. param .. " Island.")
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return TRUE
    end
 
    doTeleportThing(cid, a.pos)
    doSendMagicEffect(a.pos, CONST_ME_TELEPORT)
    doPlayerSendTextMessage(cid, 22, " Você foi teleportado para \n " .. param .. ". Island.")
 
end

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

  • 0

zipter98, Funcionou perfeitamente! Consegui entender sua lógica, e devo dizer que ela foi muito inteligente. Pode ficar tranquilo que conseguirei configurar novas posições "permitidas". Entendi perfeitamente o código. OBRIGADO, você é muito bom cara :)

Dúvida sanada, pode mover o tópico.

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

×
×
  • Criar Novo...