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);
+ }
}