diff --git a/pom.xml b/pom.xml index 58bf1cd..b5300f4 100644 --- a/pom.xml +++ b/pom.xml @@ -144,7 +144,7 @@ com.github.Carleslc Simple-YAML - 1.3 + 1.7.3 org.projectlombok diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/ReleaseToBeta.java b/src/main/java/com/github/dirtpowered/releasetobeta/ReleaseToBeta.java index 2920cf1..c875bd4 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/ReleaseToBeta.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/ReleaseToBeta.java @@ -45,10 +45,12 @@ import com.github.dirtpowered.releasetobeta.network.translator.internal.ClientTabCompleteTranslator; import com.github.dirtpowered.releasetobeta.network.translator.registry.BetaToModernTranslatorRegistry; import com.github.dirtpowered.releasetobeta.network.translator.registry.ModernToBetaTranslatorRegistry; +import com.github.dirtpowered.releasetobeta.utils.StatsManager; import com.github.steveice10.mc.protocol.packet.ingame.client.ClientResourcePackStatusPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.ClientTabCompletePacket; import lombok.Getter; +import java.io.File; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -68,6 +70,7 @@ public class ReleaseToBeta implements Runnable { private ModernServer server; private PingPassthroughThread pingPassthroughThread; private AbstractBootstrap bootstrap; + private StatsManager statsManager; public ReleaseToBeta(AbstractBootstrap bootstrap) { long startTime = System.nanoTime(); @@ -87,14 +90,13 @@ public ReleaseToBeta(AbstractBootstrap bootstrap) { this.entityEffectMap = new EntityEffectMap(); this.mobTypeMap = new MobTypeMap(); this.server = new ModernServer(this); + this.statsManager = new StatsManager(new File("stats"), this); + statsManager.loadStats(); BetaLib.inject(R2BConfiguration.version); switch (R2BConfiguration.version) { - case B_1_6_6: - //no protocol changes compared to b1.7 - new B_1_7(betaToModernTranslatorRegistry, modernToBetaTranslatorRegistry); - break; + case B_1_6_6: //no protocol changes compared to b1.7 case B_1_7_3: new B_1_7(betaToModernTranslatorRegistry, modernToBetaTranslatorRegistry); break; @@ -135,6 +137,7 @@ public ReleaseToBeta(AbstractBootstrap bootstrap) { public void stop() { server.getServerConnection().shutdown(); + statsManager.saveStats(); } @Override diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/configuration/R2BConfiguration.java b/src/main/java/com/github/dirtpowered/releasetobeta/configuration/R2BConfiguration.java index b0e1911..53f39a2 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/configuration/R2BConfiguration.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/configuration/R2BConfiguration.java @@ -73,7 +73,7 @@ public void loadConfiguration(String path) { try { if (config.exists()) { main.getLogger().info("Loading configuration file"); - config.load(); + config.loadWithComments(); } else { //not compiled Path p = Paths.get("src/main/resources/config.yml"); @@ -89,7 +89,7 @@ public void loadConfiguration(String path) { //unique id for metrics config.set("metrics.unique_id", UUID.randomUUID().toString()); - config.saveWithComments(); + config.save(); } try { diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/data/Block.java b/src/main/java/com/github/dirtpowered/releasetobeta/data/Block.java index 3937d77..da08aeb 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/data/Block.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/data/Block.java @@ -22,6 +22,8 @@ package com.github.dirtpowered.releasetobeta.data; +import java.util.HashMap; + public class Block { public final static int AIR = 0; public final static int STICKY_PISTON = 29; @@ -29,4 +31,277 @@ public class Block { public final static int OBSIDIAN = 49; public final static int CHEST = 54; public final static int PORTAL = 90; + + private static final HashMap id2nameMapping = new HashMap<>(); + private static final HashMap name2idMapping = new HashMap<>(); + + public static int name2id(String name) { + return name2idMapping.containsKey(name) ? name2idMapping.get(name) : 0; + } + + public static String id2name(int id) { + return id2nameMapping.containsKey(id) ? id2nameMapping.get(id) : "air"; + } + + private static void addMapping(String name, int id) { + id2nameMapping.put(id, name); + name2idMapping.put(name, id); + } + + static { + addMapping("acacia_door", 196); + addMapping("acacia_fence", 192); + addMapping("acacia_fence_gate", 187); + addMapping("acacia_stairs", 163); + addMapping("activator_rail", 157); + addMapping("air", 0); + addMapping("anvil", 145); + addMapping("barrier", 166); + addMapping("beacon", 138); + addMapping("bed", 26); + addMapping("bedrock", 7); + addMapping("beetroots", 207); + addMapping("birch_door", 194); + addMapping("birch_fence", 189); + addMapping("birch_fence_gate", 184); + addMapping("birch_stairs", 135); + addMapping("black_glazed_terracotta", 250); + addMapping("black_shulker_box", 234); + addMapping("blue_glazed_terracotta", 246); + addMapping("blue_shulker_box", 230); + addMapping("bone_block", 216); + addMapping("bookshelf", 47); + addMapping("brewing_stand", 117); + addMapping("brick_block", 45); + addMapping("brick_stairs", 108); + addMapping("brown_glazed_terracotta", 247); + addMapping("brown_mushroom", 39); + addMapping("brown_mushroom_block", 99); + addMapping("brown_shulker_box", 231); + addMapping("cactus", 81); + addMapping("cake", 92); + addMapping("carpet", 171); + addMapping("carrots", 141); + addMapping("cauldron", 118); + addMapping("chain_command_block", 211); + addMapping("chest", 54); + addMapping("chorus_flower", 200); + addMapping("chorus_plant", 199); + addMapping("clay", 82); + addMapping("coal_block", 173); + addMapping("coal_ore", 16); + addMapping("cobblestone", 4); + addMapping("cobblestone_wall", 139); + addMapping("cocoa", 127); + addMapping("command_block", 137); + addMapping("concrete", 251); + addMapping("concrete_powder", 252); + addMapping("crafting_table", 58); + addMapping("cyan_glazed_terracotta", 244); + addMapping("cyan_shulker_box", 228); + addMapping("dark_oak_door", 197); + addMapping("dark_oak_fence", 191); + addMapping("dark_oak_fence_gate", 186); + addMapping("dark_oak_stairs", 164); + addMapping("daylight_detector", 151); + addMapping("daylight_detector_inverted", 178); + addMapping("deadbush", 32); + addMapping("detector_rail", 28); + addMapping("diamond_block", 57); + addMapping("diamond_ore", 56); + addMapping("dirt", 3); + addMapping("dispenser", 23); + addMapping("double_plant", 175); + addMapping("double_stone_slab", 43); + addMapping("double_stone_slab2", 181); + addMapping("double_wooden_slab", 125); + addMapping("dragon_egg", 122); + addMapping("dropper", 158); + addMapping("emerald_block", 133); + addMapping("emerald_ore", 129); + addMapping("enchanting_table", 116); + addMapping("end_bricks", 206); + addMapping("end_gateway", 209); + addMapping("end_portal", 119); + addMapping("end_portal_frame", 120); + addMapping("end_rod", 198); + addMapping("end_stone", 121); + addMapping("ender_chest", 130); + addMapping("farmland", 60); + addMapping("fence", 85); + addMapping("fence_gate", 107); + addMapping("fire", 51); + addMapping("flower_pot", 140); + addMapping("flowing_lava", 10); + addMapping("flowing_water", 8); + addMapping("frosted_ice", 212); + addMapping("furnace", 61); + addMapping("glass", 20); + addMapping("glass_pane", 102); + addMapping("glowstone", 89); + addMapping("gold_block", 41); + addMapping("gold_ore", 14); + addMapping("golden_rail", 27); + addMapping("grass", 2); + addMapping("grass_path", 208); + addMapping("gravel", 13); + addMapping("gray_glazed_terracotta", 242); + addMapping("gray_shulker_box", 226); + addMapping("green_glazed_terracotta", 248); + addMapping("green_shulker_box", 232); + addMapping("hardened_clay", 172); + addMapping("hay_block", 170); + addMapping("heavy_weighted_pressure_plate", 148); + addMapping("hopper", 154); + addMapping("ice", 79); + addMapping("iron_bars", 101); + addMapping("iron_block", 42); + addMapping("iron_door", 71); + addMapping("iron_ore", 15); + addMapping("iron_trapdoor", 167); + addMapping("jukebox", 84); + addMapping("jungle_door", 195); + addMapping("jungle_fence", 190); + addMapping("jungle_fence_gate", 185); + addMapping("jungle_stairs", 136); + addMapping("ladder", 65); + addMapping("lapis_block", 22); + addMapping("lapis_ore", 21); + addMapping("lava", 11); + addMapping("leaves", 18); + addMapping("leaves2", 161); + addMapping("lever", 69); + addMapping("light_blue_glazed_terracotta", 238); + addMapping("light_blue_shulker_box", 222); + addMapping("light_weighted_pressure_plate", 147); + addMapping("lime_glazed_terracotta", 240); + addMapping("lime_shulker_box", 224); + addMapping("lit_furnace", 62); + addMapping("lit_pumpkin", 91); + addMapping("lit_redstone_lamp", 124); + addMapping("lit_redstone_ore", 74); + addMapping("log", 17); + addMapping("log2", 162); + addMapping("magenta_glazed_terracotta", 237); + addMapping("magenta_shulker_box", 221); + addMapping("magma", 213); + addMapping("melon_block", 103); + addMapping("melon_stem", 105); + addMapping("mob_spawner", 52); + addMapping("monster_egg", 97); + addMapping("mossy_cobblestone", 48); + addMapping("mycelium", 110); + addMapping("nether_brick", 112); + addMapping("nether_brick_fence", 113); + addMapping("nether_brick_stairs", 114); + addMapping("nether_wart", 115); + addMapping("nether_wart_block", 214); + addMapping("netherrack", 87); + addMapping("noteblock", 25); + addMapping("oak_stairs", 53); + addMapping("observer", 218); + addMapping("obsidian", 49); + addMapping("orange_glazed_terracotta", 236); + addMapping("orange_shulker_box", 220); + addMapping("packed_ice", 174); + addMapping("pink_glazed_terracotta", 241); + addMapping("pink_shulker_box", 225); + addMapping("piston", 33); + addMapping("piston_extension", 36); + addMapping("piston_head", 34); + addMapping("planks", 5); + addMapping("portal", 90); + addMapping("potatoes", 142); + addMapping("powered_comparator", 150); + addMapping("powered_repeater", 94); + addMapping("prismarine", 168); + addMapping("pumpkin", 86); + addMapping("pumpkin_stem", 104); + addMapping("purple_glazed_terracotta", 245); + addMapping("purple_shulker_box", 229); + addMapping("purpur_block", 201); + addMapping("purpur_double_slab", 204); + addMapping("purpur_pillar", 202); + addMapping("purpur_slab", 205); + addMapping("purpur_stairs", 203); + addMapping("quartz_block", 155); + addMapping("quartz_ore", 153); + addMapping("quartz_stairs", 156); + addMapping("rail", 66); + addMapping("red_flower", 38); + addMapping("red_glazed_terracotta", 249); + addMapping("red_mushroom", 40); + addMapping("red_mushroom_block", 100); + addMapping("red_nether_brick", 215); + addMapping("red_sandstone", 179); + addMapping("red_sandstone_stairs", 180); + addMapping("red_shulker_box", 233); + addMapping("redstone_block", 152); + addMapping("redstone_lamp", 123); + addMapping("redstone_ore", 73); + addMapping("redstone_torch", 76); + addMapping("redstone_wire", 55); + addMapping("reeds", 83); + addMapping("repeating_command_block", 210); + addMapping("sand", 12); + addMapping("sandstone", 24); + addMapping("sandstone_stairs", 128); + addMapping("sapling", 6); + addMapping("sea_lantern", 169); + addMapping("silver_glazed_terracotta", 243); + addMapping("silver_shulker_box", 227); + addMapping("skull", 144); + addMapping("slime", 165); + addMapping("snow", 80); + addMapping("snow_layer", 78); + addMapping("soul_sand", 88); + addMapping("sponge", 19); + addMapping("spruce_door", 193); + addMapping("spruce_fence", 188); + addMapping("spruce_fence_gate", 183); + addMapping("spruce_stairs", 134); + addMapping("stained_glass", 95); + addMapping("stained_glass_pane", 160); + addMapping("stained_hardened_clay", 159); + addMapping("standing_banner", 176); + addMapping("standing_sign", 63); + addMapping("sticky_piston", 29); + addMapping("stone", 1); + addMapping("stone_brick_stairs", 109); + addMapping("stone_button", 77); + addMapping("stone_pressure_plate", 70); + addMapping("stone_slab", 44); + addMapping("stone_slab2", 182); + addMapping("stone_stairs", 67); + addMapping("stonebrick", 98); + addMapping("structure_block", 255); + addMapping("structure_void", 217); + addMapping("tallgrass", 31); + addMapping("tnt", 46); + addMapping("torch", 50); + addMapping("trapdoor", 96); + addMapping("trapped_chest", 146); + addMapping("tripwire", 132); + addMapping("tripwire_hook", 131); + addMapping("unlit_redstone_torch", 75); + addMapping("unpowered_comparator", 149); + addMapping("unpowered_repeater", 93); + addMapping("vine", 106); + addMapping("wall_banner", 177); + addMapping("wall_sign", 68); + addMapping("water", 9); + addMapping("waterlily", 111); + addMapping("web", 30); + addMapping("wheat", 59); + addMapping("white_glazed_terracotta", 235); + addMapping("white_shulker_box", 219); + addMapping("wooden_button", 143); + addMapping("wooden_door", 64); + addMapping("wooden_pressure_plate", 72); + addMapping("wooden_slab", 126); + addMapping("wool", 35); + addMapping("yellow_flower", 37); + addMapping("yellow_glazed_terracotta", 239); + addMapping("yellow_shulker_box", 223); + } } diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/data/Item.java b/src/main/java/com/github/dirtpowered/releasetobeta/data/Item.java new file mode 100644 index 0000000..ad2cfef --- /dev/null +++ b/src/main/java/com/github/dirtpowered/releasetobeta/data/Item.java @@ -0,0 +1,436 @@ +package com.github.dirtpowered.releasetobeta.data; + +import java.util.HashMap; + +public class Item { + private static final HashMap id2nameMapping = new HashMap<>(); + private static final HashMap name2idMapping = new HashMap<>(); + + public static int name2id(String name) { + return name2idMapping.containsKey(name) ? name2idMapping.get(name) : 0; + } + + public static String id2name(int id) { + return id2nameMapping.containsKey(id) ? id2nameMapping.get(id) : "air"; + } + + private static void addMapping(String name, int id) { + id2nameMapping.put(id, name); + name2idMapping.put(name, id); + } + + static { + addMapping("acacia_boat", 447); + addMapping("acacia_door", 430); + addMapping("acacia_fence", 192); + addMapping("acacia_fence_gate", 187); + addMapping("acacia_stairs", 163); + addMapping("activator_rail", 157); + addMapping("air", 0); + addMapping("anvil", 145); + addMapping("apple", 260); + addMapping("armor_stand", 416); + addMapping("arrow", 262); + addMapping("baked_potato", 393); + addMapping("banner", 425); + addMapping("barrier", 166); + addMapping("beacon", 138); + addMapping("bed", 355); + addMapping("bedrock", 7); + addMapping("beef", 363); + addMapping("beetroot", 434); + addMapping("beetroot_seeds", 435); + addMapping("beetroot_soup", 436); + addMapping("birch_boat", 445); + addMapping("birch_door", 428); + addMapping("birch_fence", 189); + addMapping("birch_fence_gate", 184); + addMapping("birch_stairs", 135); + addMapping("black_glazed_terracotta", 250); + addMapping("black_shulker_box", 234); + addMapping("blaze_powder", 377); + addMapping("blaze_rod", 369); + addMapping("blue_glazed_terracotta", 246); + addMapping("blue_shulker_box", 230); + addMapping("boat", 333); + addMapping("bone", 352); + addMapping("bone_block", 216); + addMapping("book", 340); + addMapping("bookshelf", 47); + addMapping("bow", 261); + addMapping("bowl", 281); + addMapping("bread", 297); + addMapping("brewing_stand", 379); + addMapping("brick", 336); + addMapping("brick_block", 45); + addMapping("brick_stairs", 108); + addMapping("brown_glazed_terracotta", 247); + addMapping("brown_mushroom", 39); + addMapping("brown_mushroom_block", 99); + addMapping("brown_shulker_box", 231); + addMapping("bucket", 325); + addMapping("cactus", 81); + addMapping("cake", 354); + addMapping("carpet", 171); + addMapping("carrot", 391); + addMapping("carrot_on_a_stick", 398); + addMapping("cauldron", 380); + addMapping("chain_command_block", 211); + addMapping("chainmail_boots", 305); + addMapping("chainmail_chestplate", 303); + addMapping("chainmail_helmet", 302); + addMapping("chainmail_leggings", 304); + addMapping("chest", 54); + addMapping("chest_minecart", 342); + addMapping("chicken", 365); + addMapping("chorus_flower", 200); + addMapping("chorus_fruit", 432); + addMapping("chorus_fruit_popped", 433); + addMapping("chorus_plant", 199); + addMapping("clay", 82); + addMapping("clay_ball", 337); + addMapping("clock", 347); + addMapping("coal", 263); + addMapping("coal_block", 173); + addMapping("coal_ore", 16); + addMapping("cobblestone", 4); + addMapping("cobblestone_wall", 139); + addMapping("command_block", 137); + addMapping("command_block_minecart", 422); + addMapping("comparator", 404); + addMapping("compass", 345); + addMapping("concrete", 251); + addMapping("concrete_powder", 252); + addMapping("cooked_beef", 364); + addMapping("cooked_chicken", 366); + addMapping("cooked_fish", 350); + addMapping("cooked_mutton", 424); + addMapping("cooked_porkchop", 320); + addMapping("cooked_rabbit", 412); + addMapping("cookie", 357); + addMapping("crafting_table", 58); + addMapping("cyan_glazed_terracotta", 244); + addMapping("cyan_shulker_box", 228); + addMapping("dark_oak_boat", 448); + addMapping("dark_oak_door", 431); + addMapping("dark_oak_fence", 191); + addMapping("dark_oak_fence_gate", 186); + addMapping("dark_oak_stairs", 164); + addMapping("daylight_detector", 151); + addMapping("deadbush", 32); + addMapping("detector_rail", 28); + addMapping("diamond", 264); + addMapping("diamond_axe", 279); + addMapping("diamond_block", 57); + addMapping("diamond_boots", 313); + addMapping("diamond_chestplate", 311); + addMapping("diamond_helmet", 310); + addMapping("diamond_hoe", 293); + addMapping("diamond_horse_armor", 419); + addMapping("diamond_leggings", 312); + addMapping("diamond_ore", 56); + addMapping("diamond_pickaxe", 278); + addMapping("diamond_shovel", 277); + addMapping("diamond_sword", 276); + addMapping("dirt", 3); + addMapping("dispenser", 23); + addMapping("double_plant", 175); + addMapping("dragon_breath", 437); + addMapping("dragon_egg", 122); + addMapping("dropper", 158); + addMapping("dye", 351); + addMapping("egg", 344); + addMapping("elytra", 443); + addMapping("emerald", 388); + addMapping("emerald_block", 133); + addMapping("emerald_ore", 129); + addMapping("enchanted_book", 403); + addMapping("enchanting_table", 116); + addMapping("end_bricks", 206); + addMapping("end_crystal", 426); + addMapping("end_portal_frame", 120); + addMapping("end_rod", 198); + addMapping("end_stone", 121); + addMapping("ender_chest", 130); + addMapping("ender_eye", 381); + addMapping("ender_pearl", 368); + addMapping("experience_bottle", 384); + addMapping("farmland", 60); + addMapping("feather", 288); + addMapping("fence", 85); + addMapping("fence_gate", 107); + addMapping("fermented_spider_eye", 376); + addMapping("filled_map", 358); + addMapping("fire_charge", 385); + addMapping("firework_charge", 402); + addMapping("fireworks", 401); + addMapping("fish", 349); + addMapping("fishing_rod", 346); + addMapping("flint", 318); + addMapping("flint_and_steel", 259); + addMapping("flower_pot", 390); + addMapping("furnace", 61); + addMapping("furnace_minecart", 343); + addMapping("ghast_tear", 370); + addMapping("glass", 20); + addMapping("glass_bottle", 374); + addMapping("glass_pane", 102); + addMapping("glowstone", 89); + addMapping("glowstone_dust", 348); + addMapping("gold_block", 41); + addMapping("gold_ingot", 266); + addMapping("gold_nugget", 371); + addMapping("gold_ore", 14); + addMapping("golden_apple", 322); + addMapping("golden_axe", 286); + addMapping("golden_boots", 317); + addMapping("golden_carrot", 396); + addMapping("golden_chestplate", 315); + addMapping("golden_helmet", 314); + addMapping("golden_hoe", 294); + addMapping("golden_horse_armor", 418); + addMapping("golden_leggings", 316); + addMapping("golden_pickaxe", 285); + addMapping("golden_rail", 27); + addMapping("golden_shovel", 284); + addMapping("golden_sword", 283); + addMapping("grass", 2); + addMapping("grass_path", 208); + addMapping("gravel", 13); + addMapping("gray_glazed_terracotta", 242); + addMapping("gray_shulker_box", 226); + addMapping("green_glazed_terracotta", 248); + addMapping("green_shulker_box", 232); + addMapping("gunpowder", 289); + addMapping("hardened_clay", 172); + addMapping("hay_block", 170); + addMapping("heavy_weighted_pressure_plate", 148); + addMapping("hopper", 154); + addMapping("hopper_minecart", 408); + addMapping("ice", 79); + addMapping("iron_axe", 258); + addMapping("iron_bars", 101); + addMapping("iron_block", 42); + addMapping("iron_boots", 309); + addMapping("iron_chestplate", 307); + addMapping("iron_door", 330); + addMapping("iron_helmet", 306); + addMapping("iron_hoe", 292); + addMapping("iron_horse_armor", 417); + addMapping("iron_ingot", 265); + addMapping("iron_leggings", 308); + addMapping("iron_nugget", 452); + addMapping("iron_ore", 15); + addMapping("iron_pickaxe", 257); + addMapping("iron_shovel", 256); + addMapping("iron_sword", 267); + addMapping("iron_trapdoor", 167); + addMapping("item_frame", 389); + addMapping("jukebox", 84); + addMapping("jungle_boat", 446); + addMapping("jungle_door", 429); + addMapping("jungle_fence", 190); + addMapping("jungle_fence_gate", 185); + addMapping("jungle_stairs", 136); + addMapping("knowledge_book", 453); + addMapping("ladder", 65); + addMapping("lapis_block", 22); + addMapping("lapis_ore", 21); + addMapping("lava_bucket", 327); + addMapping("lead", 420); + addMapping("leather", 334); + addMapping("leather_boots", 301); + addMapping("leather_chestplate", 299); + addMapping("leather_helmet", 298); + addMapping("leather_leggings", 300); + addMapping("leaves", 18); + addMapping("leaves2", 161); + addMapping("lever", 69); + addMapping("light_blue_glazed_terracotta", 238); + addMapping("light_blue_shulker_box", 222); + addMapping("light_weighted_pressure_plate", 147); + addMapping("lime_glazed_terracotta", 240); + addMapping("lime_shulker_box", 224); + addMapping("lingering_potion", 441); + addMapping("lit_pumpkin", 91); + addMapping("log", 17); + addMapping("log2", 162); + addMapping("magenta_glazed_terracotta", 237); + addMapping("magenta_shulker_box", 221); + addMapping("magma", 213); + addMapping("magma_cream", 378); + addMapping("map", 395); + addMapping("melon", 360); + addMapping("melon_block", 103); + addMapping("melon_seeds", 362); + addMapping("milk_bucket", 335); + addMapping("minecart", 328); + addMapping("mob_spawner", 52); + addMapping("monster_egg", 97); + addMapping("mossy_cobblestone", 48); + addMapping("mushroom_stew", 282); + addMapping("mutton", 423); + addMapping("mycelium", 110); + addMapping("name_tag", 421); + addMapping("nether_brick", 112); + addMapping("nether_brick_fence", 113); + addMapping("nether_brick_stairs", 114); + addMapping("nether_star", 399); + addMapping("nether_wart", 372); + addMapping("nether_wart_block", 214); + addMapping("netherbrick", 405); + addMapping("netherrack", 87); + addMapping("noteblock", 25); + addMapping("oak_stairs", 53); + addMapping("observer", 218); + addMapping("obsidian", 49); + addMapping("orange_glazed_terracotta", 236); + addMapping("orange_shulker_box", 220); + addMapping("packed_ice", 174); + addMapping("painting", 321); + addMapping("paper", 339); + addMapping("pink_glazed_terracotta", 241); + addMapping("pink_shulker_box", 225); + addMapping("piston", 33); + addMapping("planks", 5); + addMapping("poisonous_potato", 394); + addMapping("porkchop", 319); + addMapping("potato", 392); + addMapping("potion", 373); + addMapping("prismarine", 168); + addMapping("prismarine_crystals", 410); + addMapping("prismarine_shard", 409); + addMapping("pumpkin", 86); + addMapping("pumpkin_pie", 400); + addMapping("pumpkin_seeds", 361); + addMapping("purple_glazed_terracotta", 245); + addMapping("purple_shulker_box", 229); + addMapping("purpur_block", 201); + addMapping("purpur_pillar", 202); + addMapping("purpur_slab", 205); + addMapping("purpur_stairs", 203); + addMapping("quartz", 406); + addMapping("quartz_block", 155); + addMapping("quartz_ore", 153); + addMapping("quartz_stairs", 156); + addMapping("rabbit", 411); + addMapping("rabbit_foot", 414); + addMapping("rabbit_hide", 415); + addMapping("rabbit_stew", 413); + addMapping("rail", 66); + addMapping("record_11", 2266); + addMapping("record_13", 2256); + addMapping("record_blocks", 2258); + addMapping("record_cat", 2257); + addMapping("record_chirp", 2259); + addMapping("record_far", 2260); + addMapping("record_mall", 2261); + addMapping("record_mellohi", 2262); + addMapping("record_stal", 2263); + addMapping("record_strad", 2264); + addMapping("record_wait", 2267); + addMapping("record_ward", 2265); + addMapping("red_flower", 38); + addMapping("red_glazed_terracotta", 249); + addMapping("red_mushroom", 40); + addMapping("red_mushroom_block", 100); + addMapping("red_nether_brick", 215); + addMapping("red_sandstone", 179); + addMapping("red_sandstone_stairs", 180); + addMapping("red_shulker_box", 233); + addMapping("redstone", 331); + addMapping("redstone_block", 152); + addMapping("redstone_lamp", 123); + addMapping("redstone_ore", 73); + addMapping("redstone_torch", 76); + addMapping("reeds", 338); + addMapping("repeater", 356); + addMapping("repeating_command_block", 210); + addMapping("rotten_flesh", 367); + addMapping("saddle", 329); + addMapping("sand", 12); + addMapping("sandstone", 24); + addMapping("sandstone_stairs", 128); + addMapping("sapling", 6); + addMapping("sea_lantern", 169); + addMapping("shears", 359); + addMapping("shield", 442); + addMapping("shulker_shell", 450); + addMapping("sign", 323); + addMapping("silver_glazed_terracotta", 243); + addMapping("silver_shulker_box", 227); + addMapping("skull", 397); + addMapping("slime", 165); + addMapping("slime_ball", 341); + addMapping("snow", 80); + addMapping("snow_layer", 78); + addMapping("snowball", 332); + addMapping("soul_sand", 88); + addMapping("spawn_egg", 383); + addMapping("speckled_melon", 382); + addMapping("spectral_arrow", 439); + addMapping("spider_eye", 375); + addMapping("splash_potion", 438); + addMapping("sponge", 19); + addMapping("spruce_boat", 444); + addMapping("spruce_door", 427); + addMapping("spruce_fence", 188); + addMapping("spruce_fence_gate", 183); + addMapping("spruce_stairs", 134); + addMapping("stained_glass", 95); + addMapping("stained_glass_pane", 160); + addMapping("stained_hardened_clay", 159); + addMapping("stick", 280); + addMapping("sticky_piston", 29); + addMapping("stone", 1); + addMapping("stone_axe", 275); + addMapping("stone_brick_stairs", 109); + addMapping("stone_button", 77); + addMapping("stone_hoe", 291); + addMapping("stone_pickaxe", 274); + addMapping("stone_pressure_plate", 70); + addMapping("stone_shovel", 273); + addMapping("stone_slab", 44); + addMapping("stone_slab2", 182); + addMapping("stone_stairs", 67); + addMapping("stone_sword", 272); + addMapping("stonebrick", 98); + addMapping("string", 287); + addMapping("structure_block", 255); + addMapping("structure_void", 217); + addMapping("sugar", 353); + addMapping("tallgrass", 31); + addMapping("tipped_arrow", 440); + addMapping("tnt", 46); + addMapping("tnt_minecart", 407); + addMapping("torch", 50); + addMapping("totem_of_undying", 449); + addMapping("trapdoor", 96); + addMapping("trapped_chest", 146); + addMapping("tripwire_hook", 131); + addMapping("vine", 106); + addMapping("water_bucket", 326); + addMapping("waterlily", 111); + addMapping("web", 30); + addMapping("wheat", 296); + addMapping("wheat_seeds", 295); + addMapping("white_glazed_terracotta", 235); + addMapping("white_shulker_box", 219); + addMapping("wooden_axe", 271); + addMapping("wooden_button", 143); + addMapping("wooden_door", 324); + addMapping("wooden_hoe", 290); + addMapping("wooden_pickaxe", 270); + addMapping("wooden_pressure_plate", 72); + addMapping("wooden_shovel", 269); + addMapping("wooden_slab", 126); + addMapping("wooden_sword", 268); + addMapping("wool", 35); + addMapping("writable_book", 386); + addMapping("written_book", 387); + addMapping("yellow_flower", 37); + addMapping("yellow_glazed_terracotta", 239); + addMapping("yellow_shulker_box", 223); + } + +} diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/data/biome/OldChunkData.java b/src/main/java/com/github/dirtpowered/releasetobeta/data/biome/OldChunkData.java index b2b89d4..40f4566 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/data/biome/OldChunkData.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/data/biome/OldChunkData.java @@ -105,9 +105,16 @@ private byte[] getBiomeData(int x, int z) { double biomeTemperature = 1.0D - (1.0D - rawBiomeTemperature) * (1.0D - rawBiomeTemperature); double biomeHumidity = (humidity[i] * 0.15D + 0.5D) * 0.99D + 0.0021; - - biomeTemperature = Doubles.constrainToRange(biomeTemperature, 0.0D, 1.0D); - biomeHumidity = Doubles.constrainToRange(biomeHumidity, 0.0D, 1.0D); + + if(biomeTemperature<0) + biomeTemperature = 0; + if(biomeTemperature>1) + biomeTemperature = 1; + + if(biomeHumidity<0) + biomeHumidity = 0; + if(biomeHumidity>1) + biomeHumidity = 1; BiomeType biome = getBiomeType(biomeTemperature, biomeHumidity); biomeArray[i] = (byte) biome.getBiomeId(); diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/network/session/BetaClientSession.java b/src/main/java/com/github/dirtpowered/releasetobeta/network/session/BetaClientSession.java index 6248962..6c86d6c 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/network/session/BetaClientSession.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/network/session/BetaClientSession.java @@ -251,6 +251,7 @@ private void quitPlayer() { chunkCache.purge(); main.getSessionRegistry().removeSession(player.getClientId()); + main.getStatsManager().saveStats(); } public void joinPlayer() { diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/betatomodern/B_1_7/StatisticsTranslator.java b/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/betatomodern/B_1_7/StatisticsTranslator.java index b37d0bf..bb6c563 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/betatomodern/B_1_7/StatisticsTranslator.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/betatomodern/B_1_7/StatisticsTranslator.java @@ -37,6 +37,8 @@ public void translate(ReleaseToBeta main, StatisticsPacketData packet, BetaClien int rawId = packet.getStatId(); ModernPlayer player = session.getPlayer(); + main.getStatsManager().addStats(player.getUsername(), packet.getStatId(), packet.getData()); + if (rawId > 5242999 || rawId < 5000) return; diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/moderntobeta/B_1_7/ClientRequestTranslator.java b/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/moderntobeta/B_1_7/ClientRequestTranslator.java index 42159e8..b52bbef 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/moderntobeta/B_1_7/ClientRequestTranslator.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/network/translator/moderntobeta/B_1_7/ClientRequestTranslator.java @@ -41,7 +41,7 @@ public void translate(ReleaseToBeta main, ClientRequestPacket packet, Session mo switch (request) { case STATS: - modernSession.send(new ServerStatisticsPacket(Collections.emptyMap())); + modernSession.send(new ServerStatisticsPacket(main.getStatsManager().getPlayerStats(betaSession.getPlayer().getUsername()))); break; case RESPAWN: betaSession.sendPacket(new RespawnPacketData((byte) betaSession.getPlayer().getDimension())); diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/utils/StatsManager.java b/src/main/java/com/github/dirtpowered/releasetobeta/utils/StatsManager.java new file mode 100644 index 0000000..7e0f8b9 --- /dev/null +++ b/src/main/java/com/github/dirtpowered/releasetobeta/utils/StatsManager.java @@ -0,0 +1,166 @@ +package com.github.dirtpowered.releasetobeta.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import com.github.dirtpowered.releasetobeta.ReleaseToBeta; +import com.github.dirtpowered.releasetobeta.data.Block; +import com.github.dirtpowered.releasetobeta.data.Item; +import com.github.steveice10.mc.protocol.data.MagicValues; +import com.github.steveice10.mc.protocol.data.game.statistic.BreakBlockStatistic; +import com.github.steveice10.mc.protocol.data.game.statistic.BreakItemStatistic; +import com.github.steveice10.mc.protocol.data.game.statistic.CraftItemStatistic; +import com.github.steveice10.mc.protocol.data.game.statistic.GenericStatistic; +import com.github.steveice10.mc.protocol.data.game.statistic.Statistic; +import com.github.steveice10.mc.protocol.data.game.statistic.UseItemStatistic; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class StatsManager { + private static final HashMap mapping = new HashMap<>(); + + private final File folder; + private final ReleaseToBeta rtb; + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private HashMap> stats = new HashMap<>(); + public StatsManager(File folder, ReleaseToBeta rtb) { + this.folder = folder; + this.rtb = rtb; + } + + public void saveStats() { + Set keySet = stats.keySet(); + for (String username : keySet) { + try { + saveStats(username); + } catch(IOException e) { + Utils.printException(rtb.getLogger(), e, "Unable to save stats!"); + } + } + } + + public void saveStats(String username) throws IOException { + if(!folder.exists()) + folder.mkdirs(); + File file = new File(folder, username+".json"); + if(!file.exists()) + file.createNewFile(); + OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file)); + gson.toJson(stats.get(username), writer); + writer.close(); + } + + public void loadStats() { + if(!folder.exists()) + return; + stats = new HashMap<>(); + File[] files = folder.listFiles(); + for (File file : files) { + if(file.getName().endsWith(".json")) { + String username = Utils.safeSubstring(file.getName(), 0, -5); + try { + loadStats(username); + } catch(IOException e) { + Utils.printException(rtb.getLogger(), e, "Unable to load stats!"); + } + } + } + } + public boolean loadStats(String username) throws IOException { + File file = new File(folder, username+".json"); + if(!file.exists()) + return false; + InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); + HashMap map = gson.fromJson(reader,HashMap.class); + HashMap stats = new HashMap<>(); + for (String str : map.keySet()) { + try { + stats.put(Integer.valueOf(str), map.get(str).intValue()); + } catch(NumberFormatException e) {} + } + this.stats.put(username, stats); + reader.close(); + return true; + } + + public void addStats(String username, int statId, int value) { + if(!stats.containsKey(username)) + stats.put(username, new HashMap<>()); + Map stats = this.stats.get(username); + if(!stats.containsKey(statId)) { + stats.put(statId, value); + return; + } + stats.put(statId, stats.get(statId)+value); + } + + private Statistic translateStatistic(int id) { + if(mapping.containsKey(id)) { + return MagicValues.key(Statistic.class, mapping.get(id)); + } + + if(id>=16973824) { + return new BreakItemStatistic("minecraft."+Item.id2name(id - 16973824)); + } + if(id>=16908288) { + return new UseItemStatistic("minecraft."+Item.id2name(id - 16908288)); + } + + if(id>=16842752) { + return new CraftItemStatistic("minecraft."+Item.id2name(id - 16842752)); + } + + if(id>=16777216) { + return new BreakBlockStatistic("minecraft."+Item.id2name(id - 16777216)); + } + + return null; // Unknown. + } + + public Map getPlayerStats(String username) { + HashMap result = new HashMap<>(); + if(!stats.containsKey(username)) + return result; + Map stats = this.stats.get(username); + Set keySet = stats.keySet(); + for (int id : keySet) { + Statistic statistic = translateStatistic(id); + if(statistic != null) { + result.put(statistic, statistic == GenericStatistic.DAMAGE_DEALT || + statistic == GenericStatistic.DAMAGE_TAKEN + ? stats.get(id) * 5 : stats.get(id)); + } + } + return result; + } + + static { + mapping.put(1004, "stat.leaveGame"); + mapping.put(1100, "stat.playOneMinute"); + mapping.put(2000, "stat.walkOneCm"); + mapping.put(2002, "stat.fallOneCm"); + mapping.put(2003, "stat.climbOneCm"); + mapping.put(2004, "stat.flyOneCm"); + mapping.put(2005, "stat.walkUnderWaterOneCm"); + mapping.put(2006, "stat.minecartOneCm"); + mapping.put(2007, "stat.boatOneCm"); + mapping.put(2008, "stat.pigOneCm"); + mapping.put(2001, "stat.swimOneCm"); + mapping.put(2010, "stat.jump"); + mapping.put(2011, "stat.drop"); + mapping.put(2020, "stat.damageDealt"); + mapping.put(2021, "stat.damageTaken"); + mapping.put(2022, "stat.deaths"); + mapping.put(2023, "stat.mobKills"); + mapping.put(2024, "stat.playerKills"); + mapping.put(2025, "stat.fishCaught"); + } +} + diff --git a/src/main/java/com/github/dirtpowered/releasetobeta/utils/Utils.java b/src/main/java/com/github/dirtpowered/releasetobeta/utils/Utils.java index 0768ce3..74213ae 100644 --- a/src/main/java/com/github/dirtpowered/releasetobeta/utils/Utils.java +++ b/src/main/java/com/github/dirtpowered/releasetobeta/utils/Utils.java @@ -28,8 +28,12 @@ import com.github.dirtpowered.releasetobeta.data.entity.DummyEntity; import com.github.dirtpowered.releasetobeta.data.entity.EntityCache; import com.github.dirtpowered.releasetobeta.data.entity.model.Entity; +import com.github.dirtpowered.releasetobeta.logger.AbstractLogger; + import lombok.Getter; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Arrays; import java.util.UUID; @@ -116,4 +120,10 @@ public static String safeSubstring(String str, int start, int end) { return str.substring(start, end); } } + + public static void printException(AbstractLogger logger, Throwable exc, String msg) { + StringWriter sw = new StringWriter().append(msg == null ? "" : msg + "\n"); + exc.printStackTrace(new PrintWriter(sw)); + logger.error(msg); + } }