diff --git a/.github/workflows/buildtools.sh b/.github/workflows/buildtools.sh
index 24294de..b07819f 100644
--- a/.github/workflows/buildtools.sh
+++ b/.github/workflows/buildtools.sh
@@ -27,4 +27,5 @@ checkVersion () {
checkVersion "1.19" "17"
checkVersion "1.19.3" "17"
-checkVersion "1.19.4" "17"
\ No newline at end of file
+checkVersion "1.19.4" "17"
+checkVersion "1.20" "17"
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 31798ec..5145f2b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,9 +29,9 @@
1.2.7
1.2.4
- 16
- 16
- 16
+ 17
+ 17
+ 17
UTF-8
@@ -56,7 +56,7 @@
maven-compiler-plugin
${plugin.compile.version}
- 16
+ 17
diff --git a/zip-nms/pom.xml b/zip-nms/pom.xml
index 0d45189..c1c1f02 100644
--- a/zip-nms/pom.xml
+++ b/zip-nms/pom.xml
@@ -15,5 +15,6 @@
zip-nms-v1_19_R1
zip-nms-v1_19_R2
zip-nms-v1_19_R3
+ zip-nms-v1_20_R1
\ No newline at end of file
diff --git a/zip-nms/zip-nms-v1_20_R1/pom.xml b/zip-nms/zip-nms-v1_20_R1/pom.xml
new file mode 100644
index 0000000..59faf60
--- /dev/null
+++ b/zip-nms/zip-nms-v1_20_R1/pom.xml
@@ -0,0 +1,66 @@
+
+ 4.0.0
+
+
+ net.imprex
+ zip-nms
+ ${revision}
+
+
+ zip-nms-v1_20_R1
+ jar
+
+
+
+ net.imprex
+ zip-nms-api
+ ${revision}
+ provided
+
+
+ org.spigotmc
+ spigot
+ 1.20-R0.1-SNAPSHOT
+ remapped-mojang
+ provided
+
+
+
+
+
+
+ net.md-5
+ specialsource-maven-plugin
+ ${plugin.specialsource.version}
+
+
+ package
+
+ remap
+
+ remap-obf
+
+ org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:txt:maps-mojang
+ true
+ org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-mojang
+ true
+ remapped-obf
+
+
+
+ package
+
+ remap
+
+ remap-spigot
+
+ ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
+ org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:csrg:maps-spigot
+ org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-obf
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/zip-nms/zip-nms-v1_20_R1/src/main/java/net/imprex/zip/nms/v1_20_R1/ZipNmsManager.java b/zip-nms/zip-nms-v1_20_R1/src/main/java/net/imprex/zip/nms/v1_20_R1/ZipNmsManager.java
new file mode 100644
index 0000000..ecc1f92
--- /dev/null
+++ b/zip-nms/zip-nms-v1_20_R1/src/main/java/net/imprex/zip/nms/v1_20_R1/ZipNmsManager.java
@@ -0,0 +1,92 @@
+package net.imprex.zip.nms.v1_20_R1;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.bukkit.Material;
+import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.SkullMeta;
+
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+
+import net.imprex.zip.common.ReflectionUtil;
+import net.imprex.zip.nms.api.NmsManager;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.ListTag;
+import net.minecraft.nbt.NbtIo;
+import net.minecraft.nbt.Tag;
+
+public class ZipNmsManager implements NmsManager {
+
+ private static final Class> CRAFTMETASKULL_CLASS = ReflectionUtil.getCraftBukkitClass("inventory.CraftMetaSkull");
+ private static final Method CRAFTMETASKULL_SET_PROFILE = ReflectionUtil.getMethod(CRAFTMETASKULL_CLASS,
+ "setProfile", GameProfile.class);
+
+ public byte[] nbtToBinary(CompoundTag compound) {
+ try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
+ NbtIo.writeCompressed(compound, outputStream);
+ return outputStream.toByteArray();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public CompoundTag binaryToNBT(byte[] binary) {
+ try (ByteArrayInputStream inputStream = new ByteArrayInputStream(binary)) {
+ return NbtIo.readCompressed(inputStream);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return new CompoundTag();
+ }
+
+ @Override
+ public byte[] itemstackToBinary(ItemStack[] items) {
+ CompoundTag inventory = new CompoundTag();
+ ListTag list = new ListTag();
+ for (ItemStack itemStack : items) {
+ net.minecraft.world.item.ItemStack craftItem = CraftItemStack.asNMSCopy(itemStack);
+ list.add(craftItem.save(new CompoundTag()));
+ }
+ inventory.put("i", list);
+ return nbtToBinary(inventory);
+ }
+
+ @Override
+ public List binaryToItemStack(byte[] binary) {
+ CompoundTag nbt = binaryToNBT(binary);
+ List items = new ArrayList<>();
+ if (nbt.contains("i", 9)) {
+ ListTag list = nbt.getList("i", 10);
+ for (Tag base : list) {
+ if (base instanceof CompoundTag) {
+ items.add(CraftItemStack.asBukkitCopy(net.minecraft.world.item.ItemStack.of((CompoundTag) base)));
+ }
+ }
+ }
+ return items;
+ }
+
+ @Override
+ public void setSkullProfile(SkullMeta meta, String texture) {
+ try {
+ GameProfile gameProfile = new GameProfile(UUID.randomUUID(), "");
+ gameProfile.getProperties().put("textures", new Property("textures", texture));
+ CRAFTMETASKULL_SET_PROFILE.invoke(meta, gameProfile);
+ } catch (Exception e) {
+ throw new ClassCastException("Error by setting skull profile");
+ }
+ }
+
+ @Override
+ public boolean isAir(Material material) {
+ return material == null || material == Material.AIR;
+ }
+}
\ No newline at end of file
diff --git a/zip-plugin/pom.xml b/zip-plugin/pom.xml
index 766988a..24034a3 100644
--- a/zip-plugin/pom.xml
+++ b/zip-plugin/pom.xml
@@ -65,5 +65,11 @@
${revision}
compile
+
+ net.imprex
+ zip-nms-v1_20_R1
+ ${revision}
+ compile
+
\ No newline at end of file
diff --git a/zip-plugin/src/main/java/net/imprex/zip/UpdateSystem.java b/zip-plugin/src/main/java/net/imprex/zip/UpdateSystem.java
index 710eea3..b650306 100644
--- a/zip-plugin/src/main/java/net/imprex/zip/UpdateSystem.java
+++ b/zip-plugin/src/main/java/net/imprex/zip/UpdateSystem.java
@@ -26,7 +26,7 @@
/**
* @author Imprex-Development
- * @see https://github.com/Imprex-Development/orebfuscator/blob/master/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/UpdateSystem.java
+ * @see UpdateSystem.java
*/
public class UpdateSystem {
diff --git a/zip-plugin/src/main/resources/config/config-1.20.yml b/zip-plugin/src/main/resources/config/config-1.20.yml
new file mode 100644
index 0000000..b4b5562
--- /dev/null
+++ b/zip-plugin/src/main/resources/config/config-1.20.yml
@@ -0,0 +1,63 @@
+general:
+ checkForUpdates: true
+ verbose: false
+ locale: en_US
+type:
+ big:
+ uniqueName: 'big'
+ displayName: '&7Big &eBackpack'
+ inventoryRows: 6
+ customModelData: 3
+ texture: 'ewogICJ0aW1lc3RhbXAiIDogMTYzMzg2MjQwNTg4NSwKICAicHJvZmlsZUlkIiA6ICI1NjY3NWIyMjMyZjA0ZWUwODkxNzllOWM5MjA2Y2ZlOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGVJbmRyYSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9kYTMzMTY5YjcyY2Y4OTE4YjgyYzViZDI3Y2JhOWVlNmMwZWI4OTE2NDA0MDQ4MGJiMjdmODUzNGUwZmE1ODA3IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0='
+ lore:
+ - '&aA Big Backpack'
+ recipe:
+ discover: true
+ group: 'null'
+ patternOne: 'LCL'
+ patternTwo: 'ECE'
+ patternThree: 'DCD'
+ patternMapping:
+ L: LEATHER
+ E: LEAD
+ C: CHEST
+ D: DIAMOND
+ medium:
+ uniqueName: 'medium'
+ displayName: '&7Medium &eBackpack'
+ inventoryRows: 3
+ customModelData: 2
+ texture: 'ewogICJ0aW1lc3RhbXAiIDogMTY3NDM0NDQ0MzY4NywKICAicHJvZmlsZUlkIiA6ICIxMzdmMjg3MjUwOTE0ZmI4YjA0ZTYwYjg4MWUwZWE2YiIsCiAgInByb2ZpbGVOYW1lIiA6ICJub3JtYWxpc2luZyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lZjhlZDY4NWIzYzNjYWI4NDM1ZDBmNmIwZDJkZGI0NmRmYTNhYzk2ZmUyZjlhNmQ3NDhmNzExOTFjMGI1MjJiIgogICAgfQogIH0KfQ=='
+ lore:
+ - '&aA Medium Backpack'
+ recipe:
+ discover: true
+ group: 'null'
+ patternOne: 'LSL'
+ patternTwo: 'ECE'
+ patternThree: 'ICI'
+ patternMapping:
+ L: LEATHER
+ S: STICK
+ E: LEAD
+ C: CHEST
+ I: IRON_INGOT
+ small:
+ uniqueName: 'small'
+ displayName: '&7Small &eBackpack'
+ inventoryRows: 1
+ customModelData: 1
+ texture: 'ewogICJ0aW1lc3RhbXAiIDogMTYxMzM4Nzk2NDUxNSwKICAicHJvZmlsZUlkIiA6ICJkZTU3MWExMDJjYjg0ODgwOGZlN2M5ZjQ0OTZlY2RhZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNSEZfTWluZXNraW4iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGFlMTg3MTQ1ZWU3MzJlN2MwMDkwNWE5YzE2ZWQxZTQzYmE4OGQ1NjI0YTZmNGFmODI5ZjEwNDUzZmNjOTE2NSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9'
+ lore:
+ - '&aA Small Backpack'
+ recipe:
+ discover: true
+ group: 'null'
+ patternOne: 'LSL'
+ patternTwo: 'ECE'
+ patternThree: 'LLL'
+ patternMapping:
+ L: LEATHER
+ S: STICK
+ E: LEAD
+ C: CHEST
\ No newline at end of file