Blöcke mit Prozenten setzen

Wenn ihr bei eurem Plugin nicht weiter kommt, könnt ihr hier euer Problem beschreiben und um Hilfe bitten.

Blöcke mit Prozenten setzen

Beitragvon Homerlator » Fr 19. Aug 2016, 12:47

Hallo ich habe mal wieder ein kleines Problem :D ,
ich programmiere zurzeit ein Minigame dort sollen Blöcke nach Prozent angaben gesetzt werden wie bei WorldEdit.

Ich habe mir das Video von Postcrafter angesehen https://www.youtube.com/watch?v=xxzrLHDrJ-A&index=20&list=PLjoTjjrsr0yYl-PE3VUJ7J4MTdq5XWQ-H
ich habe aber keine einzige Idee wie ich das mit den Prozenten machen soll.
Es soll dan ungefähr so aussehen:
Bild

Das ist der Code von PostCrafter:

Code: Alles auswählen
  1.    public void set(Material m, byte d){
  2.       for(int x = this.minX; x <= this.maxX; x++){
  3.          for(int y = this.minY; y <= this.maxY; y++){
  4.             for(int z = this.minZ; z <= this.maxZ; z++){
  5.                Block b = this.world.getBlockAt(x, y, z);
  6.                b.setType(m);
  7.                b.setData(d);
  8.             }
  9.          }
  10.       }
  11.    }


So sollen zum Beispiel die Prozente aussehen:

5% Eisenerz
10% Redstoneerz
3% Diamanterz
15% Kohleerz
67% Stein

Ich hoffe ihr könnt mir helfen.
Benutzeravatar
Homerlator
 
Beiträge: 41
Registriert: Fr 25. Mär 2016, 22:33
Wohnort: Gemünden

Re: Blöcke mit Prozenten setzen

Beitragvon Knadda » Fr 19. Aug 2016, 16:34

Probiere es mal damit :D :
Code: Alles auswählen
  1.    // Beispiel: 5%15:0,10%73:0,3%56:0,15%16:0,67%1:0
  2.    @SuppressWarnings("deprecation")
  3.    public void fillBlocks(final Location pos1, final Location pos2, final String blocks) {
  4.       final Vector max = new Vector(Math.max(pos1.getX(), pos2.getX()), Math.max(pos1.getY(), pos2.getY()), Math.max(pos1.getZ(), pos2.getZ()));
  5.       final Vector min = new Vector(Math.min(pos1.getX(), pos2.getX()), Math.min(pos1.getY(), pos2.getY()), Math.min(pos1.getZ(), pos2.getZ()));
  6.       if (blocks != null && blocks.isEmpty() == false && pos1 != null && pos2 != null && pos1.getWorld().equals(pos2.getWorld())) {
  7.          final Map<MaterialData, Integer> blockData = Maps.newHashMap();
  8.          final int amount = (int)((max.getX() - min.getX() + 1.0D) * (max.getY() - min.getY() + 1.0D) * (max.getZ() - min.getZ() + 1.0D));
  9.          if (blocks.contains(",")) {
  10.             for (final String values : blocks.split(",")) {
  11.                if ((values.contains("%") && values.contains(":")) == false) {
  12.                   throw new IllegalArgumentException();
  13.                }
  14.                try {
  15.                   final int prozent = Integer.valueOf(values.split("%")[0]);
  16.                   final Material type = Material.getMaterial(Integer.valueOf(values.split("%")[1].split(":")[0]));
  17.                   final int data = Integer.valueOf(values.split(":")[1]);
  18.                   blockData.put(new MaterialData(type, (byte) data), (int) (Math.round(amount/100.00D)*prozent));
  19.                } catch(final NumberFormatException e) {
  20.                }
  21.             }
  22.          } else {
  23.             if ((blocks.contains("%") && blocks.contains(":")) == false) {
  24.                throw new IllegalArgumentException();
  25.             }
  26.             try {
  27.                final int prozent = Integer.valueOf(blocks.split("%")[0]);
  28.                final Material type = Material.getMaterial(Integer.valueOf(blocks.split("%")[1].split(":")[0]));
  29.                final int data = Integer.valueOf(blocks.split(":")[1]);
  30.                blockData.put(new MaterialData(type, (byte) data), (int) (Math.round(amount/100.00D)*prozent));
  31.             } catch(final NumberFormatException e) {
  32.             }
  33.          }
  34.          final Random rnd = new Random();
  35.          for (int x = min.getBlockX(); x <= max.getBlockX(); x++) {
  36.             for (int y = min.getBlockY(); y <= max.getBlockY(); y++) {
  37.                for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
  38.                   final Block b = new Location(pos1.getWorld(), x, y, z).getBlock();
  39.                   MaterialData data = null;
  40.                   int a = 0;
  41.                   for (final Entry<MaterialData, Integer> entry : blockData.entrySet()) {
  42.                      a = Math.max(a, entry.getValue());
  43.                   }
  44.                   final int blockcount = rnd.nextInt(a);
  45.                   for (final Entry<MaterialData, Integer> entry : blockData.entrySet()) {
  46.                      System.err.println(entry.getKey().getItemType().name()+" "+(100.00D/amount*blockcount)+" <= "+(100.00D/amount*entry.getValue()));
  47.                      if (100.00D/amount*blockcount <= 100.00D/amount*entry.getValue()) {
  48.                         data = entry.getKey();
  49.                         break;
  50.                      }
  51.                   }
  52.                   System.err.println("data "+data);
  53.                   if (data != null) {
  54.                      b.setType(data.getItemType());
  55.                      b.setData(data.getData());
  56.                   }
  57.                }
  58.             }
  59.          }
  60.       }
  61.    }
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Blöcke mit Prozenten setzen

