From dfc4652da78c849c38a150aeb92d0edfedd9c62d Mon Sep 17 00:00:00 2001 From: RK_01 Date: Wed, 12 Aug 2020 16:38:21 +0200 Subject: [PATCH 1/3] added 1.12 -> 1.11.1 achievement message translation --- .../Protocol1_12To1_11_1.java | 7 +- .../TranslateRewriter.java | 75 +++++++- .../data/AchievementTranslationMapping.java | 181 ++++++++++++++++++ 3 files changed, 255 insertions(+), 8 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/data/AchievementTranslationMapping.java diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java index 1e87354f4..978ee03c6 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java @@ -81,12 +81,9 @@ public class Protocol1_12To1_11_1 extends Protocol ACHIEVEMENTS = new Object2ObjectOpenHashMap<>(150, 1.0f); + private static final ObjectArrayList SPECIAL_ACHIEVEMENTS = new ObjectArrayList<>(10); + + static { + add("chat.type.achievement", "%s has just earned the achievement %s"); + add("chat.type.achievement.taken", "%s has lost the achievement %s"); + add("stats.tooltip.type.achievement", "Achievement"); + add("stats.tooltip.type.statistic", "Statistic"); + add("stat.generalButton", "General"); + add("stat.blocksButton", "Blocks"); + add("stat.itemsButton", "Items"); + add("stat.mobsButton", "Mobs"); + add("stat.used", "Times Used"); + add("stat.mined", "Times Mined"); + add("stat.depleted", "Times Depleted"); + add("stat.crafted", "Times Crafted"); + add("stat.entityKills", "You killed %s %s"); + add("stat.entityKilledBy", "%s killed you %s time(s)"); + add("stat.entityKills.none", "You have never killed %s"); + add("stat.entityKilledBy.none", "You have never been killed by %s"); + add("stat.startGame", "Times Played"); + add("stat.createWorld", "Worlds Created"); + add("stat.loadWorld", "Saves Loaded"); + add("stat.joinMultiplayer", "Multiplayer Joins"); + add("stat.leaveGame", "Games Quit"); + add("stat.playOneMinute", "Minutes Played"); + add("stat.timeSinceDeath", "Since Last Death"); + add("stat.sneakTime", "Sneak Time"); + add("stat.walkOneCm", "Distance Walked"); + add("stat.crouchOneCm", "Distance Crouched"); + add("stat.sprintOneCm", "Distance Sprinted"); + add("stat.fallOneCm", "Distance Fallen"); + add("stat.swimOneCm", "Distance Swum"); + add("stat.flyOneCm", "Distance Flown"); + add("stat.climbOneCm", "Distance Climbed"); + add("stat.diveOneCm", "Distance Dove"); + add("stat.minecartOneCm", "Distance by Minecart"); + add("stat.boatOneCm", "Distance by Boat"); + add("stat.pigOneCm", "Distance by Pig"); + add("stat.horseOneCm", "Distance by Horse"); + add("stat.aviateOneCm", "Distance by Elytra"); + add("stat.jump", "Jumps"); + add("stat.drop", "Items Dropped"); + add("stat.dropped", "Dropped"); + add("stat.pickup", "Picked Up"); + add("stat.damageDealt", "Damage Dealt"); + add("stat.damageTaken", "Damage Taken"); + add("stat.deaths", "Number of Deaths"); + add("stat.mobKills", "Mob Kills"); + add("stat.animalsBred", "Animals Bred"); + add("stat.playerKills", "Player Kills"); + add("stat.fishCaught", "Fish Caught"); + add("stat.treasureFished", "Treasure Fished"); + add("stat.junkFished", "Junk Fished"); + add("stat.talkedToVillager", "Talked to Villagers"); + add("stat.tradedWithVillager", "Traded with Villagers"); + add("stat.cakeSlicesEaten", "Cake Slices Eaten"); + add("stat.cauldronFilled", "Cauldrons Filled"); + add("stat.cauldronUsed", "Water Taken from Cauldron"); + add("stat.armorCleaned", "Armor Pieces Cleaned"); + add("stat.bannerCleaned", "Banners Cleaned"); + add("stat.brewingstandInteraction", "Interactions with Brewing Stand"); + add("stat.beaconInteraction", "Interactions with Beacon"); + add("stat.dropperInspected", "Droppers Searched"); + add("stat.hopperInspected", "Hoppers Searched"); + add("stat.dispenserInspected", "Dispensers Searched"); + add("stat.noteblockPlayed", "Note Blocks Played"); + add("stat.noteblockTuned", "Note Blocks Tuned"); + add("stat.flowerPotted", "Plants Potted"); + add("stat.trappedChestTriggered", "Trapped Chests Triggered"); + add("stat.enderchestOpened", "Ender Chests Opened"); + add("stat.itemEnchanted", "Items Enchanted"); + add("stat.recordPlayed", "Records Played"); + add("stat.furnaceInteraction", "Interactions with Furnace"); + add("stat.workbenchInteraction", "Interactions with Crafting Table"); + add("stat.chestOpened", "Chests Opened"); + add("stat.shulkerBoxOpened", "Shulker Boxes Opened"); + add("stat.sleepInBed", "Times Slept in a Bed"); + add("stat.mineBlock", "%1$s Mined"); + add("stat.craftItem", "%1$s Crafted"); + add("stat.useItem", "%1$s Used"); + add("stat.breakItem", "%1$s Depleted"); + add("achievement.get", "Achievement get!"); + add("achievement.taken", "Taken!"); + add("achievement.unknown", "???"); + add("achievement.requires", "Requires '%1$s'"); + add("achievement.openInventory", "Taking Inventory"); + add("achievement.openInventory.desc", "Press 'E' to open your inventory"); + add("achievement.mineWood", "Getting Wood"); + add("achievement.mineWood.desc", "Attack a tree until a block of wood pops out"); + add("achievement.buildWorkBench", "Benchmarking"); + add("achievement.buildWorkBench.desc", "Craft a workbench with four blocks of planks"); + add("achievement.buildPickaxe", "Time to Mine!"); + add("achievement.buildPickaxe.desc", "Use planks and sticks to make a pickaxe"); + add("achievement.buildFurnace", "Hot Topic"); + add("achievement.buildFurnace.desc", "Construct a furnace out of eight cobblestone blocks"); + add("achievement.acquireIron", "Acquire Hardware"); + add("achievement.acquireIron.desc", "Smelt an iron ingot"); + add("achievement.buildHoe", "Time to Farm!"); + add("achievement.buildHoe.desc", "Use planks and sticks to make a hoe"); + add("achievement.makeBread", "Bake Bread"); + add("achievement.makeBread.desc", "Turn wheat into bread"); + add("achievement.bakeCake", "The Lie"); + add("achievement.bakeCake.desc", "Wheat, sugar, milk and eggs!"); + add("achievement.buildBetterPickaxe", "Getting an Upgrade"); + add("achievement.buildBetterPickaxe.desc", "Construct a better pickaxe"); + add("achievement.overpowered", "Overpowered", true); + add("achievement.overpowered.desc", "Eat a Notch apple"); + add("achievement.cookFish", "Delicious Fish"); + add("achievement.cookFish.desc", "Catch and cook fish!"); + add("achievement.onARail", "On A Rail", true); + add("achievement.onARail.desc", "Travel by minecart at least 1 km from where you started"); + add("achievement.buildSword", "Time to Strike!"); + add("achievement.buildSword.desc", "Use planks and sticks to make a sword"); + add("achievement.killEnemy", "Monster Hunter"); + add("achievement.killEnemy.desc", "Attack and destroy a monster"); + add("achievement.killCow", "Cow Tipper"); + add("achievement.killCow.desc", "Harvest some leather"); + add("achievement.breedCow", "Repopulation"); + add("achievement.breedCow.desc", "Breed two cows with wheat"); + add("achievement.flyPig", "When Pigs Fly", true); + add("achievement.flyPig.desc", "Fly a pig off a cliff"); + add("achievement.snipeSkeleton", "Sniper Duel", true); + add("achievement.snipeSkeleton.desc", "Kill a skeleton with an arrow from more than 50 meters"); + add("achievement.diamonds", "DIAMONDS!"); + add("achievement.diamonds.desc", "Acquire diamonds with your iron tools"); + add("achievement.diamondsToYou", "Diamonds to you!"); + add("achievement.diamondsToYou.desc", "Throw diamonds at another player"); + add("achievement.portal", "We Need to Go Deeper"); + add("achievement.portal.desc", "Build a portal to the Nether"); + add("achievement.ghast", "Return to Sender", true); + add("achievement.ghast.desc", "Destroy a Ghast with a fireball"); + add("achievement.blazeRod", "Into Fire"); + add("achievement.blazeRod.desc", "Relieve a Blaze of its rod"); + add("achievement.potion", "Local Brewery"); + add("achievement.potion.desc", "Brew a potion"); + add("achievement.theEnd", "The End?", true); + add("achievement.theEnd.desc", "Locate the End"); + add("achievement.theEnd2", "The End.", true); + add("achievement.theEnd2.desc", "Defeat the Ender Dragon"); + add("achievement.spawnWither", "The Beginning?"); + add("achievement.spawnWither.desc", "Spawn the Wither"); + add("achievement.killWither", "The Beginning."); + add("achievement.killWither.desc", "Kill the Wither"); + add("achievement.fullBeacon", "Beaconator", true); + add("achievement.fullBeacon.desc", "Create a full beacon"); + add("achievement.exploreAllBiomes", "Adventuring Time", true); + add("achievement.exploreAllBiomes.desc", "Discover all biomes"); + add("achievement.enchantments", "Enchanter"); + add("achievement.enchantments.desc", "Use a book, obsidian and diamonds to construct an enchantment table"); + add("achievement.overkill", "Overkill", true); + add("achievement.overkill.desc", "Deal nine hearts of damage in a single hit"); + add("achievement.bookcase", "Librarian"); + add("achievement.bookcase.desc", "Build some bookshelves to improve your enchantment table"); + } + + private static void add(String key, String value) { + ACHIEVEMENTS.put(key, value); + } + + private static void add(String key, String value, boolean special) { + add(key, value); + SPECIAL_ACHIEVEMENTS.add(key); + } + + public static String get(String key) { + return ACHIEVEMENTS.get(key); + } + + public static boolean isSpecial(String key) { + return SPECIAL_ACHIEVEMENTS.contains(key); + } + +} \ No newline at end of file From 70d08dfc6fd885260fd6e3456d7eed5a478b79a1 Mon Sep 17 00:00:00 2001 From: RK_01 Date: Wed, 12 Aug 2020 16:39:01 +0200 Subject: [PATCH 2/3] fixed 1.13 -> 1.12.2 statistics remapping --- .../Protocol1_13To1_12_2.java | 26 ++-- .../data/StatisticMappings.java | 139 +++++++++++------- 2 files changed, 104 insertions(+), 61 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index f7d20d545..9d5b9b146 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Triple; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.Entity1_13Types; @@ -41,9 +42,7 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.TabCompleteTra import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import us.myles.ViaVersion.util.GsonUtil; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; public class Protocol1_13To1_12_2 extends Protocol { @@ -189,18 +188,22 @@ public class Protocol1_13To1_12_2 extends Protocol> remappedStats = new ArrayList<>(); for (int i = 0; i < size; i++) { String name = wrapper.read(Type.STRING); String[] split = name.split("\\."); int categoryId = 0; - int newId = 0; + int newId = -1; + int value = wrapper.read(Type.VAR_INT); if (split.length == 2) { // Custom types categoryId = 8; - Integer newIdRaw = StatisticMappings.statistics.get(name); + Integer newIdRaw = StatisticMappings.CUSTOM_STATS.get(name); if (newIdRaw != null) { newId = newIdRaw; + } else { + Via.getPlatform().getLogger().warning("Could not find 1.13 -> 1.12.2 statistic mapping for " + name); } } else { String category = split[1]; @@ -232,10 +235,15 @@ public class Protocol1_13To1_12_2 extends Protocol(categoryId, newId, value)); + } - wrapper.write(Type.VAR_INT, categoryId); // category id - wrapper.write(Type.VAR_INT, newId); // statistics id - wrapper.passthrough(Type.VAR_INT); // value + wrapper.write(Type.VAR_INT, remappedStats.size()); // size + for (Triple stat : remappedStats) { + wrapper.write(Type.VAR_INT, stat.getFirst()); // category id + wrapper.write(Type.VAR_INT, stat.getSecond()); // statistics id + wrapper.write(Type.VAR_INT, stat.getThird()); // value } } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticMappings.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticMappings.java index 60d977249..6c9342543 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticMappings.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticMappings.java @@ -5,58 +5,93 @@ import java.util.Map; public class StatisticMappings { - public static final Map statistics = new HashMap<>(); - + public static final Map CUSTOM_STATS = new HashMap<>(); + static { - statistics.put("stat.jump", 17); - statistics.put("stat.drop", 18); - statistics.put("stat.deaths", 21); - statistics.put("stat.mobKills", 22); - statistics.put("stat.pigOneCm", 14); - statistics.put("stat.flyOneCm", 10); - statistics.put("stat.leaveGame", 0); - statistics.put("stat.diveOneCm", 11); - statistics.put("stat.swimOneCm", 7); - statistics.put("stat.fallOneCm", 8); - statistics.put("stat.walkOneCm", 4); - statistics.put("stat.boatOneCm", 13); - statistics.put("stat.sneakTime", 3); - statistics.put("stat.horseOneCm", 15); - statistics.put("stat.sleepInBed", 48); - statistics.put("stat.fishCaught", 25); - statistics.put("stat.climbOneCm", 9); - statistics.put("stat.aviateOneCm", 16); - statistics.put("stat.crouchOneCm", 5); - statistics.put("stat.sprintOneCm", 6); - statistics.put("stat.animalsBred", 23); - statistics.put("stat.chestOpened", 47); - statistics.put("stat.damageTaken", 20); - statistics.put("stat.damageDealt", 19); - statistics.put("stat.playerKills", 24); - statistics.put("stat.armorCleaned", 31); - statistics.put("stat.flowerPotted", 40); - statistics.put("stat.recordPlayed", 44); - statistics.put("stat.cauldronUsed", 30); - statistics.put("stat.bannerCleaned", 32); - statistics.put("stat.itemEnchanted", 43); - statistics.put("stat.playOneMinute", 1); - statistics.put("stat.minecartOneCm", 12); - statistics.put("stat.timeSinceDeath", 2); - statistics.put("stat.cauldronFilled", 29); - statistics.put("stat.noteblockTuned", 39); - statistics.put("stat.noteblockPlayed", 38); - statistics.put("stat.cakeSlicesEaten", 28); - statistics.put("stat.hopperInspected", 36); - statistics.put("stat.shulkerBoxOpened", 49); - statistics.put("stat.talkedToVillager", 26); - statistics.put("stat.enderchestOpened", 42); - statistics.put("stat.dropperInspected", 35); - statistics.put("stat.beaconInteraction", 34); - statistics.put("stat.furnaceInteraction", 45); - statistics.put("stat.dispenserInspected", 37); - statistics.put("stat.tradedWithVillager", 27); - statistics.put("stat.trappedChestTriggered", 41); - statistics.put("stat.brewingstandInteraction", 33); - statistics.put("stat.craftingTableInteraction", 46); + CUSTOM_STATS.put("stat.leaveGame", 0); + CUSTOM_STATS.put("stat.playOneMinute", 1); + CUSTOM_STATS.put("stat.timeSinceDeath", 2); + CUSTOM_STATS.put("stat.sneakTime", 4); + CUSTOM_STATS.put("stat.walkOneCm", 5); + CUSTOM_STATS.put("stat.crouchOneCm", 6); + CUSTOM_STATS.put("stat.sprintOneCm", 7); + CUSTOM_STATS.put("stat.swimOneCm", 18); + CUSTOM_STATS.put("stat.fallOneCm", 9); + CUSTOM_STATS.put("stat.climbOneCm", 10); + CUSTOM_STATS.put("stat.flyOneCm", 11); + CUSTOM_STATS.put("stat.diveOneCm", 12); + CUSTOM_STATS.put("stat.minecartOneCm", 13); + CUSTOM_STATS.put("stat.boatOneCm", 14); + CUSTOM_STATS.put("stat.pigOneCm", 15); + CUSTOM_STATS.put("stat.horseOneCm", 16); + CUSTOM_STATS.put("stat.aviateOneCm", 17); + CUSTOM_STATS.put("stat.jump", 19); + CUSTOM_STATS.put("stat.drop", 20); + CUSTOM_STATS.put("stat.damageDealt", 21); + CUSTOM_STATS.put("stat.damageTaken", 22); + CUSTOM_STATS.put("stat.deaths", 23); + CUSTOM_STATS.put("stat.mobKills", 24); + CUSTOM_STATS.put("stat.animalsBred", 25); + CUSTOM_STATS.put("stat.playerKills", 26); + CUSTOM_STATS.put("stat.fishCaught", 27); + CUSTOM_STATS.put("stat.talkedToVillager", 28); + CUSTOM_STATS.put("stat.tradedWithVillage", 29); + CUSTOM_STATS.put("stat.cakeSlicesEaten", 30); + CUSTOM_STATS.put("stat.cauldronFilled", 31); + CUSTOM_STATS.put("stat.cauldronUsed", 32); + CUSTOM_STATS.put("stat.armorCleaned", 33); + CUSTOM_STATS.put("stat.bannerCleaned", 34); + CUSTOM_STATS.put("stat.brewingstandInter", 35); + CUSTOM_STATS.put("stat.beaconInteraction", 36); + CUSTOM_STATS.put("stat.dropperInspected", 37); + CUSTOM_STATS.put("stat.hopperInspected", 38); + CUSTOM_STATS.put("stat.dispenserInspecte", 39); + CUSTOM_STATS.put("stat.noteblockPlayed", 40); + CUSTOM_STATS.put("stat.noteblockTuned", 41); + CUSTOM_STATS.put("stat.flowerPotted", 42); + CUSTOM_STATS.put("stat.trappedChestTriggered", 43); + CUSTOM_STATS.put("stat.enderchestOpened", 44); + CUSTOM_STATS.put("stat.itemEnchanted", 45); + CUSTOM_STATS.put("stat.recordPlayed", 46); + CUSTOM_STATS.put("stat.furnaceInteraction", 47); + CUSTOM_STATS.put("stat.craftingTableInteraction", 48); + CUSTOM_STATS.put("stat.chestOpened", 49); + CUSTOM_STATS.put("stat.sleepInBed", 50); + CUSTOM_STATS.put("stat.shulkerBoxOpened", 51); + CUSTOM_STATS.put("achievement.openInventory", -1); + CUSTOM_STATS.put("achievement.mineWood", -1); + CUSTOM_STATS.put("achievement.buildWorkBench", -1); + CUSTOM_STATS.put("achievement.buildPickaxe", -1); + CUSTOM_STATS.put("achievement.buildFurnace", -1); + CUSTOM_STATS.put("achievement.acquireIron", -1); + CUSTOM_STATS.put("achievement.buildHoe", -1); + CUSTOM_STATS.put("achievement.makeBread", -1); + CUSTOM_STATS.put("achievement.bakeCake", -1); + CUSTOM_STATS.put("achievement.buildBetterPickaxe", -1); + CUSTOM_STATS.put("achievement.cookFish", -1); + CUSTOM_STATS.put("achievement.onARail", -1); + CUSTOM_STATS.put("achievement.buildSword", -1); + CUSTOM_STATS.put("achievement.killEnemy", -1); + CUSTOM_STATS.put("achievement.killCow", -1); + CUSTOM_STATS.put("achievement.flyPig", -1); + CUSTOM_STATS.put("achievement.snipeSkeleton", -1); + CUSTOM_STATS.put("achievement.diamonds", -1); + CUSTOM_STATS.put("achievement.diamondsToYou", -1); + CUSTOM_STATS.put("achievement.portal", -1); + CUSTOM_STATS.put("achievement.ghast", -1); + CUSTOM_STATS.put("achievement.blazeRod", -1); + CUSTOM_STATS.put("achievement.potion", -1); + CUSTOM_STATS.put("achievement.theEnd", -1); + CUSTOM_STATS.put("achievement.theEnd2", -1); + CUSTOM_STATS.put("achievement.enchantments", -1); + CUSTOM_STATS.put("achievement.overkill", -1); + CUSTOM_STATS.put("achievement.bookcase", -1); + CUSTOM_STATS.put("achievement.breedCow", -1); + CUSTOM_STATS.put("achievement.spawnWither", -1); + CUSTOM_STATS.put("achievement.killWither", -1); + CUSTOM_STATS.put("achievement.fullBeacon", -1); + CUSTOM_STATS.put("achievement.exploreAllBiomes", -1); + CUSTOM_STATS.put("achievement.overpowered", -1); } + } From acfdbc5494e773759d4af0ced67986312a24ff11 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Wed, 12 Aug 2020 17:16:50 +0200 Subject: [PATCH 3/3] slight code changes for PR --- .../TranslateRewriter.java | 95 ++++++++++--------- .../data/AchievementTranslationMapping.java | 28 +++--- .../Protocol1_13To1_12_2.java | 18 ++-- .../data/StatisticData.java | 27 ++++++ 4 files changed, 99 insertions(+), 69 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticData.java diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/TranslateRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/TranslateRewriter.java index ace58513b..8a476fd93 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/TranslateRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/TranslateRewriter.java @@ -22,52 +22,57 @@ public class TranslateRewriter { @Override protected void handleHoverEvent(JsonObject hoverEvent) { String action = hoverEvent.getAsJsonPrimitive("action").getAsString(); - if (action.equals("show_achievement")) { - String value = hoverEvent.getAsJsonPrimitive("value").getAsString(); - if (AchievementTranslationMapping.get(value) != null) { - try { - JsonObject newLine = new JsonObject(); - newLine.addProperty("text", "\n"); - JsonArray baseArray = new JsonArray(); - baseArray.add(""); - JsonObject namePart = new JsonObject(); - JsonObject typePart = new JsonObject(); - baseArray.add(namePart); - baseArray.add(newLine); - baseArray.add(typePart); - if (value.startsWith("achievement")) { - namePart.addProperty("translate", value); - namePart.addProperty("color", AchievementTranslationMapping.isSpecial(value) ? "dark_purple" : "green"); - typePart.addProperty("translate", "stats.tooltip.type.achievement"); - JsonObject description = new JsonObject(); - typePart.addProperty("italic", true); - description.addProperty("translate", value + ".desc"); - baseArray.add(newLine); - baseArray.add(description); - } else if (value.startsWith("stat")) { - namePart.addProperty("translate", value); - namePart.addProperty("color", "gray"); - typePart.addProperty("translate", "stats.tooltip.type.statistic"); - typePart.addProperty("italic", true); - } - hoverEvent.addProperty("action", "show_text"); - hoverEvent.add("value", baseArray); - } catch (Exception e) { - Via.getPlatform().getLogger().warning("Error rewriting show_achievement: " + hoverEvent); - e.printStackTrace(); - JsonObject invalidText = new JsonObject(); - invalidText.addProperty("text", "Invalid statistic/achievement!"); - invalidText.addProperty("color", "red"); - hoverEvent.addProperty("action", "show_text"); - hoverEvent.add("value", invalidText); - } - } else { - JsonObject invalidText = new JsonObject(); - invalidText.addProperty("text", "Invalid statistic/achievement!"); - invalidText.addProperty("color", "red"); - hoverEvent.addProperty("action", "show_text"); - hoverEvent.add("value", invalidText); + if (!action.equals("show_achievement")) { + super.handleHoverEvent(hoverEvent); + return; + } + + String value = hoverEvent.getAsJsonPrimitive("value").getAsString(); + if (AchievementTranslationMapping.get(value) == null) { + JsonObject invalidText = new JsonObject(); + invalidText.addProperty("text", "Invalid statistic/achievement!"); + invalidText.addProperty("color", "red"); + hoverEvent.addProperty("action", "show_text"); + hoverEvent.add("value", invalidText); + super.handleHoverEvent(hoverEvent); + return; + } + + try { + JsonObject newLine = new JsonObject(); + newLine.addProperty("text", "\n"); + JsonArray baseArray = new JsonArray(); + baseArray.add(""); + JsonObject namePart = new JsonObject(); + JsonObject typePart = new JsonObject(); + baseArray.add(namePart); + baseArray.add(newLine); + baseArray.add(typePart); + if (value.startsWith("achievement")) { + namePart.addProperty("translate", value); + namePart.addProperty("color", AchievementTranslationMapping.isSpecial(value) ? "dark_purple" : "green"); + typePart.addProperty("translate", "stats.tooltip.type.achievement"); + JsonObject description = new JsonObject(); + typePart.addProperty("italic", true); + description.addProperty("translate", value + ".desc"); + baseArray.add(newLine); + baseArray.add(description); + } else if (value.startsWith("stat")) { + namePart.addProperty("translate", value); + namePart.addProperty("color", "gray"); + typePart.addProperty("translate", "stats.tooltip.type.statistic"); + typePart.addProperty("italic", true); } + hoverEvent.addProperty("action", "show_text"); + hoverEvent.add("value", baseArray); + } catch (Exception e) { + Via.getPlatform().getLogger().warning("Error rewriting show_achievement: " + hoverEvent); + e.printStackTrace(); + JsonObject invalidText = new JsonObject(); + invalidText.addProperty("text", "Invalid statistic/achievement!"); + invalidText.addProperty("color", "red"); + hoverEvent.addProperty("action", "show_text"); + hoverEvent.add("value", invalidText); } super.handleHoverEvent(hoverEvent); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/data/AchievementTranslationMapping.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/data/AchievementTranslationMapping.java index 7843b0855..efb401e4d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/data/AchievementTranslationMapping.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/data/AchievementTranslationMapping.java @@ -1,12 +1,14 @@ package us.myles.ViaVersion.protocols.protocol1_12to1_11_1.data; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +import java.util.HashSet; +import java.util.Set; public class AchievementTranslationMapping { private static final Object2ObjectOpenHashMap ACHIEVEMENTS = new Object2ObjectOpenHashMap<>(150, 1.0f); - private static final ObjectArrayList SPECIAL_ACHIEVEMENTS = new ObjectArrayList<>(10); + private static final Set SPECIAL_ACHIEVEMENTS = new HashSet<>(10); static { add("chat.type.achievement", "%s has just earned the achievement %s"); @@ -111,11 +113,11 @@ public class AchievementTranslationMapping { add("achievement.bakeCake.desc", "Wheat, sugar, milk and eggs!"); add("achievement.buildBetterPickaxe", "Getting an Upgrade"); add("achievement.buildBetterPickaxe.desc", "Construct a better pickaxe"); - add("achievement.overpowered", "Overpowered", true); + addSpecial("achievement.overpowered", "Overpowered"); add("achievement.overpowered.desc", "Eat a Notch apple"); add("achievement.cookFish", "Delicious Fish"); add("achievement.cookFish.desc", "Catch and cook fish!"); - add("achievement.onARail", "On A Rail", true); + addSpecial("achievement.onARail", "On A Rail"); add("achievement.onARail.desc", "Travel by minecart at least 1 km from where you started"); add("achievement.buildSword", "Time to Strike!"); add("achievement.buildSword.desc", "Use planks and sticks to make a sword"); @@ -125,9 +127,9 @@ public class AchievementTranslationMapping { add("achievement.killCow.desc", "Harvest some leather"); add("achievement.breedCow", "Repopulation"); add("achievement.breedCow.desc", "Breed two cows with wheat"); - add("achievement.flyPig", "When Pigs Fly", true); + addSpecial("achievement.flyPig", "When Pigs Fly"); add("achievement.flyPig.desc", "Fly a pig off a cliff"); - add("achievement.snipeSkeleton", "Sniper Duel", true); + addSpecial("achievement.snipeSkeleton", "Sniper Duel"); add("achievement.snipeSkeleton.desc", "Kill a skeleton with an arrow from more than 50 meters"); add("achievement.diamonds", "DIAMONDS!"); add("achievement.diamonds.desc", "Acquire diamonds with your iron tools"); @@ -135,27 +137,27 @@ public class AchievementTranslationMapping { add("achievement.diamondsToYou.desc", "Throw diamonds at another player"); add("achievement.portal", "We Need to Go Deeper"); add("achievement.portal.desc", "Build a portal to the Nether"); - add("achievement.ghast", "Return to Sender", true); + addSpecial("achievement.ghast", "Return to Sender"); add("achievement.ghast.desc", "Destroy a Ghast with a fireball"); add("achievement.blazeRod", "Into Fire"); add("achievement.blazeRod.desc", "Relieve a Blaze of its rod"); add("achievement.potion", "Local Brewery"); add("achievement.potion.desc", "Brew a potion"); - add("achievement.theEnd", "The End?", true); + addSpecial("achievement.theEnd", "The End?"); add("achievement.theEnd.desc", "Locate the End"); - add("achievement.theEnd2", "The End.", true); + addSpecial("achievement.theEnd2", "The End."); add("achievement.theEnd2.desc", "Defeat the Ender Dragon"); add("achievement.spawnWither", "The Beginning?"); add("achievement.spawnWither.desc", "Spawn the Wither"); add("achievement.killWither", "The Beginning."); add("achievement.killWither.desc", "Kill the Wither"); - add("achievement.fullBeacon", "Beaconator", true); + addSpecial("achievement.fullBeacon", "Beaconator"); add("achievement.fullBeacon.desc", "Create a full beacon"); - add("achievement.exploreAllBiomes", "Adventuring Time", true); + addSpecial("achievement.exploreAllBiomes", "Adventuring Time"); add("achievement.exploreAllBiomes.desc", "Discover all biomes"); add("achievement.enchantments", "Enchanter"); add("achievement.enchantments.desc", "Use a book, obsidian and diamonds to construct an enchantment table"); - add("achievement.overkill", "Overkill", true); + addSpecial("achievement.overkill", "Overkill"); add("achievement.overkill.desc", "Deal nine hearts of damage in a single hit"); add("achievement.bookcase", "Librarian"); add("achievement.bookcase.desc", "Build some bookshelves to improve your enchantment table"); @@ -165,7 +167,7 @@ public class AchievementTranslationMapping { ACHIEVEMENTS.put(key, value); } - private static void add(String key, String value, boolean special) { + private static void addSpecial(String key, String value) { add(key, value); SPECIAL_ACHIEVEMENTS.add(key); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index 9d5b9b146..f053dc2e8 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -5,7 +5,6 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.PacketWrapper; -import us.myles.ViaVersion.api.Triple; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.Entity1_13Types; @@ -25,10 +24,7 @@ import us.myles.ViaVersion.protocols.protocol1_12_1to1_12.ServerboundPackets1_12 import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.ConnectionData; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.providers.BlockConnectionProvider; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.providers.PacketBlockConnectionProvider; -import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.BlockIdData; -import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.MappingData; -import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.RecipeData; -import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.StatisticMappings; +import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.*; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.metadata.MetadataRewriter1_13To1_12_2; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.EntityPackets; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.InventoryPackets; @@ -189,7 +185,7 @@ public class Protocol1_13To1_12_2 extends Protocol> remappedStats = new ArrayList<>(); + List remappedStats = new ArrayList<>(); for (int i = 0; i < size; i++) { String name = wrapper.read(Type.STRING); String[] split = name.split("\\."); @@ -236,14 +232,14 @@ public class Protocol1_13To1_12_2 extends Protocol(categoryId, newId, value)); + remappedStats.add(new StatisticData(categoryId, newId, value)); } wrapper.write(Type.VAR_INT, remappedStats.size()); // size - for (Triple stat : remappedStats) { - wrapper.write(Type.VAR_INT, stat.getFirst()); // category id - wrapper.write(Type.VAR_INT, stat.getSecond()); // statistics id - wrapper.write(Type.VAR_INT, stat.getThird()); // value + for (StatisticData stat : remappedStats) { + wrapper.write(Type.VAR_INT, stat.getCategoryId()); // category id + wrapper.write(Type.VAR_INT, stat.getNewId()); // statistics id + wrapper.write(Type.VAR_INT, stat.getValue()); // value } } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticData.java new file mode 100644 index 000000000..317a0ce7f --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/data/StatisticData.java @@ -0,0 +1,27 @@ +package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data; + +public class StatisticData { + + private final int categoryId; + private final int newId; + private final int value; + + public StatisticData(int categoryId, int newId, int value) { + this.categoryId = categoryId; + this.newId = newId; + this.value = value; + } + + public int getCategoryId() { + return categoryId; + } + + public int getNewId() { + return newId; + } + + public int getValue() { + return value; + } + +}