diff --git a/sparklypaper-server/minecraft-patches/sources/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java.patch b/sparklypaper-server/minecraft-patches/sources/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java.patch new file mode 100644 index 0000000..b73e1bb --- /dev/null +++ b/sparklypaper-server/minecraft-patches/sources/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java.patch @@ -0,0 +1,10 @@ +--- a/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java ++++ b/ca/spottedleaf/dataconverter/minecraft/converters/itemstack/ConverterItemStackToDataComponents.java +@@ -1220,6 +_,7 @@ + ret.setString("id", this.id); + ret.setInt("count", this.count); + if (!this.tag.isEmpty()) { ++ net.sparklypower.sparklypaper.LegacyNBTRemapper.INSTANCE.remap(this.tag); // SparklyPaper - Remap SparklyPower hacky legacy NBT tags + this.components.setMap("minecraft:custom_data", this.tag); + } + diff --git a/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerEntity.java.patch b/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerEntity.java.patch index ea84eee..2fd4b17 100644 --- a/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerEntity.java.patch +++ b/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java -@@ -205,6 +_,7 @@ +@@ -209,6 +_,7 @@ if (this.entity.hasImpulse || this.trackDelta || this.entity instanceof LivingEntity && ((LivingEntity)this.entity).isFallFlying()) { Vec3 deltaMovement = this.entity.getDeltaMovement(); @@ -8,7 +8,7 @@ double d = deltaMovement.distanceToSqr(this.lastSentMovement); if (d > 1.0E-7 || d > 0.0 && deltaMovement.lengthSqr() == 0.0) { this.lastSentMovement = deltaMovement; -@@ -222,6 +_,7 @@ +@@ -226,6 +_,7 @@ this.broadcast.accept(new ClientboundSetEntityMotionPacket(this.entity.getId(), this.lastSentMovement)); } } diff --git a/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch index d9422fe..800481e 100644 --- a/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch +++ b/sparklypaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -562,6 +_,12 @@ +@@ -565,6 +_,12 @@ } // Paper end - chunk tick iteration diff --git a/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/Display.java.patch b/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/Display.java.patch index ebeeef0..6e4864f 100644 --- a/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/Display.java.patch +++ b/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/Display.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/Display.java +++ b/net/minecraft/world/entity/Display.java -@@ -681,7 +_,7 @@ +@@ -677,7 +_,7 @@ private static final byte INITIAL_TEXT_OPACITY = -1; public static final int INITIAL_BACKGROUND = 1073741824; private static final int INITIAL_LINE_WIDTH = 200; diff --git a/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch b/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch index cc136ce..737ba65 100644 --- a/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch +++ b/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -2127,6 +_,12 @@ +@@ -2146,6 +_,12 @@ if (!(shootable.getItem() instanceof ProjectileWeaponItem)) { return ItemStack.EMPTY; } else { diff --git a/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch b/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch index debb5da..dc04a5d 100644 --- a/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch +++ b/sparklypaper-server/minecraft-patches/sources/net/minecraft/world/level/block/Blocks.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/Blocks.java +++ b/net/minecraft/world/level/block/Blocks.java -@@ -6899,6 +_,52 @@ +@@ -6887,6 +_,52 @@ .sound(SoundType.SWEET_BERRY_BUSH) .pushReaction(PushReaction.DESTROY) ); diff --git a/sparklypaper-server/src/main/kotlin/net/sparklypower/sparklypaper/LegacyNBTRemapper.kt b/sparklypaper-server/src/main/kotlin/net/sparklypower/sparklypaper/LegacyNBTRemapper.kt new file mode 100644 index 0000000..7406bf7 --- /dev/null +++ b/sparklypaper-server/src/main/kotlin/net/sparklypower/sparklypaper/LegacyNBTRemapper.kt @@ -0,0 +1,95 @@ +package net.sparklypower.sparklypaper + +import ca.spottedleaf.dataconverter.types.MapType + +object LegacyNBTRemapper { + /** + * Remaps hacky direct NBT storage used in SparklyPower to proper PersistentDataContainer data + */ + fun remap(tag: MapType) { + val perfectDreamsMap = tag.getMap("PerfectDreams") + + if (perfectDreamsMap != null) { + val publicBukkitValuesMap = tag.getOrCreateMap("PublicBukkitValues") + + // The "setBoolean" functions do set bytes behind the scenes, just like how we do the things in SparklyPower + perfectDreamsMap.getStringAndRemove("isJetpack")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_jetpack", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("disallowCrafting")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:disallow_crafting", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("poop")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_poop", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("renamedBySeuZe")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_renamed_by_seu_ze", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("isMonsterPickaxe")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_monster_tool", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("itemOwner")?.let { + publicBukkitValuesMap.setString("sparklypower:item_owner", it) + } + + perfectDreamsMap.getStringAndRemove("DreamFusca")?.let { + publicBukkitValuesMap.setString("sparklypower:fusca_info", it) + } + + perfectDreamsMap.getStringAndRemove("isFusca")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_fusca", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("fancyLeatherArmor")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_fancy_leather_armor", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("caixaSecretaLevel")?.let { + publicBukkitValuesMap.setInt("sparklypower:caixa_secreta_level", it.toInt()) + } + + perfectDreamsMap.getStringAndRemove("caixaSecretaWorld")?.let { + publicBukkitValuesMap.setString("sparklypower:caixa_secreta_world", it) + } + + perfectDreamsMap.getStringAndRemove("isMoveSpawners")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_move_spawners_tool", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("spawnerType")?.let { + publicBukkitValuesMap.setString("sparklypower:spawner_type", it) + } + + perfectDreamsMap.getStringAndRemove("isMochila")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_mochila", it.toBoolean()) + } + + perfectDreamsMap.getStringAndRemove("mochilaId")?.let { + publicBukkitValuesMap.setLong("sparklypower:mochila_id", it.toLong()) + } + + perfectDreamsMap.getStringAndRemove("customMapOwner")?.let { + publicBukkitValuesMap.setString("sparklypower:map_custom_owner", it) + } + + perfectDreamsMap.getStringAndRemove("quickTeleport")?.let { + publicBukkitValuesMap.setBoolean("sparklypower:is_quick_resources_teleport", it.toBoolean()) + } + + // If it is empty, then it means that we have migrated everything and we can remove the old PerfectDreams tag, yay! + if (perfectDreamsMap.isEmpty) + tag.remove("PerfectDreams") + } + } + + private fun MapType.getStringAndRemove(key: String): String? { + val v = getString(key) + remove(key) + return v + } +} \ No newline at end of file