Ir para conteúdo
  • 0

[Dúvida cruel] List de blocos da sofrência


Metalflame12

Pergunta

Bom dia!

Eu estava felizão achando que tava tudo funcionando, mas a lista de blocos não funciona com ids por exemplo "1:4", somente números completos, sem ":" ...

 

Como faço para que os ids como 1:4 funcionem na config.yml?

Eu procurei pacas, mas não acho nada que preste :/

 

config.yml:

blocos-permitidos:
- 50
- 1:4

Método:

@EventHandler
public void jaburuEmpanado(BlockPlaceEvent e){
    List<Integer> blocos = (List<Integer>) Main.cf.getIntegerList("blocos-permitidos");
    for (Integer b : blocos) {
        if (e.getBlockPlaced().getTypeId() == b) {
            e.getPlayer().sendMessage("Colocado");
            return;
        } else {
            e.getPlayer().sendMessage("errou");
            e.setCancelled(true);
        }
    }
}

Obrigado :D

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

15 respostass a esta questão

Posts Recomendados

ID: 1:4 por exemplo

 

Como verificar:

@EventHandler
public void onPlace(BlockPlaceEvent e){
    
    List<String> blocos = Main.cf.getStringList("blocos-permitidos");
    for (String ids : blocos){
        String a = ids;
        int id = 0;
        int data = 0;
        if (a.contains(":")){
            id = Integer.parseInt(a.split(":")[0]);
            data = Integer.parseInt(a.split(":")[1]);
        } else {
            id = Integer.parseInt(ids);
        }
        if (e.getBlockPlaced().getTypeId() == id && e.getBlockPlaced().getDurability() == data){
           // Bloco permitido
           break; // Finalizar o loop
        } else {
           // Bloco não permitido
           break;  
        }
    } 

}

Espero ter ajudado...

Link para o comentário
Compartilhar em outros sites

ID: 1:4 por exemplo

 

Como verificar:

@EventHandler
public void onPlace(BlockPlaceEvent e){
    
    List<String> blocos = Main.cf.getStringList("blocos-permitidos");
    for (String ids : blocos){
        String a = ids;
        int id = 0;
        int data = 0;
        if (a.contains(":")){
            id = Integer.parseInt(a.split(":")[0]);
            data = Integer.parseInt(a.split(":")[1]);
        } else {
            id = Integer.parseInt(ids);
        }
        if (e.getBlockPlaced().getTypeId() == id && e.getBlockPlaced().getDurability() == data){
           // Bloco permitido
           break; // Finalizar o loop
        } else {
           // Bloco não permitido
           break;  
        }
    } 

}

Espero ter ajudado...

Aqui o "getDurability()" não funciona, estou usando Paper 1.11.2

Link para o comentário
Compartilhar em outros sites

Aqui o "getDurability()" não funciona, estou usando Paper 1.11.2

Não é getDurability(), é getData().

Ficaria:

if (e.getBlockPlaced().getTypeId() == id &&  e.getBlockPlaced().getData() == data){

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

Não é getDurability(), é getData().

Ficaria:

if (e.getBlockPlaced().getTypeId() == id &&  e.getBlockPlaced().getData() == data){

Obrigado, eu achei era o .getData() mesmo, mas vai saber :v

 

ID: 1:4 por exemplo

 

Como verificar:

@EventHandler
public void onPlace(BlockPlaceEvent e){
    
    List<String> blocos = Main.cf.getStringList("blocos-permitidos");
    for (String ids : blocos){
        String a = ids;
        int id = 0;
        int data = 0;
        if (a.contains(":")){
            id = Integer.parseInt(a.split(":")[0]);
            data = Integer.parseInt(a.split(":")[1]);
        } else {
            id = Integer.parseInt(ids);
        }
        if (e.getBlockPlaced().getTypeId() == id && e.getBlockPlaced().getDurability() == data){
           // Bloco permitido
           break; // Finalizar o loop
        } else {
           // Bloco não permitido
           break;  
        }
    } 

}

Espero ter ajudado...

Eu não entendi muito bem como esse código funciona, eu coloquei no meu plugin assim:

    @EventHandler
    public void onPlace(BlockPlaceEvent e){
        List<String> blocos = Main.cf.getStringList("blocos-permitidos");
        for (String ids : blocos){
            String a = ids;
            int id = 0;
            int data = 0;
            if (a.contains(":")){
                id = Integer.parseInt(a.split(":")[0]);
                data = Integer.parseInt(a.split(":")[1]);
            } else {
                id = Integer.parseInt(ids);
            }
            if (e.getBlockPlaced().getTypeId() == id && e.getBlockPlaced().getData() == data){
                e.getPlayer().sendMessage("Permitido");
                break;
            } else {
                e.getPlayer().sendMessage("Cancelado");
                e.setCancelled(true);
                break;
            }
        }
    }

E na config.yml assim:

blocos-permitidos:
- '5:2'
- '50'
- '1:4'

Mas só o primeiro da lista pode ser colocado .-.

Link para o comentário
Compartilhar em outros sites

  @EventHandler
    public void onPlace(BlockPlaceEvent e){
        List<String> blocos = Main.cf.getStringList("blocos-permitidos");
        for (String ids : blocos){
            String a = ids;
            int id = 0;
            int data = 0;
            if (a.contains(":")){
                id = Integer.parseInt(a.split(":")[0]);
                data = Integer.parseInt(a.split(":")[1]);
            } else {
                id = Integer.parseInt(ids);
            }
            if (e.getBlockPlaced().getTypeId() == id && e.getBlockPlaced().getData() == data){
                e.getPlayer().sendMessage("Permitido");
            } else {
                e.getPlayer().sendMessage("Cancelado");
                e.setCancelled(true);
                break;
            }
        }
    }

tinha um break no lugar errado

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

  @EventHandler
    public void onPlace(BlockPlaceEvent e){
        List<String> blocos = Main.cf.getStringList("blocos-permitidos");
        for (String ids : blocos){
            String a = ids;
            int id = 0;
            int data = 0;
            if (a.contains(":")){
                id = Integer.parseInt(a.split(":")[0]);
                data = Integer.parseInt(a.split(":")[1]);
            } else {
                id = Integer.parseInt(ids);
            }
            if (e.getBlockPlaced().getTypeId() == id && e.getBlockPlaced().getData() == data){
                e.getPlayer().sendMessage("Permitido");
            } else {
                e.getPlayer().sendMessage("Cancelado");
                e.setCancelled(true);
                break;
            }
        }
    }

tinha um break no lugar errado

 

Ainda não funcionou, quando eu coloco diorito polido(1:4) e tocha(50) aparece "cancelado" e quando tento colocoar talba de eucalipto(5:2) aparece "permitido" e "cancelado" logo abaixo .-.

 

E nenhum fica no chão

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

Ah, espera vou fazer o codigo

 

 

http://pastebin.com/f7M5US0q

 

tenta

 

 

Ainda não funcionou, quando eu coloco diorito polido(1:4) e tocha(50) aparece "cancelado" e quando tento colocoar talba de eucalipto(5:2) aparece "permitido" e "cancelado" logo abaixo .-.

 

E nenhum fica no chão

 

Ainda não funcionou, quando eu coloco diorito polido(1:4) e tocha(50) aparece "cancelado" e quando tento colocoar talba de eucalipto(5:2) aparece "permitido" e "cancelado" logo abaixo .-.

 

E nenhum fica no chão

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

@EventHandler
		public void jaburuEmpanado(BlockPlaceEvent e){
			List<String> blocos = getConfig().getStringList("blocos-permitidos");
			for(String s : blocos){
				int id;
				byte data = 0;
				String[] splitted = s.split(":");
				if(s.contains(":")){
					id = Integer.parseInt(splitted[0]);
					data = Byte.parseByte(splitted[1]);
				}else{
					id = Integer.parseInt(splitted[0]);
				}
				if(e.getBlock().getTypeId() == id && e.getBlock().getData() == data){
					e.getPlayer().sendMessage("acertou");
				}else{
					e.setCancelled(false);
					e.getPlayer().sendMessage("errou");
				}
			}
		}

@Edit

 

Gambiarra #2

		@EventHandler
		public void jaburuEmpanado(BlockPlaceEvent e){
			List<String> blocos = getConfig().getStringList("blocos-permitidos");
			
			int id = e.getBlock().getTypeId();
			byte data = e.getBlock().getData();
			String firstID = String.valueOf(id);
			String secondID = String.valueOf(id + ":" + data);
			
			if(blocos.contains(firstID) || blocos.contains(secondID)){
				e.getPlayer().sendMessage("acertou");
			}else{
				e.setCancelled(false);
				e.getPlayer().sendMessage("errou");
			}
		}
Editado por MikeSantos
Link para o comentário
Compartilhar em outros sites

 //No escopo da classe
HashSet<Integer> blocosPermitidos = new HashSet<>();
 
  //No onEnable
 
List<String> rawItems = getConfig().getStringList("blocos-permitidos");

// Parseia os items
for (String rawItem : rawItems) {
  byte data;
  int id;
  
  // Parseia os items com data, '10:1'
  if (rawItem.indexOf(":") > -1) {
    String[] parts = rawItem.split(":");
    data = Byte.parseByte(parts[1]);
    id = Integer.parseInt(parts[0]);
  } else {
    id = Integer.parseInt(rawItem);
    data = 0;
  }
  
  // Adiciona a hash do id & data na hashset
  blocosPermitidos.add(Objects.hash(id, data));
}
@EventHandler
public void jaburuEmpanado(BlockPlaceEvent e) {
  // Faz o hash do id & data
  int hash = Objects.hash(e.getBlock().getTypeId(), e.getBlock().getData());

  // Vê se o hash ta dentro do hashset.
  if (blocosPermitidos.contains(hash)) {
    // tem
  } else {
    // n tem
  }
}

A formatacao ta diferente pq escrevi no eclipse, mas n testei.

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

@EventHandler
		public void jaburuEmpanado(BlockPlaceEvent e){
			List<String> blocos = getConfig().getStringList("blocos-permitidos");
			for(String s : blocos){
				int id;
				byte data = 0;
				String[] splitted = s.split(":");
				if(s.contains(":")){
					id = Integer.parseInt(splitted[0]);
					data = Byte.parseByte(splitted[1]);
				}else{
					id = Integer.parseInt(splitted[0]);
				}
				if(e.getBlock().getTypeId() == id && e.getBlock().getData() == data){
					e.getPlayer().sendMessage("acertou");
				}else{
					e.setCancelled(false);
					e.getPlayer().sendMessage("errou");
				}
			}
		}

@Edit

 

Gambiarra #2

		@EventHandler
		public void jaburuEmpanado(BlockPlaceEvent e){
			List<String> blocos = getConfig().getStringList("blocos-permitidos");
			
			int id = e.getBlock().getTypeId();
			byte data = e.getBlock().getData();
			String firstID = String.valueOf(id);
			String secondID = String.valueOf(id + ":" + data);
			
			if(blocos.contains(firstID) || blocos.contains(secondID)){
				e.getPlayer().sendMessage("acertou");
			}else{
				e.setCancelled(false);
				e.getPlayer().sendMessage("errou");
			}
		}

O seu funcionou completinho, porém vou usar o do leonardosc pq é mais eficiente. Obrigado!

 

//No escopo da classe

 

HashSet<Integer> blocosPermitidos = new HashSet<>();
 

 

  //No onEnable

 

 

List<String> rawItems = getConfig().getStringList("blocos-permitidos");

// Parseia os items
for (String rawItem : rawItems) {
  byte data;
  int id;
  
  // Parseia os items com data, '10:1'
  if (rawItem.indexOf(":") > -1) {
    String[] parts = rawItem.split(":");
    data = Byte.parseByte(parts[1]);
    id = Integer.parseInt(parts[0]);
  } else {
    id = Integer.parseInt(rawItem);
    data = 0;
  }
  
  // Adiciona a hash do id & data na hashset
  blocosPermitidos.add(Objects.hash(id, data));
}

 

 

@EventHandler
public void jaburuEmpanado(BlockPlaceEvent e) {
  // Faz o hash do id & data
  int hash = Objects.hash(e.getBlock().getTypeId(), e.getBlock().getData());

  // Vê se o hash ta dentro do hashset.
  if (blocosPermitidos.contains(hash)) {
    // tem
  } else {
    // n tem
  }
}
A formatacao ta diferente pq escrevi no eclipse, mas n testei.

 

 

Como eu faço para que isso funcione com o método do jaburuEmpanado em outra classe? Eu ia colocar tudo na Main, mas é melhor eu aprender isso logo, pq vou usar em outros plugins tbem

 

Obrigado!

Link para o comentário
Compartilhar em outros sites

O seu funcionou completinho, porém vou usar o do leonardosc pq é mais eficiente. Obrigado!

 

 

Como eu faço para que isso funcione com o método do jaburuEmpanado em outra classe? Eu ia colocar tudo na Main, mas é melhor eu aprender isso logo, pq vou usar em outros plugins tbem

 

Obrigado!

// Na tua classe Main
private static NomeDaSuaClasse instancia;

// No onEnable
instancia = this;

// Na sua classe main dnv
public static getInstancia() {
  return instancia;
}

// Nas outras classes, de eventos por exemplo.
NomeDaSuaClasse.getInstancia().blocosPermitidos...
Link para o comentário
Compartilhar em outros sites

// Na tua classe Main
private static NomeDaSuaClasse instancia;

// No onEnable
instancia = this;

// Na sua classe main dnv
public static getInstancia() {
  return instancia;
}

// Nas outras classes, de eventos por exemplo.
NomeDaSuaClasse.getInstancia().blocosPermitidos...

Funcionou!

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

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