Beitragvon Homerlator » Fr 19. Aug 2016, 19:04

Hat funktioniert vielen Dank! :)
Benutzeravatar
Homerlator
 
Beiträge: 41
Registriert: Fr 25. Mär 2016, 22:33
Wohnort: Gemünden

Re: Blöcke mit Prozenten setzen

Beitragvon Knadda » Fr 19. Aug 2016, 19:09

Np Wenn du fragen hast schreib mich ruhig in Skype an (Tobias Mening mit der JavaTasse)
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Blöcke mit Prozenten setzen

Beitragvon Homerlator » Fr 19. Aug 2016, 22:59

Hey ich habe doch noch ein Problem mit deinem Code :lol:

also wenn ich jetzt 50%1:0,50%4:0 eingebe wird nur stein gesetzt also 1.
Benutzeravatar
Homerlator
 
Beiträge: 41
Registriert: Fr 25. Mär 2016, 22:33
Wohnort: Gemünden

Re: Blöcke mit Prozenten setzen

Beitragvon Knadda » Sa 20. Aug 2016, 23:55

Hab sie etwas umgeschrieben :D
Jetzt funktioniert es:

Code: Alles auswählen
  1.    // Beispiel: 5%15:0,10%73:0,3%56:0,15%16:0,67%1:0
  2.    @SuppressWarnings("deprecation")
  3.    public void fillBlocks(final Location pos1, final Location pos2, final String blocks) {
  4.       final Vector max = new Vector(Math.max(pos1.getX(), pos2.getX()), Math.max(pos1.getY(), pos2.getY()), Math.max(pos1.getZ(), pos2.getZ()));
  5.       final Vector min = new Vector(Math.min(pos1.getX(), pos2.getX()), Math.min(pos1.getY(), pos2.getY()), Math.min(pos1.getZ(), pos2.getZ()));
  6.       if (blocks != null && blocks.isEmpty() == false && pos1 != null && pos2 != null && pos1.getWorld().equals(pos2.getWorld())) {
  7.          final Map<MaterialData, Integer> blockData = Maps.newHashMap();
  8.          final int amount = (int)((max.getX() - min.getX() + 1.0D) * (max.getY() - min.getY() + 1.0D) * (max.getZ() - min.getZ() + 1.0D));
  9.          if (blocks.contains(",")) {
  10.             for (final String values : blocks.split(",")) {
  11.                if ((values.contains("%") && values.contains(":")) == false) {
  12.                   throw new IllegalArgumentException();
  13.                }
  14.                try {
  15.                   final int prozent = Integer.valueOf(values.split("%")[0]);
  16.                   final Material type = Material.getMaterial(Integer.valueOf(values.split("%")[1].split(":")[0]));
  17.                   final int data = Integer.valueOf(values.split(":")[1]);
  18.                   blockData.put(new MaterialData(type, (byte) data), (int) ((Math.round((amount/100.00D)*prozent))+1));
  19.                } catch(final NumberFormatException e) {
  20.                }
  21.             }
  22.          } else {
  23.             if ((blocks.contains("%") && blocks.contains(":")) == false) {
  24.                throw new IllegalArgumentException();
  25.             }
  26.                try {
  27.                   final int prozent = Integer.valueOf(blocks.split("%")[0]);
  28.                   final Material type = Material.getMaterial(Integer.valueOf(blocks.split("%")[1].split(":")[0]));
  29.                   final int data = Integer.valueOf(blocks.split(":")[1]);
  30.                   blockData.put(new MaterialData(type, (byte) data), (int) ((Math.round((amount/100.00D)*prozent))+1));
  31.                } catch(final NumberFormatException e) {
  32.                }
  33.          }
  34.          final Random rnd = new Random();
  35.          final List<Location> locs = Lists.newArrayList();
  36.          for (int x = min.getBlockX(); x <= max.getBlockX(); x++) {
  37.                for (int y = min.getBlockY(); y <= max.getBlockY(); y++) {
  38.                   for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) {
  39.                      locs.add(new Location(pos1.getWorld(), x, y, z));
  40.                   }
  41.                }
  42.          }
  43.          while(locs.isEmpty() == false) {
  44.             final int index = rnd.nextInt(locs.size());
  45.             final Location loc = locs.get(index);
  46.             locs.remove(index);
  47.               final Block b = loc.getBlock();
  48.               MaterialData data = null;
  49.               for (final Entry<MaterialData, Integer> entry : blockData.entrySet()) {
  50.                  if (entry.getValue() > 0) {
  51.                     data = entry.getKey();
  52.                     blockData.put(data, entry.getValue()-1);
  53.                     break;
  54.                  }
  55.               }
  56.               if (data != null) {
  57.                  b.setType(data.getItemType());
  58.                  b.setData(data.getData());
  59.               }
  60.          }
  61.       }
  62.    }
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06


Zurück zu Hilfe und Support

Wer ist online?

Mitglieder in diesem Forum: Google [Bot], MSN [Bot] und 14 Gäste

cron