From ce14c20126ff311a115b6a462de48246d4c1fc19 Mon Sep 17 00:00:00 2001 From: BONNe Date: Tue, 7 Jul 2020 11:58:09 +0300 Subject: [PATCH] Update to BentoBox 1.14-SNAPSHOT API. Implement new API features. Replace deprecated methods. Add compatibility layer with Minecraft 1.16 version. --- pom.xml | 2 +- .../challenges/ChallengesManager.java | 10 +- .../challenges/database/object/Challenge.java | 4 + .../database/object/ChallengeLevel.java | 2 + .../database/object/ChallengesPlayerData.java | 2 + .../adapters/EntityCompatibilityAdapter.java | 92 +++++++++++++++++++ .../requirements/IslandRequirements.java | 4 + src/main/resources/addon.yml | 50 +--------- 8 files changed, 115 insertions(+), 51 deletions(-) create mode 100644 src/main/java/world/bentobox/challenges/database/object/adapters/EntityCompatibilityAdapter.java diff --git a/pom.xml b/pom.xml index f721293..ac80278 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ 2.0.2 1.15.2-R0.1-SNAPSHOT - 1.13.1 + 1.14.0-SNAPSHOT 1.6.0 1.7 diff --git a/src/main/java/world/bentobox/challenges/ChallengesManager.java b/src/main/java/world/bentobox/challenges/ChallengesManager.java index 522b61c..f522c67 100644 --- a/src/main/java/world/bentobox/challenges/ChallengesManager.java +++ b/src/main/java/world/bentobox/challenges/ChallengesManager.java @@ -549,7 +549,7 @@ public class ChallengesManager { // Create the player data ChallengesPlayerData pd = new ChallengesPlayerData(uniqueID); - this.playersDatabase.saveObject(pd); + this.playersDatabase.saveObjectAsync(pd); // Add to cache this.playerCacheData.put(uniqueID, pd); } @@ -696,7 +696,7 @@ public class ChallengesManager challengesID.forEach(challenge -> level.getChallenges().add(addonName + challenge.substring(world.getName().length()))); - this.levelDatabase.saveObject(level); + this.levelDatabase.saveObjectAsync(level); this.levelCacheData.put(level.getUniqueId(), level); updated = true; @@ -740,7 +740,7 @@ public class ChallengesManager updated = true; - this.challengeDatabase.saveObject(challenge); + this.challengeDatabase.saveObjectAsync(challenge); this.challengeCacheData.put(challenge.getUniqueId(), challenge); } @@ -783,7 +783,7 @@ public class ChallengesManager // This save should not involve any upgrades in other parts. - this.challengeDatabase.saveObject(challenge); + this.challengeDatabase.saveObjectAsync(challenge); this.challengeCacheData.put(challenge.getUniqueId(), challenge); } } @@ -834,7 +834,7 @@ public class ChallengesManager } }); - this.playersDatabase.saveObject(playerData); + this.playersDatabase.saveObjectAsync(playerData); }); } diff --git a/src/main/java/world/bentobox/challenges/database/object/Challenge.java b/src/main/java/world/bentobox/challenges/database/object/Challenge.java index cff291f..a8990cc 100644 --- a/src/main/java/world/bentobox/challenges/database/object/Challenge.java +++ b/src/main/java/world/bentobox/challenges/database/object/Challenge.java @@ -19,6 +19,8 @@ import com.google.gson.annotations.Expose; import com.google.gson.annotations.JsonAdapter; import world.bentobox.bentobox.database.objects.DataObject; +import world.bentobox.bentobox.database.objects.Table; +import world.bentobox.challenges.database.object.adapters.EntityCompatibilityAdapter; import world.bentobox.challenges.database.object.adapters.RequirementsAdapter; import world.bentobox.challenges.database.object.requirements.Requirements; @@ -28,6 +30,7 @@ import world.bentobox.challenges.database.object.requirements.Requirements; * @author tastybento * */ +@Table(name = "Challenge") public class Challenge implements DataObject { /** @@ -156,6 +159,7 @@ public class Challenge implements DataObject @Deprecated @Expose + @JsonAdapter(EntityCompatibilityAdapter.class) private Map requiredEntities = new EnumMap<>(EntityType.class); @Deprecated diff --git a/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java b/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java index 7fb26bf..63c108d 100644 --- a/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java +++ b/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java @@ -14,6 +14,7 @@ import com.google.gson.annotations.Expose; import world.bentobox.bentobox.api.configuration.ConfigComment; import world.bentobox.bentobox.database.objects.DataObject; +import world.bentobox.bentobox.database.objects.Table; import world.bentobox.challenges.ChallengesManager; /** @@ -21,6 +22,7 @@ import world.bentobox.challenges.ChallengesManager; * @author tastybento * */ +@Table(name = "ChallengeLevel") public class ChallengeLevel implements DataObject, Comparable { /** diff --git a/src/main/java/world/bentobox/challenges/database/object/ChallengesPlayerData.java b/src/main/java/world/bentobox/challenges/database/object/ChallengesPlayerData.java index db306a9..c1de447 100644 --- a/src/main/java/world/bentobox/challenges/database/object/ChallengesPlayerData.java +++ b/src/main/java/world/bentobox/challenges/database/object/ChallengesPlayerData.java @@ -14,6 +14,7 @@ import com.google.gson.annotations.Expose; import world.bentobox.bentobox.api.logs.LogEntry; import world.bentobox.bentobox.database.objects.DataObject; +import world.bentobox.bentobox.database.objects.Table; import world.bentobox.bentobox.database.objects.adapters.Adapter; import world.bentobox.bentobox.database.objects.adapters.LogEntryListAdapter; @@ -23,6 +24,7 @@ import world.bentobox.bentobox.database.objects.adapters.LogEntryListAdapter; * @author tastybento * */ +@Table(name = "ChallengesPlayerData") public class ChallengesPlayerData implements DataObject { /** diff --git a/src/main/java/world/bentobox/challenges/database/object/adapters/EntityCompatibilityAdapter.java b/src/main/java/world/bentobox/challenges/database/object/adapters/EntityCompatibilityAdapter.java new file mode 100644 index 0000000..b64a32f --- /dev/null +++ b/src/main/java/world/bentobox/challenges/database/object/adapters/EntityCompatibilityAdapter.java @@ -0,0 +1,92 @@ +// +// Created by BONNe +// Copyright - 2020 +// + + +package world.bentobox.challenges.database.object.adapters; + + +import com.google.gson.*; +import org.bukkit.entity.EntityType; +import java.lang.reflect.Type; +import java.util.EnumMap; +import java.util.Map; + +import world.bentobox.bentobox.BentoBox; + + +/** + * This is compatibility class for dealing with Mojang renamed entities. + * Created for update 1.16. + */ +public class EntityCompatibilityAdapter implements + JsonSerializer>, JsonDeserializer> +{ + /** + * This method serializes input map as String Key and Integer value. + * @param src EnumMap that contains EntityType as key and Integer as value. + * @return serialized JsonElement. + */ + @Override + public JsonElement serialize(Map src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject jsonArray = new JsonObject(); + + src.forEach((entity, number) -> + { + jsonArray.addProperty(entity.name(), number); + }); + + return jsonArray; + } + + + /** + * This method deserializes json object that stores Entity Name and amount as integer. + * @param json Json element that must be parsed. + * @return EnumMap that contains EntityType as key and Integer as value. + * @throws JsonParseException + */ + @Override + public Map deserialize(JsonElement json, + Type typeOfT, + JsonDeserializationContext context) + throws JsonParseException + { + Map map = new EnumMap<>(EntityType.class); + + for (Map.Entry entrySet : json.getAsJsonObject().entrySet()) + { + try + { + EntityType entityType = EntityType.valueOf(entrySet.getKey()); + map.put(entityType, entrySet.getValue().getAsInt()); + } + catch (IllegalArgumentException e) + { + if (entrySet.getKey().equals("PIG_ZOMBIE")) + { + // Hacky way how to get new entity name. + map.put(EntityType.valueOf("ZOMBIFIED_PIGLIN"), + entrySet.getValue().getAsInt()); + } + else if (entrySet.getKey().equals("ZOMBIFIED_PIGLIN")) + { + // Hacky way how to get new entity name. + map.put(EntityType.valueOf("PIG_ZOMBIE"), + entrySet.getValue().getAsInt()); + } + else + { + // No replacement for new entities in older server. + BentoBox.getInstance().logWarning("[ChallengesAddon] Entity with name `" + + entrySet.getKey() + "` does not exist in your Minecraft server version." + + " It will be skipped!"); + } + } + } + + return map; + } +} \ No newline at end of file diff --git a/src/main/java/world/bentobox/challenges/database/object/requirements/IslandRequirements.java b/src/main/java/world/bentobox/challenges/database/object/requirements/IslandRequirements.java index dac9ab4..196c8a6 100644 --- a/src/main/java/world/bentobox/challenges/database/object/requirements/IslandRequirements.java +++ b/src/main/java/world/bentobox/challenges/database/object/requirements/IslandRequirements.java @@ -16,6 +16,9 @@ import org.bukkit.Material; import org.bukkit.entity.EntityType; import com.google.gson.annotations.Expose; +import com.google.gson.annotations.JsonAdapter; + +import world.bentobox.challenges.database.object.adapters.EntityCompatibilityAdapter; /** @@ -193,6 +196,7 @@ public class IslandRequirements extends Requirements * Map that contains which entities and how many is necessary around player to complete challenge. */ @Expose + @JsonAdapter(EntityCompatibilityAdapter.class) private Map requiredEntities = new EnumMap<>(EntityType.class); /** diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 2a96852..c43b240 100755 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -1,7 +1,7 @@ name: Challenges main: world.bentobox.challenges.ChallengesAddon version: ${version}${build.number} -api-version: 1.13.1 +api-version: 1.14 repository: 'BentoBoxWorld/Challenges' metrics: true @@ -19,52 +19,12 @@ permissions: description: Let the player use the '/challenges' command default: true - bskyblock.challenges: + '[gamemode].challenges': description: Let the player use the '/island challenges' command default: true - bskyblock.challenges.multiple: + '[gamemode].challenges.multiple': description: Let the player complete challenge multiple times default: true - bskyblock.admin.challenges: + '[gamemode].admin.challenges': description: Access challenge admin commands - default: op - - acidisland.challenges: - description: Let the player use the '/ai challenges' command - default: true - acidisland.challenges.multiple: - description: Let the player complete challenge multiple times - default: true - acidisland.admin.challenges: - description: Access challenge admin commands - default: op - - caveblock.challenges: - description: Let the player use the '/cave challenges' command - default: true - caveblock.challenges.multiple: - description: Let the player complete challenge multiple times - default: true - caveblock.admin.challenges: - description: Access challenge admin commands - default: op - - skygrid.challenges: - description: Let the player use the '/skygrid challenges' command - default: true - skygrid.challenges.multiple: - description: Let the player complete challenge multiple times - default: true - skygrid.admin.challenges: - description: Access challenge admin commands - default: op - - aoneblock.challenges: - description: Let the player use the '/aoneblock challenges' command - default: true - aoneblock.challenges.multiple: - description: Let the player complete challenge multiple times - default: true - aoneblock.admin.challenges: - description: Access challenge admin commands - default: op + default: op \ No newline at end of file