From bd23c93071452b19f243f667961533bd5d4930d6 Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Sat, 4 May 2019 17:49:29 +0200 Subject: [PATCH] Allow logblock to load when it encounters unknown material/entity types --- .../java/de/diddiz/LogBlock/BlockChange.java | 3 +++ .../diddiz/LogBlock/EntityTypeConverter.java | 13 +++++++++--- .../de/diddiz/LogBlock/MaterialConverter.java | 20 +++++++++++++++---- .../diddiz/LogBlock/SummedBlockChanges.java | 3 ++- .../diddiz/LogBlock/SummedEntityChanges.java | 3 ++- .../java/de/diddiz/LogBlock/WorldEditor.java | 3 +++ 6 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/diddiz/LogBlock/BlockChange.java b/src/main/java/de/diddiz/LogBlock/BlockChange.java index d7bb235..1f772c5 100644 --- a/src/main/java/de/diddiz/LogBlock/BlockChange.java +++ b/src/main/java/de/diddiz/LogBlock/BlockChange.java @@ -72,6 +72,9 @@ public class BlockChange implements LookupCacheElement { public String toString() { BlockData type = getBlockSet(); BlockData replaced = getBlockReplaced(); + if (type == null || replaced == null) { + return "Unknown block modification"; + } String typeDetails = null; if (BlockStateCodecs.hasCodec(type.getMaterial())) { try { diff --git a/src/main/java/de/diddiz/LogBlock/EntityTypeConverter.java b/src/main/java/de/diddiz/LogBlock/EntityTypeConverter.java index b55c6e5..88ca1ef 100644 --- a/src/main/java/de/diddiz/LogBlock/EntityTypeConverter.java +++ b/src/main/java/de/diddiz/LogBlock/EntityTypeConverter.java @@ -55,7 +55,7 @@ public class EntityTypeConverter { } public static EntityType getEntityType(int entityTypeId) { - return idToEntityType[entityTypeId]; + return entityTypeId >= 0 && entityTypeId < idToEntityType.length ? idToEntityType[entityTypeId] : null; } private static void reinitializeEntityTypesCatchException() { @@ -78,8 +78,15 @@ public class EntityTypeConverter { ResultSet rs = smt.executeQuery("SELECT id, name FROM `lb-entitytypes`"); while (rs.next()) { int key = rs.getInt(1); - EntityType entityType = EntityType.valueOf(rs.getString(2)); - internalAddEntityType(key, entityType); + try { + EntityType entityType = EntityType.valueOf(rs.getString(2)); + internalAddEntityType(key, entityType); + } catch (IllegalArgumentException ignored) { + // the key is used, but not available in this version + if (nextEntityTypeId <= key) { + nextEntityTypeId = key + 1; + } + } } rs.close(); smt.close(); diff --git a/src/main/java/de/diddiz/LogBlock/MaterialConverter.java b/src/main/java/de/diddiz/LogBlock/MaterialConverter.java index 8babf3d..1c90d7d 100644 --- a/src/main/java/de/diddiz/LogBlock/MaterialConverter.java +++ b/src/main/java/de/diddiz/LogBlock/MaterialConverter.java @@ -122,15 +122,27 @@ public class MaterialConverter { } public static BlockData getBlockData(int materialId, int blockStateId) { - String material = idToMaterial[materialId]; - if (blockStateId >= 0) { + String material = materialId >= 0 && materialId < idToMaterial.length ? idToMaterial[materialId] : null; + if (material == null) { + return null; + } + if (blockStateId >= 0 && blockStateId < idToBlockState.length && idToBlockState[blockStateId] != null) { material = material + idToBlockState[blockStateId]; } - return Bukkit.createBlockData(material); + try { + return Bukkit.createBlockData(material); + } catch (IllegalArgumentException ignored) { + // fall back to create the default block data for the material + try { + return Bukkit.createBlockData(idToMaterial[materialId]); + } catch (IllegalArgumentException ignored2) { + return null; + } + } } public static Material getMaterial(int materialId) { - return materialKeyToMaterial.get(idToMaterial[materialId]); + return materialId >= 0 && materialId < idToMaterial.length ? materialKeyToMaterial.get(idToMaterial[materialId]) : null; } private static void reinitializeMaterialsCatchException() { diff --git a/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java b/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java index 919949a..c7b0584 100644 --- a/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java +++ b/src/main/java/de/diddiz/LogBlock/SummedBlockChanges.java @@ -5,6 +5,7 @@ import org.bukkit.Location; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Objects; import static de.diddiz.util.Utils.spaces; @@ -30,6 +31,6 @@ public class SummedBlockChanges implements LookupCacheElement { @Override public String getMessage() { - return created + spaces((int) ((10 - String.valueOf(created).length()) / spaceFactor)) + destroyed + spaces((int) ((10 - String.valueOf(destroyed).length()) / spaceFactor)) + (actor != null ? actor.getName() : MaterialConverter.getMaterial(type).toString()); + return created + spaces((int) ((10 - String.valueOf(created).length()) / spaceFactor)) + destroyed + spaces((int) ((10 - String.valueOf(destroyed).length()) / spaceFactor)) + (actor != null ? actor.getName() : Objects.toString(MaterialConverter.getMaterial(type))); } } diff --git a/src/main/java/de/diddiz/LogBlock/SummedEntityChanges.java b/src/main/java/de/diddiz/LogBlock/SummedEntityChanges.java index c47ab8c..5b1fd45 100644 --- a/src/main/java/de/diddiz/LogBlock/SummedEntityChanges.java +++ b/src/main/java/de/diddiz/LogBlock/SummedEntityChanges.java @@ -5,6 +5,7 @@ import org.bukkit.Location; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Objects; import static de.diddiz.util.Utils.spaces; @@ -30,6 +31,6 @@ public class SummedEntityChanges implements LookupCacheElement { @Override public String getMessage() { - return created + spaces((int) ((10 - String.valueOf(created).length()) / spaceFactor)) + destroyed + spaces((int) ((10 - String.valueOf(destroyed).length()) / spaceFactor)) + (actor != null ? actor.getName() : EntityTypeConverter.getEntityType(type).toString()); + return created + spaces((int) ((10 - String.valueOf(created).length()) / spaceFactor)) + destroyed + spaces((int) ((10 - String.valueOf(destroyed).length()) / spaceFactor)) + (actor != null ? actor.getName() : Objects.toString(EntityTypeConverter.getEntityType(type))); } } diff --git a/src/main/java/de/diddiz/LogBlock/WorldEditor.java b/src/main/java/de/diddiz/LogBlock/WorldEditor.java index b54b401..668a4a3 100644 --- a/src/main/java/de/diddiz/LogBlock/WorldEditor.java +++ b/src/main/java/de/diddiz/LogBlock/WorldEditor.java @@ -226,6 +226,9 @@ public class WorldEditor implements Runnable { @Override public PerformResult perform() throws WorldEditorException { + if (type == null) { + throw new WorldEditorException("Unkown entity type for entity " + entityUUID, loc); + } if (changeType == (rollback ? EntityChangeType.KILL : EntityChangeType.CREATE)) { // spawn entity UUID uuid = getReplacedUUID(entityId, entityUUID);