Schematic speichern

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

Schematic speichern

Beitragvon Letsplaybar » Mi 22. Jun 2016, 19:45

Hallo ich schreibe grade ein Plugin was täglich eine Farmwelt zurücksetzt. Nun soll der Spawn immer wieder hineinkopiert werden. Wie man das mit Schematics macht das sie reinkopiert werden weiß ich und klappt auch nur wie man sie Speichert nicht und finde ich auch nicht. Und ich möchte hierfür nicht worldedit verwenden wegen der Sicherheit. (Greefern).

Hier die Schematic klasse:
Code: Alles auswählen
  1. /**
  2. *
  3. */
  4. package de.letsplaybar.shematic;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. import org.bukkit.Location;
  11. import org.bukkit.World;
  12. import org.bukkit.block.Block;
  13. /**
  14. * @author Letsplaybar
  15. *
  16. */
  17. public class Schematic
  18. {
  19.     private short[] blocks;
  20.     private byte[] data;
  21.     private short width;
  22.     private short lenght;
  23.     private short height;
  24.     private byte[] addID;
  25.    
  26.     public Schematic(short[] blocks2, byte[] data, short width, short lenght, short height, byte[] addID)
  27.     {
  28.         this.blocks = blocks2;
  29.         this.data = data;
  30.         this.width = width;
  31.         this.lenght = lenght;
  32.         this.height = height;
  33.         this.addID = addID;
  34.     }
  35.     /**
  36.     * @return the blocks
  37.     */
  38.     public short[] getBlocks()
  39.     {
  40.         return blocks;
  41.     }
  42.    
  43.     public byte[] getaddId(){
  44.        return addID;
  45.     }
  46.     /**
  47.     * @return the data
  48.     */
  49.     public byte[] getData()
  50.     {
  51.         return data;
  52.     }
  53.     /**
  54.     * @return the width
  55.     */
  56.     public short getWidth()
  57.     {
  58.         return width;
  59.     }
  60.     /**
  61.     * @return the lenght
  62.     */
  63.     public short getLenght()
  64.     {
  65.         return lenght;
  66.     }
  67.     /**
  68.     * @return the height
  69.     */
  70.     public short getHeight()
  71.     {
  72.         return height;
  73.     }
  74.    
  75.    
  76.     @SuppressWarnings("resource")
  77.    public void save(File file) throws IOException, IllegalArgumentException, InstantiationException, IllegalAccessException{
  78.        
  79.          FileOutputStream stream = new FileOutputStream(file);
  80.          NBTOutputStream nbtStream = new NBTOutputStream(stream);
  81.           Map<String, Tag> schematic = new HashMap<String, Tag>();
  82.           schematic = setChildTag(schematic, "Width", getWidth(),null,"short");
  83.           schematic = setChildTag(schematic, "Length", getLenght(),null,"short");
  84.           schematic = setChildTag(schematic, "height", getHeight(),null,"short");
  85.          
  86.           short[] blocks = getBlocks();
  87.           byte[] addId = getaddId();
  88.           byte[] blocksID = new byte[blocks.length];
  89.           for (int index = 0; index < blocks.length; index++) {
  90.                   if ((index >> 1) >= addId.length) { // No corresponding AddBlocks index
  91.                      blocksID[index] = (byte) (blocks[index] & 0xFF);
  92.                   } else {
  93.                       if ((index & 1) == 0) {
  94.                          blocksID[index] = (byte) (((addId[index >> 1] & 0x0F) << 8) + (blocks[index] & 0xFF));
  95.                       } else {
  96.                          blocksID[index] = (byte) (((addId[index >> 1] & 0xF0) << 4) + (blocks[index] & 0xFF));
  97.                       }
  98.                   }
  99.               }
  100.           schematic = setChildTag(schematic, "Blocks",(short)0, blocksID,"byte");
  101.           schematic = setChildTag(schematic, "Data",(short)0, getData(),"byte");
  102.          
  103.          CompoundTag schematicTag = new CompoundTag("Schematic",schematic );
  104.          nbtStream.writeTag(schematicTag);
  105.       
  106.     }
  107.    
  108.    
  109.    
  110.        /**
  111.        * Get child tag of a NBT structure.
  112.        *
  113.        * @param items The parent tag map
  114.        * @param key The name of the tag to get
  115.        * @param expected The expected type of the tag
  116.        * @return child tag casted to the expected type
  117.        * @throws DataException if the tag does not exist or the tag is not of the
  118.        * expected type
  119.        */   
  120.        private static <T extends Tag> Map<String, Tag> setChildTag(Map<String, Tag> items, String key, short value,byte[] values,String tag ) throws IllegalArgumentException, InstantiationException, IllegalAccessException
  121.        {
  122.           if(tag.equalsIgnoreCase("short")){
  123.              items.put(key,new ShortTag(key, value));
  124.           }else if(tag.equalsIgnoreCase("byte")){
  125.              items.put(key,new ByteArrayTag(key, values));
  126.              }
  127.           
  128.           
  129.           
  130.            return items;
  131.        }
  132.    
  133.     @SuppressWarnings("deprecation")
  134.    public void pasteSchematic(World world, Location loc)
  135.     {
  136.         short[] blocks = getBlocks();
  137.         byte[] blockData = getData();
  138.         short length = getLenght();
  139.         short width = getWidth();
  140.         short height = getHeight();
  141.         for (int x = 0; x < width; ++x) {
  142.             for (int y = 0; y < height; ++y) {
  143.                 for (int z = 0; z < length; ++z) {
  144.                     int index = y * width * length + z * width + x;
  145.                     Block block = new Location(world, x + loc.getX(), y + loc.getY(), z + loc.getZ()).getBlock();
  146.                     block.setTypeIdAndData(blocks[index], blockData[index], true);
  147.                 }
  148.             }
  149.         }
  150.     }
  151.    
  152.    
  153. }
  154.    
  155.    


