Ir para conteúdo
  • 0

[Bug Esquisitão] Blocos bugados? Plugin bugado? Minecraft bugado? N sei '-'


Metalflame12

Pergunta

Bom dia povo!
 
Seguinte, eu usei o código do mano leonardosc deste tópico mas está acontecendo um bug, bem estranho, mas antes de explicar como funciona, aqui está a classe:
 

public class Main extends JavaPlugin implements Listener {

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

    @Override
    public void onEnable() {

        if(new File(getDataFolder(), "config.yml").exists()){
        }else {
            saveResource("config.yml", false);
        }

        Bukkit.getPluginManager().registerEvents(this, this);

        List<String> rawItems = getConfig().getStringList("blocos-permitidos");
        for (String rawItem : rawItems) {
            byte data;
            int id;

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

            blocosPermitidos.add(Objects.hash(id, data));
        }
    }

    @EventHandler
    public void onPlace(BlockPlaceEvent e) {
        int hash = Objects.hash(e.getBlock().getTypeId(), e.getBlock().getData());
        if (blocosPermitidos.contains(hash)) {
            e.getPlayer().sendMessage("colocado");
            return;
        } else {
            e.getPlayer().sendMessage("n pode colocar");
            e.setCancelled(true);
        }
    }

    @EventHandler
    public void onBreak(BlockBreakEvent e) {
        int hash = Objects.hash(e.getBlock().getTypeId(), e.getBlock().getData());
        if (blocosPermitidos.contains(hash)) {
            e.getPlayer().sendMessage("quebrado");
            return;
        } else {
            e.getPlayer().sendMessage("n pode quebrar");
            e.setCancelled(true);
        }
    }
}

E a config:

blocos-permitidos:
  - '85'
  - '323'
  - '6'
  - '6:2'
  - '50'
  - '76'
  - '154'
  - '198'

Teoricamente o player só pode quebrar/colocar os blocos que estão na config, porém os IDs 323(Placa), 50 (tocha), 198 (Vara do End ( ͡° ͜ʖ ͡°) ) e provavelmente alguns outros não funcionam.

 

Como eu arrumo isso? '-'

Obrigado!

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

13 respostass a esta questão

Posts Recomendados

No escopo da classe

Map<Integer, Byte> blocosPermitidos = new HashMap<>();

no onEnable

List<String> rawItems = getConfig().getStringList("blocos-permitidos");
for (String rawItem : rawItems) {
  byte data;
  int id;

  if (rawItem.indexOf(':') > -1) {
    String[] parts = rawItem.split(":");
    data = Byte.parseByte(parts[1]);
    id = Integer.parseInt(parts[0]);
  } else {
    id = Integer.parseInt(rawItem);
    data = -1;
  }

  blocosPermitidos.put(id, data);
}

no evento

@EventHandler
public void on(BlockPlaceEvent e) {
  Block block = e.getBlock();

  Byte mappedData = blocosPermitidos.get(block.getTypeId());

  // se mappedData for null então não tem nenhum bloco com esse id na map
  // se for -1 ele engloba todos os "data values"
  if (mappedData != null && (mappedData == -1 || mappedData == block.getData())) {
    e.getPlayer().sendMessage("tem");
  }
}
Editado por leonardosc
Link para o comentário
Compartilhar em outros sites

Bom dia povo!

 

Seguinte, eu usei o código do mano leonardosc deste tópico mas está acontecendo um bug, bem estranho, mas antes de explicar como funciona, aqui está a classe:

 

public class Main extends JavaPlugin implements Listener {

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

    @Override
    public void onEnable() {

        if(new File(getDataFolder(), "config.yml").exists()){
        }else {
            saveResource("config.yml", false);
        }

        Bukkit.getPluginManager().registerEvents(this, this);

        List<String> rawItems = getConfig().getStringList("blocos-permitidos");
        for (String rawItem : rawItems) {
            byte data;
            int id;

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

            blocosPermitidos.add(Objects.hash(id, data));
        }
    }

    @EventHandler
    public void onPlace(BlockPlaceEvent e) {
        int hash = Objects.hash(e.getBlock().getTypeId(), e.getBlock().getData());
        if (blocosPermitidos.contains(hash)) {
            e.getPlayer().sendMessage("colocado");
            return;
        } else {
            e.getPlayer().sendMessage("n pode colocar");
            e.setCancelled(true);
        }
    }

    @EventHandler
    public void onBreak(BlockBreakEvent e) {
        int hash = Objects.hash(e.getBlock().getTypeId(), e.getBlock().getData());
        if (blocosPermitidos.contains(hash)) {
            e.getPlayer().sendMessage("quebrado");
            return;
        } else {
            e.getPlayer().sendMessage("n pode quebrar");
            e.setCancelled(true);
        }
    }
}

E a config:

blocos-permitidos:
  - '85'
  - '323'
  - '6'
  - '6:2'
  - '50'
  - '76'
  - '154'
  - '198'

Teoricamente o player só pode quebrar/colocar os blocos que estão na config, porém os IDs 323(Placa), 50 (tocha), 198 (Vara do End ( ͡° ͜ʖ ͡°) ) e provavelmente alguns outros não funcionam.

 

