converter TEMP

This commit is contained in:
Sen 2025-06-26 12:04:44 +02:00
parent 445c1be8af
commit 3a1679f0e9
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
3 changed files with 47 additions and 134 deletions

View file

@ -58,7 +58,6 @@ public abstract class EntityRegistry {
private static final Map<Class<? extends Entity>, String> CLASS_TO_STRING = Maps.<Class<? extends Entity>, String>newHashMap(); private static final Map<Class<? extends Entity>, String> CLASS_TO_STRING = Maps.<Class<? extends Entity>, String>newHashMap();
private static final Map<Integer, Class<? extends Entity>> ID_TO_CLASS = Maps.<Integer, Class<? extends Entity>>newHashMap(); private static final Map<Integer, Class<? extends Entity>> ID_TO_CLASS = Maps.<Integer, Class<? extends Entity>>newHashMap();
private static final Map<Class<? extends Entity>, Integer> CLASS_TO_ID = Maps.<Class<? extends Entity>, Integer>newHashMap(); private static final Map<Class<? extends Entity>, Integer> CLASS_TO_ID = Maps.<Class<? extends Entity>, Integer>newHashMap();
// private static final Map<String, Integer> STRING_TO_ID = Maps.<String, Integer>newHashMap();
public static final Map<String, EntityInfo> SPAWN_EGGS = Maps.<String, EntityInfo>newLinkedHashMap(); public static final Map<String, EntityInfo> SPAWN_EGGS = Maps.<String, EntityInfo>newLinkedHashMap();
private static final Map<String, String> STRING_TO_NAME = Maps.<String, String>newHashMap(); private static final Map<String, String> STRING_TO_NAME = Maps.<String, String>newHashMap();
@ -68,10 +67,6 @@ public abstract class EntityRegistry {
private static int registerEntity(String name, Class<? extends Entity> clazz, String typename) { private static int registerEntity(String name, Class<? extends Entity> clazz, String typename) {
if(clazz == null) if(clazz == null)
throw new IllegalArgumentException("Kann keine null-Klasse registrieren"); 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)) if(STRING_TO_CLASS.containsKey(name))
throw new IllegalArgumentException("Klasse ist bereits registriert: " + name); throw new IllegalArgumentException("Klasse ist bereits registriert: " + name);
int id = ++nextNetId; int id = ++nextNetId;
@ -79,7 +74,6 @@ public abstract class EntityRegistry {
CLASS_TO_STRING.put(clazz, name); CLASS_TO_STRING.put(clazz, name);
ID_TO_CLASS.put(id, clazz); ID_TO_CLASS.put(id, clazz);
CLASS_TO_ID.put(clazz, id); CLASS_TO_ID.put(clazz, id);
// STRING_TO_ID.put(name, id);
STRING_TO_NAME.put(name, typename); STRING_TO_NAME.put(name, typename);
return id; return id;
} }
@ -89,18 +83,10 @@ public abstract class EntityRegistry {
registerEntity(name, clazz, typename); registerEntity(name, clazz, typename);
} }
else { else {
// String name = clazz.getSimpleName().substring(6);
SPAWN_EGGS.put(name, new EntityInfo(name, origin, eggColor, spotColor)); SPAWN_EGGS.put(name, new EntityInfo(name, origin, eggColor, spotColor));
} }
} }
// private static void registerEntity(Class<? extends EntityLiving> 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) { public static Entity createEntityByName(String entityName, World worldIn) {
Entity entity = null; Entity entity = null;
@ -171,15 +157,9 @@ public abstract class EntityRegistry {
if(oclass != null) { if(oclass != null) {
if(IObjectData.class.isAssignableFrom(oclass)) { if(IObjectData.class.isAssignableFrom(oclass)) {
// Constructor<? extends Entity> cn;
// try {
entity = oclass.getConstructor(World.class, double.class, double.class, double.class, int.class) entity = oclass.getConstructor(World.class, double.class, double.class, double.class, int.class)
.newInstance(worldIn, x, y, z, data); .newInstance(worldIn, x, y, z, data);
// }
// catch(NoSuchMethodException e) {
// }
} }
// if(entity == null)
else { else {
entity = oclass.getConstructor(World.class, double.class, double.class, double.class) entity = oclass.getConstructor(World.class, double.class, double.class, double.class)
.newInstance(worldIn, x, y, z); .newInstance(worldIn, x, y, z);
@ -228,23 +208,6 @@ public abstract class EntityRegistry {
return STRING_TO_CLASS.get(id); return STRING_TO_CLASS.get(id);
} }
// public static List<String> getEntityNameList(boolean lower) {
// Set<String> set = STRING_TO_CLASS.keySet();
// List<String> list = Lists.<String>newArrayList();
//
// for(String s : set) {
// Class<? extends Entity> 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<Class<? extends Entity>> getAllClasses() { public static Set<Class<? extends Entity>> getAllClasses() {
return CLASS_TO_STRING.keySet(); return CLASS_TO_STRING.keySet();
} }
@ -278,7 +241,6 @@ public abstract class EntityRegistry {
registerEntity("Xp", EntityXp.class, "Erfahrungskugel"); registerEntity("Xp", EntityXp.class, "Erfahrungskugel");
registerEntity("Egg", EntityEgg.class, "Ei"); registerEntity("Egg", EntityEgg.class, "Ei");
registerEntity("LeashKnot", EntityLeashKnot.class, "Leinenknoten"); registerEntity("LeashKnot", EntityLeashKnot.class, "Leinenknoten");
// registerEntity("Painting", EntityPainting.class, "Gemälde");
registerEntity("Arrow", EntityArrow.class, "Pfeil"); registerEntity("Arrow", EntityArrow.class, "Pfeil");
registerEntity("Snowball", EntitySnowball.class, "Schneeball"); registerEntity("Snowball", EntitySnowball.class, "Schneeball");
registerEntity("Fireball", EntityFireball.class, "Feuerball"); registerEntity("Fireball", EntityFireball.class, "Feuerball");
@ -286,7 +248,6 @@ public abstract class EntityRegistry {
registerEntity("Orb", EntityOrb.class, "Geladene Kugel"); registerEntity("Orb", EntityOrb.class, "Geladene Kugel");
registerEntity("Potion", EntityPotion.class, "Trank"); registerEntity("Potion", EntityPotion.class, "Trank");
registerEntity("XpBottle", EntityXpBottle.class, "Erfahrungsfläschchen"); registerEntity("XpBottle", EntityXpBottle.class, "Erfahrungsfläschchen");
// registerEntity("Frame", EntityFrame.class, "Rahmen");
registerEntity("Box", EntityBox.class, "Eisenwürfel"); registerEntity("Box", EntityBox.class, "Eisenwürfel");
registerEntity("Tnt", EntityTnt.class, "TNT"); registerEntity("Tnt", EntityTnt.class, "TNT");
registerEntity("Falling", EntityFalling.class, "Fallender Block"); registerEntity("Falling", EntityFalling.class, "Fallender Block");
@ -304,26 +265,6 @@ public abstract class EntityRegistry {
registerEntity("Crystal", EntityCrystal.class, "Kristall"); registerEntity("Crystal", EntityCrystal.class, "Kristall");
registerEntity("Bullet", EntityBullet.class, "Kugel"); 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(); registerEggs();
} }
} }

View file

@ -405,7 +405,7 @@ public final class Server implements IThreadListener, Executor {
public void run(long time) { public void run(long time) {
Region.loadMap(); Region.loadMap();
Converter.convert(this); Converter.convert();
long wtime = this.loadServerConfig(); long wtime = this.loadServerConfig();
if(this.keyPair == null) { if(this.keyPair == null) {
Log.SYSTEM.info("Generiere neues Schlüsselpaar"); Log.SYSTEM.info("Generiere neues Schlüsselpaar");

View file

@ -51,10 +51,13 @@ import common.entity.animal.EntitySquid;
import common.entity.animal.EntityWolf; import common.entity.animal.EntityWolf;
import common.entity.item.EntityBoat; import common.entity.item.EntityBoat;
import common.entity.item.EntityMinecart; import common.entity.item.EntityMinecart;
import common.init.BlockRegistry;
import common.init.Blocks; import common.init.Blocks;
import common.init.EntityRegistry; import common.init.EntityRegistry;
import common.init.TileRegistry; import common.init.TileRegistry;
import common.log.Log; import common.log.Log;
import common.properties.Property;
import common.properties.PropertyEnum;
import common.rng.Random; import common.rng.Random;
import common.tags.TagObject; import common.tags.TagObject;
import common.tileentity.TileEntity; import common.tileentity.TileEntity;
@ -72,8 +75,6 @@ import common.tileentity.TileEntitySign;
import common.util.Facing; import common.util.Facing;
import common.util.NibbleArray; import common.util.NibbleArray;
import common.world.State; import common.world.State;
import common.world.Weather;
import server.Server;
public abstract class Converter { public abstract class Converter {
private static class NbtTag { private static class NbtTag {
@ -254,7 +255,6 @@ public abstract class Converter {
private static final Map<String, String> ENTITY_MAP = Maps.newHashMap(); private static final Map<String, String> ENTITY_MAP = Maps.newHashMap();
private static final Map<String, String> TILE_MAP = Maps.newHashMap(); private static final Map<String, String> TILE_MAP = Maps.newHashMap();
private static final char[] BLOCK_MAP = new char[65536]; private static final char[] BLOCK_MAP = new char[65536];
private static final Map<String, String> OLD_GAMERULES = Maps.newHashMap();
private static void mapEntity(Class<? extends Entity> clazz, String ... names) { private static void mapEntity(Class<? extends Entity> clazz, String ... names) {
String name = EntityRegistry.getEntityString(clazz); String name = EntityRegistry.getEntityString(clazz);
@ -290,7 +290,13 @@ public abstract class Converter {
private static void mapBlockData(Block block, int id) { private static void mapBlockData(Block block, int id) {
for(int z = 0; z < 16; z++) { for(int z = 0; z < 16; z++) {
mapBlock(block.getStateFromMeta(z), id, z); State state = block.getStateFromMeta(z);
StringBuilder sb = new StringBuilder();
for(Entry<Property, Comparable> 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 { 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(EntityBoat.class, "Boat", "boat");
mapEntity(EntityMinecart.class, "Minecart", "MinecartRideable", "minecart"); mapEntity(EntityMinecart.class, "Minecart", "MinecartRideable", "minecart");
mapEntity(EntityBat.class, "Bat", "bat"); mapEntity(EntityBat.class, "Bat", "bat");
@ -707,7 +701,7 @@ public abstract class Converter {
mapBlockData(Blocks.carrot, 141); mapBlockData(Blocks.carrot, 141);
mapBlockData(Blocks.potato, 142); mapBlockData(Blocks.potato, 142);
mapBlockData(Blocks.wooden_button, 143); mapBlockData(Blocks.wooden_button, 143);
mapBlockData(Blocks.skull, 144); // -NODROP mapBlockData(Blocks.skull, 144);
mapBlockData(Blocks.anvil, 145); mapBlockData(Blocks.anvil, 145);
mapBlockData(Blocks.trapped_chest, 146); mapBlockData(Blocks.trapped_chest, 146);
mapBlockData(Blocks.light_weighted_pressure_plate, 147); mapBlockData(Blocks.light_weighted_pressure_plate, 147);
@ -854,6 +848,8 @@ public abstract class Converter {
} }
}, 252); }, 252);
mapBlock(Blocks.obsidian, 255); mapBlock(Blocks.obsidian, 255);
Log.IO.debug("Hash: %08x", Arrays.hashCode(BLOCK_MAP));
} }
private static Object read(DataInput input, byte id) throws IOException { private static Object read(DataInput input, byte id) throws IOException {
@ -1170,9 +1166,6 @@ public abstract class Converter {
NbtTag tag = readTag(in); NbtTag tag = readTag(in);
in.close(); in.close();
TagObject ntag = convertChunkData(tag, legacy); TagObject ntag = convertChunkData(tag, legacy);
// DataOutputStream out = newreg.getOutputStream(nx, nz);
// CompressedStreamTools.write(tag, out);
// out.close();
newreg.writeTag(nx, nz, ntag); newreg.writeTag(nx, nz, ntag);
} }
} }
@ -1183,7 +1176,6 @@ public abstract class Converter {
if(percent > prev) { if(percent > prev) {
start = postProgress(start, percent); start = postProgress(start, percent);
} }
// this.doneChunks += 1;
} }
} }
oldreg.close(); oldreg.close();
@ -1195,7 +1187,7 @@ public abstract class Converter {
return start; return start;
} }
public static boolean convert(Server server) { public static boolean convert() {
long cur = System.currentTimeMillis(); long cur = System.currentTimeMillis();
if(new File("server.cdt").exists()) if(new File("server.cdt").exists())
return false; return false;
@ -1232,61 +1224,41 @@ public abstract class Converter {
return false; return false;
} }
Log.IO.info("Version: %s", ver); Log.IO.info("Version: %s", ver);
if(ver != SaveVersion.RELEASE_1_13) { 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 {
Log.IO.warn("Konvertiere keine Chunk-Daten, da Version zu neu"); Log.IO.warn("Konvertiere keine Chunk-Daten, da Version zu neu");
return false;
} }
Log.IO.info("Konvertiere Daten von level.dat"); Log.IO.info("Konvertiere Chunk-Daten von region/*.mca,*.mcr");
NbtTag rules = tag.getTag("GameRules"); File regionDir = new File("region");
for(Entry<String, String> rule : OLD_GAMERULES.entrySet()) { if(regionDir.exists()) {
if(!rules.getString(rule.getKey()).isEmpty()) File chunkDir = new File(new File("chunk"), "terra");
server.getVariables().get(rule.getValue()).set(rules.getString(rule.getKey()), false, false); Log.IO.info("Konvertiere Welt nach '" + chunkDir + "' ...");
} Log.IO.info("Durchsuche Ordner unter '" + regionDir + "' nach .mca- und .mcr-Dateien ...");
Weather weather = tag.getByte("thundering") != 0 ? Weather.THUNDER : (tag.getByte("raining") != 0 ? Weather.RAIN : Weather.CLEAR); File[] files = regionDir.listFiles(new FilenameFilter() {
if(weather != Weather.CLEAR) { public boolean accept(File file, String name) {
TagObject dataTag = new TagObject(); return name.endsWith(".mca") || name.endsWith(".mcr");
dataTag.setString("Weather", weather.getName()); }
Log.IO.info("Speichere neue data.cdt ..."); });
File dataFile = new File(new File(new File("chunk"), "terra"), "data.cdt"); if(files.length == 0) {
try { Log.IO.info("Keine .mca- oder .mcr-Dateien gefunden.");
TagObject.writeGZip(dataTag, dataFile);
} }
catch(Exception e) { else {
Log.IO.error(e, "Konnte Weltdaten nicht speichern"); 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")); Log.IO.info("Einstiegspunkt: /tele %d %d %d terra", tag.getInt("SpawnX"), tag.getInt("SpawnY"), tag.getInt("SpawnZ"));