Ir para conteúdo

Featured Replies

Postado

Olá pessoal, minha dúvida é a seguinte, como usar o comando for nessa situação:

Eu tenho a seguinte função:

 

Spoiler

function getMonstersInArea(area)
        local monsters = {} 
        for x = area.fromx, area.tox do
                for y = area.fromy, area.toy do
                        for z = area.fromz, area.toz do
                                monsterpos = {x=x,y=y,z=z,stackpos=253}
                                monster = getThingFromPos(monsterpos)
                                if isMonster(monster.uid) == true then
                                        table.insert(monsters, monster.uid)
                                end
                        end
                end
        end
        return monsters
end

 

 

E a seguinte tabela como exemplo, e como já deve ser definida usando essa função:

Spoiler

local table = {
["indice"] = {
var = 12,
var3 = "Var",
positionsToCheck = {
area1 = {fromx=1, fromy=2, fromz=3, tox=6, toy=7, toz=8},
area2 = {fromx=10, fromy=12, fromz=14, tox=16, toy=18, toz=20}
}, 
}
}

 

Se eu usar a função da seguinte maneira, ela funciona corretamente,a finalidade para qual eu vou usa-la é para remover monstros de uma area:

Spoiler

local monsters = getMonstersInArea(table["indice"].positionsToCheck.area1)
if #monsters > 0 then
for i = 1, #monsters do
doRemoveCreature(monsters[i])
end
end

 

Até ai tudo certo se eu usar dessa forma, como já disse tudo funciona corretamente, no entando, eu preciso que seja configurável quantas posições eu quiser checar para remover os montros, pois as vezes indices diferentes terão numeros de areas diferentes para serem checadas. Para isso, tentei usar o for da seguinte maneira:

Spoiler

for area,_ in pairs(table["indice"].areasToCheck) do
local monsters = myNew({fromx=table["indice"].areasToCheck[areas].fromx, fromy=table["indice"].areasToCheck[areas].fromy, fromz=table["indice"].areasToCheck[areas].fromz}, {tox=table["indice"].areasToCheck[areas].tox, toy=table["indice"].areasToCheck[areas].toy, toz=table["indice"].areasToCheck[areas].toz})
if #monsters > 0 do
for i = 1, #monsters do
doRemoveCreature(monsters[i])
end
end
end

 

Mas fica dando o seguinte erro: for initial value must be a number, algo assim. 

Ainda estou aprendendo a programar e não tenho muito conhecimento, por isso gostaria que me ajudassem e me esclarecessem minha dúvida de como usar o for nessa situação.

Caso não tenha ficado totalmente claro oque eu pretendo fazer, seria basicamente salas para matar monstros, tipo uma quest, só que toda vez que o jogador for entrar se ainda tiver monstros lá eles ser

ão removidos, cada indice da tabela seria uma actionID diferente pra colocar em uma alavanca diferente pra startar a sala. Bom, acho que deu pra entender, espero que me ajudem com essa dúvida, e obrigado desde já!

Postado

@Shadow.Styller Você pode adicionar esse for na própria função, verificando assim todas as áreas contidas na tabela positionsToCheck.

 

Spoiler

function getMonstersInArea(positionsToCheck)
	local monsters = {}
	for _, area in pairs(positionsToCheck) do
		for x = area.fromx, area.tox do
				for y = area.fromy, area.toy do
						for z = area.fromz, area.toz do
								monsterpos = {x=x,y=y,z=z,stackpos=253}
								monster = getThingFromPos(monsterpos)
								if isMonster(monster.uid) == true then
										table.insert(monsters, monster.uid)
								end
						end
				end
		end
	end
	return monsters
end

 

E você utiliza da seguinte maneira:

Spoiler

local table = {
	["indice"] = {
		var = 12,
		var3 = "Var",
		positionsToCheck = {
		area1 = {fromx=1, fromy=2, fromz=3, tox=6, toy=7, toz=8},
		area2 = {fromx=10, fromy=12, fromz=14, tox=16, toy=18, toz=20}
		}
	}
}

local monsters = getMonstersInArea(table["indice"].positionsToCheck)
if #monsters > 0 then
	for i = 1, #monsters do
		doRemoveCreature(monsters[i])
	end
end

 

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

Postado
  • Autor
5 horas atrás, Way20 disse:

@Shadow.Styller Você pode adicionar esse for na própria função, verificando assim todas as áreas contidas na tabela positionsToCheck.

 

  Mostrar conteúdo oculto


function getMonstersInArea(positionsToCheck)
	local monsters = {}
	for _, area in pairs(positionsToCheck) do
		for x = area.fromx, area.tox do
				for y = area.fromy, area.toy do
						for z = area.fromz, area.toz do
								monsterpos = {x=x,y=y,z=z,stackpos=253}
								monster = getThingFromPos(monsterpos)
								if isMonster(monster.uid) == true then
										table.insert(monsters, monster.uid)
								end
						end
				end
		end
	end
	return monsters
end

 

E você utiliza da seguinte maneira:

  Mostrar conteúdo oculto


local table = {
	["indice"] = {
		var = 12,
		var3 = "Var",
		positionsToCheck = {
		area1 = {fromx=1, fromy=2, fromz=3, tox=6, toy=7, toz=8},
		area2 = {fromx=10, fromy=12, fromz=14, tox=16, toy=18, toz=20}
		}
	}
}

local monsters = getMonstersInArea(table["indice"].positionsToCheck)
if #monsters > 0 then
	for i = 1, #monsters do
		doRemoveCreature(monsters[i])
	end
end

 

Olá, obrigado! Funcionou certinho. Como a função não é minha e como eu já disse estou começando nem pensei em mexer nela pra não dar bosta hahaha já que custei pra achar essa função que funcionasse do jeito que eu queria. For ainda é uma coisa que estou aprendendo por isso as vezes tenho dificuldade, tem algum link de tutorial que eu possa ver ? eu vi um aqui no tk mas é meio antigo. E obrigado de novo amigão!

Postado
8 minutos atrás, Shadow.Styller disse:

Olá, obrigado! Funcionou certinho. Como a função não é minha e como eu já disse estou começando nem pensei em mexer nela pra não dar bosta hahaha já que custei pra achar essa função que funcionasse do jeito que eu queria. For ainda é uma coisa que estou aprendendo por isso as vezes tenho dificuldade, tem algum link de tutorial que eu possa ver ? eu vi um aqui no tk mas é meio antigo. E obrigado de novo amigão!

 

Participe do nosso clube de estudos, quando tiver alguma duvida relacionada a linguagem, pode perguntar lá.

 

 

 

 

Nós somos aquilo que fazemos repetidamente. Excelência, não é um modo de agir, mas um hábito.

                                                                                                                                                                                                                                        Aristóteles 

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo