primeira coisa, você deve declarar ppos antes de declarar o pl1/pl2, pois esses dependem de ppos para ter valor atribuído.
já que você quer pegar todas as posições de um ponto a outro ponto, precisamos fazer um loop que passe por todas as coordenadas dessa área.
pra te ensinar, vou usar apenas o centro, ou seja, vou ignorar o pl1/pl2 e usar apenas o ppos:
for VARIACAO_X = -3, 3 do local posicao = getThingPos(cid) posicao.x = posicao.x + VARIACAO_X end
perceba que o código acima vai repetir 7 vezes, sendo que na primeira repetição, a variável declarada (VARIACAO_X) vai assumir valor -3, na segunda repetição vai ter valor -2, depois -1, aí 0, 1, 2 até finalmente chegar no 3 e parar de repetir.
a cada repetição, eu vou criar uma local chamada posicao e ela vai ter as mesmas coordenadas do posição do player cid, e depois eu vou alterar apenas o campo "x" (lembrando que a posição não deixa de ser uma array, tabela no estilo {x = 700, y = 500, z = 7}), vou adicionar o valor atribuído à variável do loop, no caso VARIAVEL_X.
já que serão 7 repetições, o código entre o loop vai ser executado 7x, e pra cada vez executado o VARIAVEL_X é somado ao campo X da posicao, ou seja, vão ser 7 posições criadas ao todo que vai de -3 até 3 (incluindo o 0).
o resultado é que você vai obter 7 posições, 3 posições que seriam consecutivas (3 sqms à direita), a própria posição do player (pois somando o campo X com 0, não vai alterar nada) e 3 outras posições consecutivas (3 à esquerda), seria uma área assim:
local area = {
{0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 3, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0}}
agora o que você pode fazer é combinar 2 loops, um dentro do outro, uma das variáveis do loop irá alterar o campo x, e outra o campo y:
for VARIAVEL_X = -3, 3 do
for VARIAVEL_Y = -2, 2 do
local pos = getThingPos(cid)
pos.x = pos.x + VARIAVEL_X
pos.y = pos.y + VARIAVEL_Y
end
end
Desse jeito você vai obter 35 posições diferentes alterando o campo X e Y ao mesmo tempo, formando uma área que se extende 2 sqms acima da posição do player e 2 sqms abaixo e ao mesmo tempo 3 sqms à esquerda e 3 à direita (isso não vai formar uma cruz, pois os loops estão um dentro do outro, eles são alterados em conjunto) formando uma área assim:
local area = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 3, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}}
para fazer de um ponto superior esquerdo até um ponto inferior direito, basta fazer um loop que vai do menor x (o mais à esquerda) até o maior x (o mais à direita) e dentro desse loop criar outra repetição que vai do menor y (mais acima) até o maior y (mais abaixo), e você não precisa fica alterando campo de uma outra posição, basta criar uma com os exatos valores das variáveis de loop x/y, e colocar o z que você quiser.
Quando você tiver pego todas as posições, você pode ver se o tile é protection zone ou não (getTileInfo(sua_pos).protection), você consegue pegar a criatura que está na posição:
local creature = getTopCreature(sua_pos) if isCreature(creature) then ... --funções como addHealth que é o que você pede no tópico end
pode fazer o que você quiser nessa posição.
com o tempo você vai descobrindo o que é possível fazer com os loops, por exemplo:
se você utilizar o loop para alterar o x, e outro loop que não seja dentro desse primeiro pra alterar o y, você obteria uma posição no formato de uma cruz:
local area = {
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{1, 1, 1, 3, 1, 1, 1},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0}}


info
Grupo: Conde
Registrado: 04/08/12
Posts: 762
Reputação: +80
Eu gostaria que alguém me ensina-se a fazer o seguinte:
Supondo os seguintes locais:
local pl1 = {x=ppos.x-7, y=ppos.y-5, z=ppos.z}
local pl2 = {x=ppos.x+7, y=ppos.y+5, z=ppos.z}
local ppos = getCreaturePosition(cid)
Eu gostaria de acionar a função "doCreatureAddHealth(cid, -LIFE)" em toda a areá que vai de pl1 a pl2, assim fazendo com que todos player e monstros existentes nessa areá perdessem o life, exeto em protection zone.
Obs: Não quero um script que faça isso, gostaria de aprender a fazer isso.
Obrigado pela atenção.
Editado Setembro 9 por Newtonnotwen