Como eu arrumo isso? '-'

Obrigado!

Cadê o ID da placa na config? 

 

¬¬

 

Tá, tenta pegar o estado do bloco. ( e.getBlock().getState() )

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

Não tenho a certeza, mas se você não especificar a data na config, você seta a data para 0.

A placa, tocha, e vara do end têm id's diferentes dependendo da posição que eles são colocados, se você colocar uma placa virada para norte, sul, etc..

Se você colocar uma placa para norte irá ter o ID 323:1 , para sul irá ter 323:2 (exemplo, não deve ser assim), e como você não especificou a data na config, só irá ser bloqueado 323:0

Acho que é isso, para arrumar ou muda o código não sei como, porque isso é do @leonardosc e ele só usa código complicado, ou na config coloca isso tudo

- '323:0'
- '323:1'
- '323:2'
- '323:3'
- '323:4'
- '323:5'
- '323:6'
- '323:7'

ah, a placa tb tem outro id, quando é colocada numa parede, o ID é o 68, ou seja.. vai ter que colocar ainda isso

- '68:0'
- '68:1'
- '68:2'
- '68:3'

@edit

na verdade, o 63 é para quando está no chão, e 68 para quando está na parede, acho que o 323 engloba tudo, sla bloqueia do 323:0 até o 323:11

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

Não tenho a certeza, mas se você não especificar a data na config, você seta a data para 0.

A placa, tocha, e vara do end têm id's diferentes dependendo da posição que eles são colocados, se você colocar uma placa virada para norte, sul, etc..

Se você colocar uma placa para norte irá ter o ID 323:1 , para sul irá ter 323:2 (exemplo, não deve ser assim), e como você não especificou a data na config, só irá ser bloqueado 323:0

Acho que é isso, para arrumar ou muda o código não sei como, porque isso é do @leonardosc e ele só usa código complicado, ou na config coloca isso tudo

- '323:0'
- '323:1'
- '323:2'
- '323:3'
- '323:4'
- '323:5'
- '323:6'
- '323:7'

ah, a placa tb tem outro id, quando é colocada numa parede, o ID é o 68, ou seja.. vai ter que colocar ainda isso

- '68:0'
- '68:1'
- '68:2'
- '68:3'

@edit

na verdade, o 63 é para quando está no chão, e 68 para quando está na parede, acho que o 323 engloba tudo, sla bloqueia do 323:0 até o 323:11

 

Não é código complicado, é código bom, não gambiarrado ,-,

 

@Topic

Tu tem que especificar o "data value" do item, caso não seja zero, se não não vai funcionar. 

Link para o comentário
Compartilhar em outros sites

É só não complicar as coisas. 

// Pega diretamente a lista de blocos permitidos
List<String> permitidos = getConfig().getStringList("blocos-permitidos");

// Gerar o 'hash' do bloco, com id e data
String hash = Integer.toString(block.getTypeId());
if (block.getData() != 0)
    hash += ":" + block.getData();

if (permitidos.contains(hash)) {
    // permitido
} else {
    // nao permitido
}

// Ou seja, se tiver só 35 vai funcionar, se tiver 35:14 vai funcionar tbm
Link para o comentário
Compartilhar em outros sites

 

É só não complicar as coisas. 

// Pega diretamente a lista de blocos permitidos
List<String> permitidos = getConfig().getStringList("blocos-permitidos");

// Gerar o 'hash' do bloco, com id e data
String hash = Integer.toString(block.getTypeId());
if (block.getData() != 0)
    hash += ":" + block.getData();

if (permitidos.contains(hash)) {
    // permitido
} else {
    // nao permitido
}

// Ou seja, se tiver só 35 vai funcionar, se tiver 35:14 vai funcionar tbm

 

Teu código faz exatamente a mesma coisa que o meu e é pior.

 

É só não complicar as coisas. 

// Pega diretamente a lista de blocos permitidos
List<String> permitidos = getConfig().getStringList("blocos-permitidos");

// Gerar o 'hash' do bloco, com id e data
String hash = Integer.toString(block.getTypeId());
if (block.getData() != 0)
    hash += ":" + block.getData();

if (permitidos.contains(hash)) {
    // permitido
} else {
    // nao permitido
}

// Ou seja, se tiver só 35 vai funcionar, se tiver 35:14 vai funcionar tbm

 

Teu código faz exatamente a mesma coisa que o meu e é pior.

 

Tem alguma forma para que quando na config não estiver especificado o data value do bloco ele funcione com todos os data values possíveis?

 

Vou ver se faço isso sem piorar a performance do meu código.

Link para o comentário
Compartilhar em outros sites

Quero medir nada não mano, cada um ajudou de um jeito e pronto. Seu código é melhor que o meu? Parabéns.

 

Quer medir mede direito, tu acha que executar 1 vez vai dar um dado preciso? executa 1 milhão de vezes

 

9wOGP4f.png

 

Isso é só com 50 blocos, caso tu não saiba, o contains do hashset é O(1), diferente do da arraylist que é O(n), ou seja, quando mais bloco mais tempo O SEU CÓDIGO demora pra executar, diferente da hashset que é "fixo".

Link para o comentário
Compartilhar em outros sites

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