die Save methode hab ich rück entwickelt von ner methode wie man ne schematic datei in eine Schamatic obj umwandeln kann. weil rein logisch müsste es ja rückwärts dann auch Klappen sie zu speichern, aber die gespeicherte datei ist leer.

Hier noch die Methode um aus einer Region die mit 2 Locations festgesetzt wird das Schematics obj. erzeugt wird:
Code: Alles auswählen
  1. @SuppressWarnings("deprecation")
  2.       private Schematic copySchematic(Location loc1, Location loc2){
  3.           Location min = new Location(loc1.getWorld(), Math.min(loc1.getBlockX(), loc2.getBlockX()), Math.min(loc1.getBlockY(), loc2.getBlockY()), Math.min(loc1.getBlockY(), loc2.getBlockY()));
  4.           Location max = new Location(loc1.getWorld(), Math.max(loc1.getBlockX(), loc2.getBlockX()), Math.max(loc1.getBlockY(), loc2.getBlockY()), Math.max(loc1.getBlockY(), loc2.getBlockY()));
  5.           
  6.           ArrayList<Short> blockss = new ArrayList<Short>();
  7.           ArrayList<Byte> blockDatas = new ArrayList<Byte>();
  8.           
  9.           
  10.           for(int x = min.getBlockX();x < max.getBlockX();x++){
  11.              for(int y = min.getBlockY();y < max.getBlockY();y++){
  12.                 for(int z = min.getBlockZ();z < max.getBlockZ();z++){
  13.                     Block b = new Location(loc1.getWorld(), x, y, z).getBlock();
  14.                     blockss.add((short) b.getTypeId());
  15.                     blockDatas.add(b.getData());
  16.                  }
  17.               }
  18.           }
  19.           
  20.           
  21.           short[] blocks = new short[blockss.size()];
  22.            byte[] blockData = new byte[blockDatas.size()];
  23.           
  24.            for(int i = 0; i < blockDatas.size(); i++){
  25.               blocks[i] = blockss.get(i);
  26.               blockData[i] = blockDatas.get(i);
  27.            }
  28.    
  29.            short length = (short) (max.getBlockZ() - min.getBlockZ());
  30.            short width = (short)(max.getBlockX()-min.getBlockX());
  31.            short height = (short)(max.getBlockY()-min.getBlockY());
  32.           
  33.           
  34.           byte[] addId = new byte[0];
  35.           
  36.           return new Schematic(blocks, blockData, width, length, height, addId);
  37.        }

