diff --git a/common/src/main/java/common/init/EntityRegistry.java b/common/src/main/java/common/init/EntityRegistry.java index e0c9b95c..436e54f4 100755 --- a/common/src/main/java/common/init/EntityRegistry.java +++ b/common/src/main/java/common/init/EntityRegistry.java @@ -58,7 +58,6 @@ public abstract class EntityRegistry { private static final Map, String> CLASS_TO_STRING = Maps., String>newHashMap(); private static final Map> ID_TO_CLASS = Maps.>newHashMap(); private static final Map, Integer> CLASS_TO_ID = Maps., Integer>newHashMap(); -// private static final Map STRING_TO_ID = Maps.newHashMap(); public static final Map SPAWN_EGGS = Maps.newLinkedHashMap(); private static final Map STRING_TO_NAME = Maps.newHashMap(); @@ -68,10 +67,6 @@ public abstract class EntityRegistry { private static int registerEntity(String name, Class clazz, String typename) { if(clazz == null) throw new IllegalArgumentException("Kann keine null-Klasse registrieren"); -// String name = clazz.getSimpleName(); -// if(!name.startsWith("Entity")) -// throw new IllegalArgumentException("Fehlerhafter Klassenname: " + name); -// name = name.substring(6); if(STRING_TO_CLASS.containsKey(name)) throw new IllegalArgumentException("Klasse ist bereits registriert: " + name); int id = ++nextNetId; @@ -79,7 +74,6 @@ public abstract class EntityRegistry { CLASS_TO_STRING.put(clazz, name); ID_TO_CLASS.put(id, clazz); CLASS_TO_ID.put(clazz, id); -// STRING_TO_ID.put(name, id); STRING_TO_NAME.put(name, typename); return id; } @@ -89,18 +83,10 @@ public abstract class EntityRegistry { registerEntity(name, clazz, typename); } else { -// String name = clazz.getSimpleName().substring(6); SPAWN_EGGS.put(name, new EntityInfo(name, origin, eggColor, spotColor)); } } -// private static void registerEntity(Class clazz, String origin, String typename, int eggColor, int spotColor) { -// SpeciesInfo species = SpeciesRegistry.CLASSES.get(clazz); -// if(species == null) -// throw new IllegalArgumentException("'" + typename + "' ist keine NPC-Klasse"); -// registerEntity(species.sname, clazz, origin, typename, eggColor, spotColor); -// } - public static Entity createEntityByName(String entityName, World worldIn) { Entity entity = null; @@ -171,15 +157,9 @@ public abstract class EntityRegistry { if(oclass != null) { if(IObjectData.class.isAssignableFrom(oclass)) { -// Constructor cn; -// try { entity = oclass.getConstructor(World.class, double.class, double.class, double.class, int.class) .newInstance(worldIn, x, y, z, data); -// } -// catch(NoSuchMethodException e) { -// } } -// if(entity == null) else { entity = oclass.getConstructor(World.class, double.class, double.class, double.class) .newInstance(worldIn, x, y, z); @@ -228,23 +208,6 @@ public abstract class EntityRegistry { return STRING_TO_CLASS.get(id); } - -// public static List getEntityNameList(boolean lower) { -// Set set = STRING_TO_CLASS.keySet(); -// List list = Lists.newArrayList(); -// -// for(String s : set) { -// Class oclass = (Class)STRING_TO_CLASS.get(s); -// -// if((oclass.getModifiers() & Modifier.ABSTRACT) != Modifier.ABSTRACT) { -// list.add(lower ? s.toLowerCase() : s); -// } -// } -// -// list.add(lower ? "lightning" : "Lightning"); -// return list; -// } - public static Set> getAllClasses() { return CLASS_TO_STRING.keySet(); } @@ -278,7 +241,6 @@ public abstract class EntityRegistry { registerEntity("Xp", EntityXp.class, "Erfahrungskugel"); registerEntity("Egg", EntityEgg.class, "Ei"); registerEntity("LeashKnot", EntityLeashKnot.class, "Leinenknoten"); -// registerEntity("Painting", EntityPainting.class, "Gemälde"); registerEntity("Arrow", EntityArrow.class, "Pfeil"); registerEntity("Snowball", EntitySnowball.class, "Schneeball"); registerEntity("Fireball", EntityFireball.class, "Feuerball"); @@ -286,7 +248,6 @@ public abstract class EntityRegistry { registerEntity("Orb", EntityOrb.class, "Geladene Kugel"); registerEntity("Potion", EntityPotion.class, "Trank"); registerEntity("XpBottle", EntityXpBottle.class, "Erfahrungsfläschchen"); -// registerEntity("Frame", EntityFrame.class, "Rahmen"); registerEntity("Box", EntityBox.class, "Eisenwürfel"); registerEntity("Tnt", EntityTnt.class, "TNT"); registerEntity("Falling", EntityFalling.class, "Fallender Block"); @@ -304,26 +265,6 @@ public abstract class EntityRegistry { registerEntity("Crystal", EntityCrystal.class, "Kristall"); registerEntity("Bullet", EntityBullet.class, "Kugel"); -//// nextNetId = 255; -// registerEntity("Dragon", EntityDragon.class, 0x000000, 0x580094); -// registerEntity("Bat", EntityBat.class, 4996656, 986895); -// registerEntity("Pig", EntityPig.class, 15771042, 14377823); -// registerEntity("Sheep", EntitySheep.class, 15198183, 16758197); -// registerEntity("Cow", EntityCow.class, 4470310, 10592673); -// registerEntity("Chicken", EntityChicken.class, 10592673, 16711680); -// registerEntity("Squid", EntitySquid.class, 2243405, 7375001); -// registerEntity("Wolf", EntityWolf.class, 14144467, 13545366); -// registerEntity("Mooshroom", EntityMooshroom.class, 10489616, 12040119); -// registerEntity("Ocelot", EntityOcelot.class, 15720061, 5653556); -// registerEntity("Horse", EntityHorse.class, 12623485, 15656192); -// registerEntity("Rabbit", EntityRabbit.class, 10051392, 7555121); -// registerEntity("Mouse", EntityMouse.class, 0x606060, 0xb0b0b0); -// -//// nextNetId = 511; -// for(int z = 0; z < SpeciesRegistry.SPECIMEN.size(); z++) { -// SpeciesInfo info = SpeciesRegistry.SPECIMEN.get(z); -// registerEntity(info.clazz, info.color1, info.color2); -// } registerEggs(); } } diff --git a/server/src/main/java/server/Server.java b/server/src/main/java/server/Server.java index c58b21f1..9a68ee2d 100755 --- a/server/src/main/java/server/Server.java +++ b/server/src/main/java/server/Server.java @@ -405,7 +405,7 @@ public final class Server implements IThreadListener, Executor { public void run(long time) { Region.loadMap(); - Converter.convert(this); + Converter.convert(); long wtime = this.loadServerConfig(); if(this.keyPair == null) { Log.SYSTEM.info("Generiere neues Schlüsselpaar"); diff --git a/server/src/main/java/server/world/Converter.java b/server/src/main/java/server/world/Converter.java index 48ef9b4c..ca0e6a11 100644 --- a/server/src/main/java/server/world/Converter.java +++ b/server/src/main/java/server/world/Converter.java @@ -51,10 +51,13 @@ import common.entity.animal.EntitySquid; import common.entity.animal.EntityWolf; import common.entity.item.EntityBoat; import common.entity.item.EntityMinecart; +import common.init.BlockRegistry; import common.init.Blocks; import common.init.EntityRegistry; import common.init.TileRegistry; import common.log.Log; +import common.properties.Property; +import common.properties.PropertyEnum; import common.rng.Random; import common.tags.TagObject; import common.tileentity.TileEntity; @@ -72,8 +75,6 @@ import common.tileentity.TileEntitySign; import common.util.Facing; import common.util.NibbleArray; import common.world.State; -import common.world.Weather; -import server.Server; public abstract class Converter { private static class NbtTag { @@ -254,7 +255,6 @@ public abstract class Converter { private static final Map ENTITY_MAP = Maps.newHashMap(); private static final Map TILE_MAP = Maps.newHashMap(); private static final char[] BLOCK_MAP = new char[65536]; - private static final Map OLD_GAMERULES = Maps.newHashMap(); private static void mapEntity(Class clazz, String ... names) { String name = EntityRegistry.getEntityString(clazz); @@ -290,7 +290,13 @@ public abstract class Converter { private static void mapBlockData(Block block, int id) { for(int z = 0; z < 16; z++) { - mapBlock(block.getStateFromMeta(z), id, z); + State state = block.getStateFromMeta(z); + StringBuilder sb = new StringBuilder(); + for(Entry prop : state.getProperties().entrySet()) { + sb.append(".withProperty(").append(block.getClass().getSimpleName()).append('.').append(prop.getKey().getName().toUpperCase()).append(", ").append(prop.getKey() instanceof PropertyEnum penum ? penum.getType().getSimpleName() + "." + ((Enum)prop.getValue()).name() : prop.getValue()).append(')'); + } + Log.IO.debug("mapBlock(Blocks.%s.getState()%s, %d, %d)", BlockRegistry.getNameFromBlock(block), sb.toString(), id, z); + mapBlock(state, id, z); } } @@ -301,18 +307,6 @@ public abstract class Converter { } static { - OLD_GAMERULES.put("doFireTick", "fireTick"); - OLD_GAMERULES.put("mobGriefing", "mobGriefing"); - OLD_GAMERULES.put("doMobSpawning", "mobSpawning"); - OLD_GAMERULES.put("doMobLoot", "dropLoot"); - OLD_GAMERULES.put("doTileDrops", "dropBlocks"); - OLD_GAMERULES.put("doEntityDrops", "dropObjects"); - OLD_GAMERULES.put("naturalRegeneration", "naturalRegeneration"); - OLD_GAMERULES.put("doDaylightCycle", "daylightCycle"); - OLD_GAMERULES.put("keepInventory", "keepInventory"); - OLD_GAMERULES.put("doWeatherCycle", "weatherChanges"); - OLD_GAMERULES.put("randomTickSpeed", "randomTickSpeed"); - mapEntity(EntityBoat.class, "Boat", "boat"); mapEntity(EntityMinecart.class, "Minecart", "MinecartRideable", "minecart"); mapEntity(EntityBat.class, "Bat", "bat"); @@ -707,7 +701,7 @@ public abstract class Converter { mapBlockData(Blocks.carrot, 141); mapBlockData(Blocks.potato, 142); mapBlockData(Blocks.wooden_button, 143); - mapBlockData(Blocks.skull, 144); // -NODROP + mapBlockData(Blocks.skull, 144); mapBlockData(Blocks.anvil, 145); mapBlockData(Blocks.trapped_chest, 146); mapBlockData(Blocks.light_weighted_pressure_plate, 147); @@ -854,6 +848,8 @@ public abstract class Converter { } }, 252); mapBlock(Blocks.obsidian, 255); + + Log.IO.debug("Hash: %08x", Arrays.hashCode(BLOCK_MAP)); } private static Object read(DataInput input, byte id) throws IOException { @@ -1170,9 +1166,6 @@ public abstract class Converter { NbtTag tag = readTag(in); in.close(); TagObject ntag = convertChunkData(tag, legacy); -// DataOutputStream out = newreg.getOutputStream(nx, nz); -// CompressedStreamTools.write(tag, out); -// out.close(); newreg.writeTag(nx, nz, ntag); } } @@ -1183,7 +1176,6 @@ public abstract class Converter { if(percent > prev) { start = postProgress(start, percent); } -// this.doneChunks += 1; } } oldreg.close(); @@ -1195,7 +1187,7 @@ public abstract class Converter { return start; } - public static boolean convert(Server server) { + public static boolean convert() { long cur = System.currentTimeMillis(); if(new File("server.cdt").exists()) return false; @@ -1232,61 +1224,41 @@ public abstract class Converter { return false; } Log.IO.info("Version: %s", ver); - if(ver != SaveVersion.RELEASE_1_13) { - Log.IO.info("Konvertiere Chunk-Daten von region/*.mca,*.mcr"); - File regionDir = new File("region"); - if(regionDir.exists()) { - File chunkDir = new File(new File("chunk"), "terra"); - Log.IO.info("Konvertiere Welt nach '" + chunkDir + "' ..."); - Log.IO.info("Durchsuche Ordner unter '" + regionDir + "' nach .mca- und .mcr-Dateien ..."); - File[] files = regionDir.listFiles(new FilenameFilter() { - public boolean accept(File file, String name) { - return name.endsWith(".mca") || name.endsWith(".mcr"); - } - }); - if(files.length == 0) { - Log.IO.info("Keine .mca- oder .mcr-Dateien gefunden."); - } - else { - Log.IO.info("Ingesamt wurden " + files.length + " .mca-Dateien und .mcr-Dateien gefunden, konvertiere ..."); - if(ver == SaveVersion.RELEASE_1_9) - Log.IO.info("Konvertiere von neuerer Version, dies wird Blöcke entfernen ..."); - chunkDir.mkdirs(); - int progress = 0; - long time = System.currentTimeMillis(); - long start = postProgress(time, 0); - for(File file : files) { - int percent = (int)Math.round(100.0D * (double)progress / (double)files.length); - Log.IO.info("Konvertiere Chunk-Daten: " + file.getName() + " (" + progress + "/" + files.length + ")"); - start = convertChunks(chunkDir, file, start, progress, files.length); - ++progress; - start = postProgress(start, percent); - } - time = System.currentTimeMillis() - time; - Log.IO.info("Fertig. Konversion dauerte " + ((time / 60000L) > 0 ? ((time / 60000L) + " Minuten und ") : "") + ((time / 1000L) % 60L) + " Sekunden."); - } - } - } - else { + if(ver == SaveVersion.RELEASE_1_13) { Log.IO.warn("Konvertiere keine Chunk-Daten, da Version zu neu"); + return false; } - Log.IO.info("Konvertiere Daten von level.dat"); - NbtTag rules = tag.getTag("GameRules"); - for(Entry rule : OLD_GAMERULES.entrySet()) { - if(!rules.getString(rule.getKey()).isEmpty()) - server.getVariables().get(rule.getValue()).set(rules.getString(rule.getKey()), false, false); - } - Weather weather = tag.getByte("thundering") != 0 ? Weather.THUNDER : (tag.getByte("raining") != 0 ? Weather.RAIN : Weather.CLEAR); - if(weather != Weather.CLEAR) { - TagObject dataTag = new TagObject(); - dataTag.setString("Weather", weather.getName()); - Log.IO.info("Speichere neue data.cdt ..."); - File dataFile = new File(new File(new File("chunk"), "terra"), "data.cdt"); - try { - TagObject.writeGZip(dataTag, dataFile); + Log.IO.info("Konvertiere Chunk-Daten von region/*.mca,*.mcr"); + File regionDir = new File("region"); + if(regionDir.exists()) { + File chunkDir = new File(new File("chunk"), "terra"); + Log.IO.info("Konvertiere Welt nach '" + chunkDir + "' ..."); + Log.IO.info("Durchsuche Ordner unter '" + regionDir + "' nach .mca- und .mcr-Dateien ..."); + File[] files = regionDir.listFiles(new FilenameFilter() { + public boolean accept(File file, String name) { + return name.endsWith(".mca") || name.endsWith(".mcr"); + } + }); + if(files.length == 0) { + Log.IO.info("Keine .mca- oder .mcr-Dateien gefunden."); } - catch(Exception e) { - Log.IO.error(e, "Konnte Weltdaten nicht speichern"); + else { + Log.IO.info("Ingesamt wurden " + files.length + " .mca-Dateien und .mcr-Dateien gefunden, konvertiere ..."); + if(ver == SaveVersion.RELEASE_1_9) + Log.IO.info("Konvertiere von neuerer Version, dies wird Blöcke entfernen ..."); + chunkDir.mkdirs(); + int progress = 0; + long time = System.currentTimeMillis(); + long start = postProgress(time, 0); + for(File file : files) { + int percent = (int)Math.round(100.0D * (double)progress / (double)files.length); + Log.IO.info("Konvertiere Chunk-Daten: " + file.getName() + " (" + progress + "/" + files.length + ")"); + start = convertChunks(chunkDir, file, start, progress, files.length); + ++progress; + start = postProgress(start, percent); + } + time = System.currentTimeMillis() - time; + Log.IO.info("Fertig. Konversion dauerte " + ((time / 60000L) > 0 ? ((time / 60000L) + " Minuten und ") : "") + ((time / 1000L) % 60L) + " Sekunden."); } } Log.IO.info("Einstiegspunkt: /tele %d %d %d terra", tag.getInt("SpawnX"), tag.getInt("SpawnY"), tag.getInt("SpawnZ"));