Ir para conteúdo
  • 0

[Script] Hit All Aréa. How?


Newtonnotwen

Pergunta

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 por Newtonnotwen
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

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}}

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...