Postado Dezembro 13, 2014 10 anos 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)) 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 Dezembro 13, 2014 10 anos 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.
Postado Dezembro 13, 2014 10 anos Ótimoo... Parabéns. Ajudei? REP+ Talvez possa te ajudar: • Launcher AutoUpdate C# - Tutorial • Sprites OtPokémon 9.4 e 10.1 • Liberando espaço de sprites no old client • Deixar OTClient com zoom padrão
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.