vielleicht liegt es ja auch hier dran...
Fehler wird keiner ausgespuckt aber es klappt halt auch nicht
Bild
Helfe Wo ich kann.
Mein MinecraftServer: Letsplaybaro.de - Suchen Developer/Bilder

I hacked 127.0.0.1!!! :)
Benutzeravatar
Letsplaybar
 
Beiträge: 195
Registriert: Mo 1. Feb 2016, 17:21
Wohnort: Berlin

Re: Schematic speichern

Beitragvon Kampfprofessor » Do 23. Jun 2016, 11:39

Benutzeravatar
Kampfprofessor
 
Beiträge: 71
Registriert: Fr 12. Feb 2016, 15:48

Re: Schematic speichern

Beitragvon Letsplaybar » Do 23. Jun 2016, 13:01

Nope der zweite Link hat garnichts damit zutuen und der 1. macht es mit worldedit. dieses möchte ich aber aus Sicherheitsgründen nicht nutzen...
Trotzdem danke
Bild
Helfe Wo ich kann.
Mein MinecraftServer: Letsplaybaro.de - Suchen Developer/Bilder

I hacked 127.0.0.1!!! :)
Benutzeravatar
Letsplaybar
 
Beiträge: 195
Registriert: Mo 1. Feb 2016, 17:21
Wohnort: Berlin

Re: Schematic speichern

Beitragvon DevToLearn » Di 12. Jul 2016, 08:56

Ganz einfach... Du erstellst eine Welt, in welcher sich dein Spawn befindet. Dort speicherst du wie bei WE die beiden Eckpunkte ab und kopierst ihn dann einfach in die Welt in der du den Spawn haben möchtest. Das spart dir das Speichern von Schemetics, da diese auch sehr groß werden können.
Benutzeravatar
DevToLearn
 
Beiträge: 15
Registriert: So 13. Mär 2016, 10:20

Re: Schematic speichern

Beitragvon Letsplaybar » Mi 13. Jul 2016, 06:48

Nein so möchte ich das aber nicht da es recht unkonventionell ist. Schematics sorgen dafür das man eine Unbeschädigte Kopie hat die immer reingefügt wird und bei der Variante könnten Fehler mitgeschleppt werden die im nachhinein endstehen. dies macht im nachhinein nur probleme zumal ich schematics schon pasten kann halt nur nicht speichern. Weshalb auch dieser post.
Bild
Helfe Wo ich kann.
Mein MinecraftServer: Letsplaybaro.de - Suchen Developer/Bilder

I hacked 127.0.0.1!!! :)
Benutzeravatar
Letsplaybar
 
Beiträge: 195
Registriert: Mo 1. Feb 2016, 17:21
Wohnort: Berlin

Re: Schematic speichern

Beitragvon Knadda » Mo 1. Aug 2016, 07:10

Ich hab etwas für dich geschrieben. :D es ist aber etwas größer als deins, speichert aber dafür die datei kleiner ab. Add mich einfach in skype, falls du es noch benötigst.

Skype: Tobias Meding
MfG Knadda
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Schematic speichern

Beitragvon Letsplaybar » Di 2. Aug 2016, 13:51

Re Knada welcher von den 3 bist du??? ich hätte die Klasse gerne.
Gruß Letsplaybar
Bild
Helfe Wo ich kann.
Mein MinecraftServer: Letsplaybaro.de - Suchen Developer/Bilder

I hacked 127.0.0.1!!! :)
Benutzeravatar
Letsplaybar
 
Beiträge: 195
Registriert: Mo 1. Feb 2016, 17:21
Wohnort: Berlin

Re: Schematic speichern

Beitragvon Knadda » Mi 3. Aug 2016, 06:17

Re Letsplaybar Der mit der Javatasse :)
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: Bing [Bot] und 24 Gäste

cron