Ir para conteúdo
  • Cadastre-se

[003] - Actions - Manuseando Parâmetros


Posts Recomendados

Boa Noite pessoal, dando continuidade a série de tutoriais hoje eu venho trazer mais alguns exemplos de como podemos trabalhar com os parâmetros (position, lastposition, from position e toposition) só que agora em uma action simples.

 

1° Eu Criei uma função para verificar uma área pré-determinada a procura de creatures, e salva-las em um array.

    function getCreatureInArea(pos, area)
        local centro = {}
        local uids = {}
 
        for y = 1, table.getn(area) do
            for x = 1, table.getn(area[y]) do
                if area[y][x] > 0 then
 
                    centro.x = math.floor(table.getn(area[y])/2)+1
                    centro.y = math.floor(table.getn(area) / 2 ) +1
                    local Cpos = { x = pos.x + x - centro.x, y = pos.y + y - centro.y, z = pos.z} 
                    if isCreature(getTopCreature(Cpos).uid) then
                        table.insert(uids, getTopCreature(Cpos).uid)
                    end
                end
            end
        end
        return uids
    end

Nessa função eu entro dentro de um array e transformo ele em posições in-game, checo cada uma a procura de creatures que e guardo seu UID dentro de um outro array, e retorno ele no final do script.

 

O Importante dentro dessa função é entender como eu transformo posições de um array em posições in-game, vamos analisar algumas coisas.

 

1° coisa é analisar a forma no qual o array é construído: 

local arr1 = { 
    {1, 1, 1}, 
    {1, 1, 1}, 
    {1, 1, 1}, 
}

Esse é um array simples, cada par de chaves "{ }", corresponde a um elemento dentro do array, e cada numero um valor.

 

2° Coisa a ser feita e analisarmos o código

Declaração do nome da função e seus parâmetros

function getCreatureInArea(pos, area)

Declaração do Array

        local centro = {}
        local uids = {}
 
Cria-se um Laço ( for ) com uma variável "y" inicializada no 1, depois obtêm a quantidade de elementos ( Ou grupos de chaves "{ }" ) Da nossa área com a função (  table.getn() )
 
for y = 1, table.getn(area) do
 
            Cria-se um Laço ( for ) com uma variável "x" inicializada no 1, depois obtêm a quantidade de valores dentro do nosso elemento ( 1, 1, 1 )  com a função (  table.getn() )
 
for x = 1, table.getn(area[y]) do
 
             Cria um check ( if ) entrando dentro da área usando os valores obtidos no x e y, e verificando se os valores dentro da nossa área são maiores que 0 ( Para caso queira construir uma área aonde algumas posições não sejam verificadas )
 
if area[y][x] > 0 then
[Exemplo de área aonde posições não seriam verificadas] :
 
local arr1 = { 
    {0, 1, 1, 1, 0}, 
    {1, 1, 1, 1, 1}, 
    {1, 1, 1, 1, 1}, 
    {0, 1, 1, 1, 0}, 
}
 
Define dentro de um novo atributo do array ( centro.x, centro.y ) e adiciona dentro dele a divisão exata ( Arredondado para baixo caso seja um numero quebrado ) da quantidade de elementos da nossa área, somando +1 no final
 
                    centro.x = math.floor(table.getn(area[y])/2)+1
                    centro.y = math.floor(table.getn(area) / 2 ) +1
 
[Observação] : Caso não tenha entendido esse calculo ele é simples, a função ( math.floor ) arredonda um numero para baixo, a função ( table.getn(area[y]) ) retorna a quantidade de valores dentro do nosso elemento
 
{1, 1, 1},
 
No total 3 valores, ai com o numero 3 ele divide por 2, 3 / 2 = 1.5, e some +1 ao resultado dessa divisão, 1.5 + 1 = 2.5, Lembrando que estamos usando a função math.floor e ela arredonda números quebrados para baixo 2.5 = 2
 
E o mesmo para o centro.y com uma diferença, ao invés de contarmos os valores dentro do elemento, contamos os próprios elementos ( table.getn(area) )
 
1 =    {1, 1, 1},
2 =     {1, 1, 1},
3 =     {1, 1, 1}, 
 
Que retorna o mesmo resultado "2".
 
Agora Vamos transformas nossa área em posições no mapa
 
local Cpos = { x = pos.x + x - centro.x, y = pos.y + y - centro.y, z = pos.z}
 
Primeiro criamos um array de posições ( {x = ?, y = ?, z = ? } ), depois preenchemos os valores com um simples calculo:
 
pos.x ( Essa é a posição de onde o item vai ser usado in-game ) + x ( Aquele x inicializado no for ) - centro.x ( Nosso calculo da soma e divisão dos valores dos elementos nas tabelas ), Bem, o x ( do for ) inicia em 1 , depois temos uma pos.x ( Posição in-game ) que assumiremos ser "1000", e nosso valor centro.x que sabemos ser 2.
( 1000  + 1 - 2 )  = 999
 
Então dentro do nosso array de posições podemos preencher o x com esse valor do mapa ( {x = 999, y = ?, z = ? } )
 
e a mesma coisa para o y ( OBS: o Z não é calculado no script pois é o mesmo que vem com a posição que é informada no parâmetro. ).
 
Se você perceber, a unica variável que vai mudar é o x ( Do laço for ) que vai rodar 3 vezes ( Porque temos 3 valores dentro do nosso elemento ),
 
1° volta = ( 1000  + 1 - 2 )  = 999
2° volta = ( 1000  + 2 - 2 )  = 1000
3° volta = ( 1000  + 3 - 2 )  = 1001
 
Isso ja são 3 posições no mapa, agora esse código roda ( 3 vezes no x + 3 vezes no y ( No For ) ), 3x3 = 9, Então com esse nossa array de área conseguimos verificar 9 posições in-game.
 
Essa é a verificação das creatures por posições no mapa geradas pelos nossos cálculos
 
                    if isCreature(getTopCreature(Cpos).uid) then
                        table.insert(uids, getTopCreature(Cpos).uid)
                    end
 
E esse é o retorno do array com os valores dos UID's encontrados pelos verificador de creatures
 
        return uids
    end
 
Depois temos a parte do Action
 
    function onUse(cid, item, fromPosition, itemEx, toPosition)
        local arr1 = { 
            {1, 1, 1}, 
            {1, 1, 1}, 
            {1, 1, 1}, 
        }
 
        doSendMagicEffect(toPosition, CONST_ME_MAGIC_RED)
 
        local creaturesArray = getCreatureInArea(toPosition, arr1)
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Creatures Detecteds: ".. table.getn(creaturesArray))
        for k, v in pairs(creaturesArray) do
            doSendMagicEffect(getCreaturePosition(v), CONST_ME_HOLYDAMAGE)
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Creatures Name: ".. getPlayerName(v))
        end
    end
 
Nesse script informamos a nossa área que verificaremos
 
        local arr1 = { 
            {1, 1, 1}, 
            {1, 1, 1}, 
            {1, 1, 1}, 
        }
 
Depois mandamos um efeito aonde o item foi usado
 
doSendMagicEffect(toPosition, CONST_ME_MAGIC_RED)
 
Usamos a função criada 
 
local creaturesArray = getCreatureInArea(toPosition, arr1)
 
Preenchendo os 2 parâmetros ( toPosition = Posição de onde o item foi usado,  arr1 = Nossa área )
 
Enviamos uma mensagem para o player com a quantidade total de creatures encontradas usando a função ( table.getn() ) para retornar a quantidade de elementos dentro do nosso array.
 
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Creatures Detecteds: ".. table.getn(creaturesArray))
 
Criamos um laço ( for ) Para rodar uma vez para cada creature encontrada
 
for k, v in pairs(creaturesArray) do
 
Enviamos um efeito de onde a creature foi encontrada, e uma mensagem para o player com o nome dela
 
           doSendMagicEffect(getCreaturePosition(v), CONST_ME_HOLYDAMAGE)
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Creatures Name: ".. getPlayerName(v))
 
QDSKRYn.png
 
miBoHvO.png
 
 
Essa é uma aula explicando como as posições podem ser exploradas, veja que com o toposition conseguimos criar uma área de verificações pre-definida e dar uma ação para essa área.
Editado por SuggestName (veja o histórico de edições)

O mesmo BananaFight, mais com um novo Nick.

 

 
Abra sua mente, sangue suga não vive sem um hospedeiro, Não faça script para os outros, ensine-os a fazer.
Link para o post
Compartilhar em outros sites

Ótimoo... Parabéns.

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.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo