Ir para conteúdo
  • 0

[Dúvida] Pegar blocos ao redor do player


LuizB

Pergunta

Olá, como faço pra pegar os blocos ao redor do player ?

Estou tentando criar um comando igual ao //sp do worldedit.
 

Por exemplo: eu digito o comando /quebrar 5, 5 vai ser o radius, ai vai gerar tipo um cubo id, com 1 bloco na ponta de cima, e outro bloco na ponta de baixo, que daria uma area de 5 blocos.

Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

Não  não, olha essa foto:

 

http://prntscr.com/dxfmgn

 

Iria quebrar os 3 blocos, só que com 3 de profundidade

 

Primeira camada .

 

Segunda camada.

 

Terceira camada.

 

Tenta

 

playerPos seria o bloco que o cara quebrou, o do meio, na sua print seria o 2.

bloco1 = playerPos.add(1, 0, 1)
bloco2 = playerPos.add(-1, -3, -1)
Link para o comentário
Compartilhar em outros sites


/*

* Ele serve pra analisar todos os blocos dentro de um raio em uma localização central

* Ou seja:

*

* R^

*

* R<< (Ponto central) >>R

*

* Rv

*/

private static List<Location> Teste(Location loc, int raio)

{

World w = loc.getWorld();

int coordx = (int) loc.getX();

int coordz = (int) loc.getZ();

int coordy = (int) loc.getY();

/*

* Salvando a localização com base no parâmetro definido em Teste

*/

List<Location> tl = new ArrayList<Location>();

for (int x = -raio; x <= raio; x++)

{

for (int z = -raio; z <= raio; z++)

{

for (int y = -raio; y <= raio; y++)

/*

* Analisando a coordenada com base na Interger raio

*/

{

tl.add(new Location(w, coordx + x, coordy + y, coordz + z));

/*

* Aqui adiciona as coordenadas somadas ao raio para uma lista a tl > templist

*/

}

}

return tl;

/*

* Retorna a lista anterior

*/

}

/*

*

* Após feito, é só usar isso como se fosse um check de blocos para uma coordenada especifica salva em variavel

* Espero que tenha ajudado!

* - Bjs do Fusquetao

*

*/

 

Link para o comentário
Compartilhar em outros sites

pseudo code

playerPos = posicao do jogador
radius = raio que foi informado

halfRadius = radius / 2

bloco1 = playerPos.add(halfRadius, halfRadius, halfRadius)
bloco2 = playerPops.add(-halfRadius, -halfRadius, -halfRadius)

/*
* Ele serve pra analisar todos os blocos dentro de um raio em uma localização central
* Ou seja:
*
*           R^
*
* R<<  (Ponto central)  >>R
*
*           Rv
*/
 private static List<Location> Teste(Location loc, int raio)
    {
    World w = loc.getWorld();
    int coordx = (int) loc.getX();
    int coordz = (int) loc.getZ();
    int coordy = (int) loc.getY();
 /*
 * Salvando a localização com base no parâmetro definido em Teste
 */
    List<Location> tl = new ArrayList<Location>();
    for (int x = -raio; x <= raio; x++)
    {
    for (int z = -raio; z <= raio; z++)
    {
    for (int y = -raio; y <= raio; y++)
/*
* Analisando a coordenada com base na Interger raio
*/
    {
    tl.add(new Location(w, coordx + x, coordy + y, coordz + z));
/*
* Aqui adiciona as coordenadas somadas ao raio para uma lista a tl > templist
*/ 
    }
    }
    return tl;
/*
* Retorna a lista anterior
*/ 
    }
/*
*
* Após feito, é só usar isso como se fosse um check de blocos para uma coordenada especifica salva em variavel
* Espero que tenha ajudado!
* - Bjs do Fusquetao
*
*/

 

Pelo que ta escrito no tópico, ele quer apenas pegar os blocos da ponta, não todos dentro do raio...

Link para o comentário
Compartilhar em outros sites

pseudo code

playerPos = posicao do jogador
radius = raio que foi informado

halfRadius = radius / 2

bloco1 = playerPos.add(halfRadius, halfRadius, halfRadius)
bloco2 = playerPops.add(-halfRadius, -halfRadius, -halfRadius)

 

Pelo que ta escrito no tópico, ele quer apenas pegar os blocos da ponta, não todos dentro do raio...

Eu li rápido Kkkkk, aff, acho que não sei fazer pegar só na ponta =(

Link para o comentário
Compartilhar em outros sites

pseudo code

playerPos = posicao do jogador
radius = raio que foi informado

halfRadius = radius / 2

bloco1 = playerPos.add(halfRadius, halfRadius, halfRadius)
bloco2 = playerPops.add(-halfRadius, -halfRadius, -halfRadius)

Pelo que ta escrito no tópico, ele quer apenas pegar os blocos da ponta, não todos dentro do raio...

Não é bem isso, é tipo pegar as ponta, formar um cubo 5 x 5 e quebrar tudo que tem nele.

 

@EDIT

 

Mas acho que vou pegar as pontas, criar um cuboid e fazer um loop nos blocos e quebrar q.q

Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

Não é bem isso, é tipo pegar as ponta, formar um cubo 5 x 5 e quebrar tudo que tem nele.

 

Então, só implementar, tu já tem os 2 pontos, só fazer um for do ponto minimo para o maximo e tirar os blocos.

 

Ex: 6x6

 

BfkAJ86.png

Editado por leonardosc
Link para o comentário
Compartilhar em outros sites

Então, só implementar, tu já tem os 2 pontos, só fazer um for do ponto minimo para o maximo e tirar os blocos.

 

Ex: 6x6

 

BfkAJ86.png

Não funcionou, não aconteceu NADA, nem quebrou.

 

Código:

 

 

@EventHandler
	public void picaretaa(BlockBreakEvent e) {
		Player p =  e.getPlayer();
        Location playerPos = p.getLocation();
        int radius = 15;
        int halfRadius = radius / 2;
        RegionManager wgCurrWorldRM = WGBukkit.getRegionManager(p.getWorld());
        Location l1 = playerPos.add(halfRadius, halfRadius, halfRadius);
        Location l2 = playerPos.add(-halfRadius, -halfRadius, -halfRadius);
        Cuboid cb = new Cuboid(l1, l2);
        for (Block b : cb){
        	
        	ApplicableRegionSet arSet = wgCurrWorldRM.getApplicableRegions(b.getLocation());
        	if (arSet.size() > 0) {
        		Bukkit.getServer().broadcastMessage("Ok");
        		continue;
        	}else {
        		b.breakNaturally();
        		org.bukkit.inventory.ItemStack is = new org.bukkit.inventory.ItemStack(b.getType());
        		org.bukkit.inventory.ItemStack toadd = new org.bukkit.inventory.ItemStack(b.getType(), getDropCount(p.getItemInHand().getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS), e.getBlock()));
        		e.getBlock().getDrops(is);
        		e.getBlock().getDrops().add(toadd);
        	}
			
		}
	}

Cuboid:

 

https://hastebin.com/morifibupu.java

Link para o comentário
Compartilhar em outros sites

Não funcionou, não aconteceu NADA, nem quebrou.

 

Código:

 

 

@EventHandler
	public void picaretaa(BlockBreakEvent e) {
		Player p =  e.getPlayer();
        Location playerPos = p.getLocation();
        int radius = 15;
        int halfRadius = radius / 2;
        RegionManager wgCurrWorldRM = WGBukkit.getRegionManager(p.getWorld());
        Location l1 = playerPos.add(halfRadius, halfRadius, halfRadius);
        Location l2 = playerPos.add(-halfRadius, -halfRadius, -halfRadius);
        Cuboid cb = new Cuboid(l1, l2);
        for (Block b : cb){
        	
        	ApplicableRegionSet arSet = wgCurrWorldRM.getApplicableRegions(b.getLocation());
        	if (arSet.size() > 0) {
        		Bukkit.getServer().broadcastMessage("Ok");
        		continue;
        	}else {
        		b.breakNaturally();
        		org.bukkit.inventory.ItemStack is = new org.bukkit.inventory.ItemStack(b.getType());
        		org.bukkit.inventory.ItemStack toadd = new org.bukkit.inventory.ItemStack(b.getType(), getDropCount(p.getItemInHand().getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS), e.getBlock()));
        		e.getBlock().getDrops(is);
        		e.getBlock().getDrops().add(toadd);
        	}
			
		}
	}

Cuboid:

 

https://hastebin.com/morifibupu.java

 

Cloca .clone() antes dos .add(...)

Link para o comentário
Compartilhar em outros sites

Tu não falou um bloco na ponta de cima e outro na ponta de baixo?

 

É pra quebrar, por exemplo, 5x5x5

È, pensei errado :p

 

IGUAL ao //sp

Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

pseudo code

playerPos = posicao do jogador
radius = raio que foi informado

halfRadius = radius / 2

bloco1 = playerPos.add(halfRadius, halfRadius, halfRadius)
bloco2 = playerPops.add(-halfRadius, -halfRadius, -halfRadius)

 

Pelo que ta escrito no tópico, ele quer apenas pegar os blocos da ponta, não todos dentro do raio...

Tem como pegar só o da frente ?, o cara mudou de ideia, não precisa mais de um radius :V

Link para o comentário
Compartilhar em outros sites

Igual o //sp

 

Se eu quebrar um bloco em uma parede, vai quebrar uma area 3x3x3

 

3 de profundidade

 

3 de altura

 

3 de largura

 

O sp faz um retângulo/quadrado, do jeito que tu ta falando ficaria uma linha de 3 blocos no X ou Z e 6 no Y...

Link para o comentário
Compartilhar em outros sites

O sp faz um retângulo/quadrado, do jeito que tu ta falando ficaria uma linha de 3 blocos no X ou Z e 6 no Y...

Não  não, olha essa foto:

 

http://prntscr.com/dxfmgn

 

Iria quebrar os 3 blocos, só que com 3 de profundidade

 

Primeira camada .

 

Segunda camada.

 

Terceira camada.

Link para o comentário
Compartilhar em outros sites

 

Tenta

 

playerPos seria o bloco que o cara quebrou, o do meio, na sua print seria o 2.

bloco1 = playerPos.add(1, 0, 1)
bloco2 = playerPos.add(-1, -3, -1)

precisa colocar o clone, antes do add ?

 

@EDIT

 

Coloquei o clone, e ainda ta criando um L 

 

Lembrando que estou usando cuboid

Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...