diff --git a/legacy-fabric-networking-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java b/legacy-fabric-networking-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java new file mode 100644 index 000000000..c6e206be2 --- /dev/null +++ b/legacy-fabric-networking-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.mixin.networking.versioned; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.PacketByteBuf; + +import net.legacyfabric.fabric.impl.networking.PacketByteBufExtension; + +@Mixin(PacketByteBuf.class) +public abstract class PacketByteBufMixin implements PacketByteBufExtension { + @Shadow + public abstract PacketByteBuf writeNbtCompound(@Nullable NbtCompound nbt); + + @Override + public PacketByteBuf writeCompound(NbtCompound tag) { + return writeNbtCompound(tag); + } +} diff --git a/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/PacketByteBufMixin.java b/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/PacketByteBufMixin.java index c360a2c04..1ed1a52a3 100644 --- a/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/PacketByteBufMixin.java +++ b/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/PacketByteBufMixin.java @@ -30,7 +30,7 @@ import net.legacyfabric.fabric.impl.networking.PacketByteBufExtension; @Mixin(PacketByteBuf.class) -public class PacketByteBufMixin implements PacketByteBufExtension { +public abstract class PacketByteBufMixin implements PacketByteBufExtension { @Override @Environment(EnvType.CLIENT) public Packet createCustomPayloadC2SPacket(String channelName) { diff --git a/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java b/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java new file mode 100644 index 000000000..d4611ec2b --- /dev/null +++ b/legacy-fabric-networking-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.mixin.networking.versioned; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.PacketByteBuf; + +import net.legacyfabric.fabric.impl.networking.PacketByteBufExtension; + +@Mixin(PacketByteBuf.class) +public abstract class PacketByteBufMixin implements PacketByteBufExtension { + @Shadow + public abstract void writeNbtCompound(NbtCompound par1); + + @Override + public PacketByteBuf writeCompound(NbtCompound tag) { + this.writeNbtCompound(tag); + return (PacketByteBuf) (Object) this; + } +} diff --git a/legacy-fabric-networking-api-v1/1.7.10/src/main/resources/legacy-fabric-networking-api-v1.mixins.json b/legacy-fabric-networking-api-v1/1.7.10/src/main/resources/legacy-fabric-networking-api-v1.mixins.json index a09e89bfc..8cd108280 100644 --- a/legacy-fabric-networking-api-v1/1.7.10/src/main/resources/legacy-fabric-networking-api-v1.mixins.json +++ b/legacy-fabric-networking-api-v1/1.7.10/src/main/resources/legacy-fabric-networking-api-v1.mixins.json @@ -7,7 +7,8 @@ "CustomPayloadC2SPacketMixin", "MinecraftServerMixin", "PacketByteBufMixin", - "PlayerManagerMixin" + "PlayerManagerMixin", + "versioned.PacketByteBufMixin" ], "client": [ "client.CustomPayloadS2CPacketMixin", diff --git a/legacy-fabric-networking-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java b/legacy-fabric-networking-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java new file mode 100644 index 000000000..d4611ec2b --- /dev/null +++ b/legacy-fabric-networking-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/networking/versioned/PacketByteBufMixin.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.mixin.networking.versioned; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.PacketByteBuf; + +import net.legacyfabric.fabric.impl.networking.PacketByteBufExtension; + +@Mixin(PacketByteBuf.class) +public abstract class PacketByteBufMixin implements PacketByteBufExtension { + @Shadow + public abstract void writeNbtCompound(NbtCompound par1); + + @Override + public PacketByteBuf writeCompound(NbtCompound tag) { + this.writeNbtCompound(tag); + return (PacketByteBuf) (Object) this; + } +} diff --git a/legacy-fabric-networking-api-v1/1.8.9/src/main/resources/legacy-fabric-networking-api-v1.mixins.json b/legacy-fabric-networking-api-v1/1.8.9/src/main/resources/legacy-fabric-networking-api-v1.mixins.json index a75644c36..8b1ca4521 100644 --- a/legacy-fabric-networking-api-v1/1.8.9/src/main/resources/legacy-fabric-networking-api-v1.mixins.json +++ b/legacy-fabric-networking-api-v1/1.8.9/src/main/resources/legacy-fabric-networking-api-v1.mixins.json @@ -6,7 +6,8 @@ "ClientConnectionMixin", "CustomPayloadC2SPacketMixin", "MinecraftServerMixin", - "PlayerManagerMixin" + "PlayerManagerMixin", + "versioned.PacketByteBufMixin" ], "client": [ "client.CustomPayloadS2CPacketMixin", diff --git a/legacy-fabric-networking-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/networking/PacketByteBufExtension.java b/legacy-fabric-networking-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/networking/PacketByteBufExtension.java index fff07bcc5..ae97f6e9e 100644 --- a/legacy-fabric-networking-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/networking/PacketByteBufExtension.java +++ b/legacy-fabric-networking-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/networking/PacketByteBufExtension.java @@ -17,13 +17,21 @@ package net.legacyfabric.fabric.impl.networking; +import net.minecraft.nbt.NbtCompound; import net.minecraft.network.Packet; +import net.minecraft.util.PacketByteBuf; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; public interface PacketByteBufExtension { @Environment(EnvType.CLIENT) - Packet createCustomPayloadC2SPacket(String channelName); - Packet createCustomPayloadS2CPacket(String channelName); + default Packet createCustomPayloadC2SPacket(String channelName) { + return null; + } + default Packet createCustomPayloadS2CPacket(String channelName) { + return null; + } + + PacketByteBuf writeCompound(NbtCompound tag); } diff --git a/legacy-fabric-registry-sync-api-v1/1.10.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json b/legacy-fabric-registry-sync-api-v1/1.10.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json index 9e64957e8..fb5274ab6 100644 --- a/legacy-fabric-registry-sync-api-v1/1.10.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/1.10.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json @@ -8,7 +8,6 @@ "mixins": [ "SimpleRegistryMixin", "class_2929Mixin", - "PlayerManagerMixin", "BlockMixin", "ItemMixin", "PacketByteBufMixin", diff --git a/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java b/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java deleted file mode 100644 index 84ebd46f7..000000000 --- a/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 Legacy Fabric - * Copyright (c) 2016 - 2022 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.legacyfabric.fabric.mixin.registry.sync; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.network.ClientConnection; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.integrated.IntegratedServer; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.loader.api.FabricLoader; - -import net.legacyfabric.fabric.api.networking.v1.ServerPlayNetworking; -import net.legacyfabric.fabric.impl.registry.sync.RegistryRemapperAccess; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; - -@Mixin(PlayerManager.class) -public class PlayerManagerMixin { - @Shadow - @Final - private MinecraftServer server; - - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 2), method = "method_12827") - public void playerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { - if (fabric_shouldSend()) { - player.networkHandler.sendPacket(ServerPlayNetworking.createS2CPacket(RegistryRemapperAccess.PACKET_ID, ServerRegistryRemapper.getInstance().createBuf())); - } - } - - @Unique - private boolean fabric_shouldSend() { - boolean published = false; - - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - published = fabric_isPublished(); - } - - return this.server.isDedicated() || published; - } - - @Environment(EnvType.CLIENT) - @Unique - private boolean fabric_isPublished() { - return ((IntegratedServer) this.server).isPublished(); - } -} diff --git a/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json b/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json index c95574ffd..28dbfae1b 100644 --- a/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json @@ -8,7 +8,6 @@ "mixins": [ "SimpleRegistryMixin", "class_2929Mixin", - "PlayerManagerMixin", "BlockMixin", "ItemMixin", "PacketByteBufMixin", diff --git a/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json b/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json index c1478703e..2b3435c36 100644 --- a/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json @@ -7,7 +7,6 @@ }, "mixins": [ "SimpleRegistryMixin", - "PlayerManagerMixin", "PacketByteBufMixin", "BlockEntityAccessor", "BlockEntityMixin", diff --git a/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/registrysync.accesswidener b/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/registrysync.accesswidener index be5a8fb24..45ae69ced 100644 --- a/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/registrysync.accesswidener +++ b/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/resources/registrysync.accesswidener @@ -1,3 +1,3 @@ -accessWidener v1 named +accessWidener v2 named -accessible method net/minecraft/block/Block (Lnet/minecraft/block/material/Material;)V +transitive-accessible method net/minecraft/block/Block (Lnet/minecraft/block/material/Material;)V diff --git a/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java b/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java deleted file mode 100644 index 45c40826a..000000000 --- a/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 Legacy Fabric - * Copyright (c) 2016 - 2022 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.legacyfabric.fabric.mixin.registry.sync; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.network.ClientConnection; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.integrated.IntegratedServer; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.loader.api.FabricLoader; - -import net.legacyfabric.fabric.api.networking.v1.ServerPlayNetworking; -import net.legacyfabric.fabric.impl.registry.sync.RegistryRemapperAccess; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; - -@Mixin(PlayerManager.class) -public class PlayerManagerMixin { - @Shadow - @Final - private MinecraftServer server; - - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 2), method = "onPlayerConnect") - public void playerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { - if (fabric_shouldSend()) { - player.networkHandler.sendPacket(ServerPlayNetworking.createS2CPacket(RegistryRemapperAccess.PACKET_ID, ServerRegistryRemapper.getInstance().createBuf())); - } - } - - @Unique - private boolean fabric_shouldSend() { - boolean published = false; - - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - published = fabric_isPublished(); - } - - return this.server.isDedicated() || published; - } - - @Environment(EnvType.CLIENT) - @Unique - private boolean fabric_isPublished() { - return ((IntegratedServer) this.server).isPublished(); - } -} diff --git a/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json b/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json index cb9f7aaad..eae009f7d 100644 --- a/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json @@ -7,7 +7,6 @@ }, "mixins": [ "SimpleRegistryMixin", - "PlayerManagerMixin", "BlockMixin", "ItemMixin", "PacketByteBufMixin", diff --git a/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json b/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json index cb9f7aaad..eae009f7d 100644 --- a/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json @@ -7,7 +7,6 @@ }, "mixins": [ "SimpleRegistryMixin", - "PlayerManagerMixin", "BlockMixin", "ItemMixin", "PacketByteBufMixin", diff --git a/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/registrysync.accesswidener b/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/registrysync.accesswidener index be5a8fb24..45ae69ced 100644 --- a/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/registrysync.accesswidener +++ b/legacy-fabric-registry-sync-api-v1/1.8/src/main/resources/registrysync.accesswidener @@ -1,3 +1,3 @@ -accessWidener v1 named +accessWidener v2 named -accessible method net/minecraft/block/Block (Lnet/minecraft/block/material/Material;)V +transitive-accessible method net/minecraft/block/Block (Lnet/minecraft/block/material/Material;)V diff --git a/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java b/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java deleted file mode 100644 index 84ebd46f7..000000000 --- a/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 Legacy Fabric - * Copyright (c) 2016 - 2022 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.legacyfabric.fabric.mixin.registry.sync; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.network.ClientConnection; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.integrated.IntegratedServer; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.loader.api.FabricLoader; - -import net.legacyfabric.fabric.api.networking.v1.ServerPlayNetworking; -import net.legacyfabric.fabric.impl.registry.sync.RegistryRemapperAccess; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; - -@Mixin(PlayerManager.class) -public class PlayerManagerMixin { - @Shadow - @Final - private MinecraftServer server; - - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 2), method = "method_12827") - public void playerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { - if (fabric_shouldSend()) { - player.networkHandler.sendPacket(ServerPlayNetworking.createS2CPacket(RegistryRemapperAccess.PACKET_ID, ServerRegistryRemapper.getInstance().createBuf())); - } - } - - @Unique - private boolean fabric_shouldSend() { - boolean published = false; - - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - published = fabric_isPublished(); - } - - return this.server.isDedicated() || published; - } - - @Environment(EnvType.CLIENT) - @Unique - private boolean fabric_isPublished() { - return ((IntegratedServer) this.server).isPublished(); - } -} diff --git a/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json b/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json index 9e64957e8..fb5274ab6 100644 --- a/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/1.9.4/src/main/resources/legacy-fabric-registry-sync-api-v1.mixins.json @@ -8,7 +8,6 @@ "mixins": [ "SimpleRegistryMixin", "class_2929Mixin", - "PlayerManagerMixin", "BlockMixin", "ItemMixin", "PacketByteBufMixin", diff --git a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MinecraftServerMixin.java b/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MinecraftServerMixin.java index 9069ffca9..c66b93cff 100644 --- a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MinecraftServerMixin.java +++ b/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MinecraftServerMixin.java @@ -18,18 +18,14 @@ package net.legacyfabric.fabric.mixin.registry.sync; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { - @Inject(method = "", at = @At("RETURN")) - private static void remapperInit(CallbackInfo ci) { - ServerRegistryRemapper.getInstance(); - } +// @Inject(method = "", at = @At("RETURN")) +// private static void remapperInit(CallbackInfo ci) { +// ServerRegistryRemapper.getInstance(); +// } } diff --git a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/client/MinecraftClientMixin.java b/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/client/MinecraftClientMixin.java index 3f6281b9e..9aa0aed9a 100644 --- a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/client/MinecraftClientMixin.java +++ b/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/client/MinecraftClientMixin.java @@ -18,22 +18,18 @@ package net.legacyfabric.fabric.mixin.registry.sync.client; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.MinecraftClient; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.legacyfabric.fabric.impl.client.registry.sync.ClientRegistryRemapper; @Environment(EnvType.CLIENT) @Mixin(MinecraftClient.class) public class MinecraftClientMixin { - @Inject(method = "", at = @At("RETURN")) - private static void remapperInit(CallbackInfo ci) { - ClientRegistryRemapper.getInstance(); - } +// @Inject(method = "", at = @At("RETURN")) +// private static void remapperInit(CallbackInfo ci) { +// ClientRegistryRemapper.getInstance(); +// } } diff --git a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/registry/ItemMixin.java b/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/registry/ItemMixin.java deleted file mode 100644 index 70edb7a39..000000000 --- a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/registry/ItemMixin.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2020 - 2024 Legacy Fabric - * Copyright (c) 2016 - 2022 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.legacyfabric.fabric.mixin.registry.sync.registry; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.Item; -import net.minecraft.world.biome.Biome; - -import net.legacyfabric.fabric.impl.registry.RegistryHelperImpl; -import net.legacyfabric.fabric.impl.registry.sync.remappers.ItemRegistryRemapper; - -@Mixin(Item.class) -public class ItemMixin { - @Inject(method = "setup", at = @At("RETURN")) - private static void initRegistryRemapper(CallbackInfo ci) { - RegistryHelperImpl.registerRegistryRemapper(ItemRegistryRemapper::new); - - if (!RegistryHelperImpl.bootstrap) { - try { - Class.forName(Biome.class.getName()); - - Class.forName(BlockEntity.class.getName()); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/legacy-fabric-registry-sync-api-v1/common/src/main/resources/legacy-fabric-registry-sync-api-v1-common.mixins.json b/legacy-fabric-registry-sync-api-v1/common/src/main/resources/legacy-fabric-registry-sync-api-v1-common.mixins.json index baf230136..c3ad0db1e 100644 --- a/legacy-fabric-registry-sync-api-v1/common/src/main/resources/legacy-fabric-registry-sync-api-v1-common.mixins.json +++ b/legacy-fabric-registry-sync-api-v1/common/src/main/resources/legacy-fabric-registry-sync-api-v1-common.mixins.json @@ -7,9 +7,7 @@ }, "mixins": [ "MinecraftServerMixin", - "WorldSaveHandlerMixin", "IdListMixin", - "registry.ItemMixin", "registry.BlockMixin", "registry.BlockEntityMixin", "registry.StatusEffectMixin", diff --git a/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/class_2929Mixin.java b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/OtherIdListMixin.java similarity index 78% rename from legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/class_2929Mixin.java rename to legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/OtherIdListMixin.java index 8ac0cfb7e..d01f6ea1c 100644 --- a/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/class_2929Mixin.java +++ b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/OtherIdListMixin.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package net.legacyfabric.fabric.mixin.registry.sync; +package net.legacyfabric.fabric.mixin.registry.sync.versioned; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -26,7 +26,7 @@ import net.legacyfabric.fabric.api.registry.v2.registry.registrable.IdsHolder; @Mixin(class_2929.class) -public abstract class class_2929Mixin implements IdsHolder { +public abstract class OtherIdListMixin implements IdsHolder { @Shadow @Nullable public abstract T getById(int id); @@ -34,6 +34,12 @@ public abstract class class_2929Mixin implements IdsHolder { @Shadow public abstract void add(T value, int id); + @Shadow + private T[] field_14375; + + @Shadow + public abstract int getId(T value); + @Override public IdsHolder fabric$new() { return (IdsHolder) new class_2929<>(256); @@ -52,4 +58,14 @@ public abstract class class_2929Mixin implements IdsHolder { public void fabric$setValue(T value, int id) { add(value, id); } + + @Override + public int fabric$size() { + return this.field_14375.length; + } + + @Override + public int fabric$getId(T value) { + return getId(value); + } } diff --git a/legacy-fabric-registry-sync-api-v1/1.10.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java similarity index 86% rename from legacy-fabric-registry-sync-api-v1/1.10.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java rename to legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java index 84ebd46f7..6aa50b40f 100644 --- a/legacy-fabric-registry-sync-api-v1/1.10.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java +++ b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package net.legacyfabric.fabric.mixin.registry.sync; +package net.legacyfabric.fabric.mixin.registry.sync.versioned; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -36,8 +36,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.legacyfabric.fabric.api.networking.v1.ServerPlayNetworking; -import net.legacyfabric.fabric.impl.registry.sync.RegistryRemapperAccess; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; +import net.legacyfabric.fabric.impl.registry.RegistryHelperImplementation; @Mixin(PlayerManager.class) public class PlayerManagerMixin { @@ -48,7 +47,7 @@ public class PlayerManagerMixin { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 2), method = "method_12827") public void playerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { if (fabric_shouldSend()) { - player.networkHandler.sendPacket(ServerPlayNetworking.createS2CPacket(RegistryRemapperAccess.PACKET_ID, ServerRegistryRemapper.getInstance().createBuf())); + ServerPlayNetworking.send(player, RegistryHelperImplementation.PACKET_ID, RegistryHelperImplementation.createBuf()); } } diff --git a/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixin.java b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixin.java index b3eb33d2a..5423f2924 100644 --- a/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixin.java +++ b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixin.java @@ -19,11 +19,16 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import net.minecraft.class_2929; import net.minecraft.util.registry.SimpleRegistry; +import net.legacyfabric.fabric.api.event.Event; +import net.legacyfabric.fabric.api.event.EventFactory; +import net.legacyfabric.fabric.api.registry.v2.event.RegistryRemapCallback; import net.legacyfabric.fabric.api.registry.v2.registry.holder.SyncedRegistry; import net.legacyfabric.fabric.api.registry.v2.registry.registrable.IdsHolder; import net.legacyfabric.fabric.api.registry.v2.registry.registrable.SyncedRegistrable; @@ -36,6 +41,7 @@ public abstract class SimpleRegistryMixin implements SyncedRegistry, Sy public abstract void add(int id, K identifier, V object); // 1.9+ + @Mutable @Shadow @Final protected class_2929 field_13718; @@ -66,7 +72,7 @@ public abstract class SimpleRegistryMixin implements SyncedRegistry, Sy @Override public Identifier fabric$getId(V value) { - return new Identifier(getIdentifier(this.fabric$toKeyType(value))); + return new Identifier(getIdentifier(value)); } @Override @@ -78,4 +84,27 @@ public abstract class SimpleRegistryMixin implements SyncedRegistry, Sy public V fabric$getValue(int rawId) { return (V) getByRawId(rawId); } + + @Override + public void fabric$updateRegistry(IdsHolder ids) { + this.field_13718 = (class_2929) ids; + } + + @Unique + private Event> fabric_remapCallbackEvent; + + @Override + public Event> fabric$getRegistryRemapCallback() { + if (this.fabric_remapCallbackEvent == null) { + this.fabric_remapCallbackEvent = EventFactory.createArrayBacked(RegistryRemapCallback.class, + (callbacks) -> (changedMap) -> { + for (RegistryRemapCallback callback : callbacks) { + callback.callback(changedMap); + } + } + ); + } + + return this.fabric_remapCallbackEvent; + } } diff --git a/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json index 008e6ed69..f2e024e25 100644 --- a/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json +++ b/legacy-fabric-registry-sync-api-v2/1.12.2/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json @@ -6,7 +6,8 @@ "defaultRequire": 1 }, "mixins": [ - "class_2929Mixin", + "versioned.OtherIdListMixin", + "versioned.PlayerManagerMixin", "versioned.SimpleRegistryMixin" ], "client": [ diff --git a/legacy-fabric-registry-sync-api-v2/1.7.10/build.gradle b/legacy-fabric-registry-sync-api-v2/1.7.10/build.gradle new file mode 100644 index 000000000..e69de29bb diff --git a/legacy-fabric-registry-sync-api-v2/1.7.10/gradle.properties b/legacy-fabric-registry-sync-api-v2/1.7.10/gradle.properties new file mode 100644 index 000000000..af031afbf --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.7.10/gradle.properties @@ -0,0 +1,2 @@ +minVersionIncluded=1.7.10 +maxVersionIncluded=1.7.10 diff --git a/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java similarity index 87% rename from legacy-fabric-registry-sync-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java rename to legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java index f26b66ee0..67599b93c 100644 --- a/legacy-fabric-registry-sync-api-v1/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java +++ b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package net.legacyfabric.fabric.mixin.registry.sync; +package net.legacyfabric.fabric.mixin.registry.sync.versioned; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -36,8 +36,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.legacyfabric.fabric.api.networking.v1.ServerPlayNetworking; -import net.legacyfabric.fabric.impl.registry.sync.RegistryRemapperAccess; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; +import net.legacyfabric.fabric.impl.registry.RegistryHelperImplementation; @Mixin(PlayerManager.class) public class PlayerManagerMixin { @@ -48,7 +47,7 @@ public class PlayerManagerMixin { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 2), method = "onPlayerConnect") public void playerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { if (fabric_shouldSend()) { - ServerPlayNetworking.send(player, RegistryRemapperAccess.PACKET_ID, ServerRegistryRemapper.getInstance().createBuf()); + ServerPlayNetworking.send(player, RegistryHelperImplementation.PACKET_ID, RegistryHelperImplementation.createBuf()); } } diff --git a/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixinV2.java b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixinV2.java new file mode 100644 index 000000000..fe060410e --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixinV2.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.mixin.registry.sync.versioned; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import net.minecraft.util.collection.IdList; +import net.minecraft.util.registry.SimpleRegistry; + +import net.legacyfabric.fabric.api.event.Event; +import net.legacyfabric.fabric.api.event.EventFactory; +import net.legacyfabric.fabric.api.registry.v2.event.RegistryRemapCallback; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.SyncedRegistry; +import net.legacyfabric.fabric.api.registry.v2.registry.registrable.IdsHolder; +import net.legacyfabric.fabric.api.registry.v2.registry.registrable.SyncedRegistrable; +import net.legacyfabric.fabric.api.util.Identifier; + +@Mixin(SimpleRegistry.class) +public abstract class SimpleRegistryMixinV2 implements SyncedRegistry, SyncedRegistrable { + // 1.8+ + @Shadow + public abstract void add(int id, String identifier, Object object); + + // 1.9+ + @Shadow + public abstract int getRawId(Object object); + + // 1.7+ + @Shadow + public abstract Object getByRawId(int index); + + @Mutable + @Shadow + @Final + protected IdList ids; + + @Shadow + public abstract String getId(Object par1); + + @Override + public void fabric$register(int rawId, Identifier identifier, V value) { + fabric$getBeforeAddedCallback().invoker().onEntryAdding(rawId, identifier, value); + add(rawId, fabric$toKeyType(identifier), value); + fabric$getEntryAddedCallback().invoker().onEntryAdded(rawId, identifier, value); + } + + @Override + public IdsHolder fabric$getIdsHolder() { + return (IdsHolder) ids; + } + + @Override + public Identifier fabric$getId(V value) { + return new Identifier(getId(value)); + } + + @Override + public int fabric$getRawId(V value) { + return getRawId(value); + } + + @Override + public V fabric$getValue(int rawId) { + return (V) getByRawId(rawId); + } + + @Override + public void fabric$updateRegistry(IdsHolder ids) { + this.ids = (IdList) ids; + } + + @Unique + private Event> fabric_remapCallbackEvent; + + @Override + public Event> fabric$getRegistryRemapCallback() { + if (this.fabric_remapCallbackEvent == null) { + this.fabric_remapCallbackEvent = EventFactory.createArrayBacked(RegistryRemapCallback.class, + (callbacks) -> (changedMap) -> { + for (RegistryRemapCallback callback : callbacks) { + callback.callback(changedMap); + } + } + ); + } + + return this.fabric_remapCallbackEvent; + } +} diff --git a/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/resources/fabric.mod.json b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..1f20467ce --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/resources/fabric.mod.json @@ -0,0 +1,42 @@ +{ + "schemaVersion": 1, + "id": "legacy-fabric-registry-sync-api-v2", + "name": "Legacy Fabric Registry Sync API (V2)", + "version": "${version}", + "environment": "*", + "license": "Apache-2.0", + "icon": "assets/legacy-fabric/icon.png", + "contact": { + "homepage": "https://legacyfabric.net/", + "irc": "irc://irc.esper.net:6667/legacyfabric", + "issues": "https://github.com/Legacy-Fabric/fabric/issues", + "sources": "https://github.com/Legacy-Fabric/fabric" + }, + "authors": [ + "Legacy-Fabric" + ], + "depends": { + "fabricloader": ">=0.4.0", + "minecraft": "${minecraft_version}" + }, + "description": "Registry hooks", + "entrypoints": { + "preLaunch": [ + ] + }, + "mixins": [ + "legacy-fabric-registry-sync-api-v2.mixins.json" + ], + "custom": { + "modmenu": { + "badges": [ "library" ], + "parent": { + "id": "legacy-fabric-api", + "name": "Legacy Fabric API", + "badges": [ "library" ], + "description": "Core API module providing key hooks and inter-compatibility features for Minecraft 1.7.10-1.12.2.", + "icon": "assets/legacy-fabric/icon.png" + } + } + } +} diff --git a/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json new file mode 100644 index 000000000..9298f31f9 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "net.legacyfabric.fabric.mixin.registry.sync", + "compatibilityLevel": "JAVA_8", + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + "versioned.PlayerManagerMixin", + "versioned.SimpleRegistryMixinV2" + ], + "client": [ + ] +} diff --git a/legacy-fabric-registry-sync-api-v2/1.8.9/build.gradle b/legacy-fabric-registry-sync-api-v2/1.8.9/build.gradle new file mode 100644 index 000000000..e69de29bb diff --git a/legacy-fabric-registry-sync-api-v2/1.8.9/gradle.properties b/legacy-fabric-registry-sync-api-v2/1.8.9/gradle.properties new file mode 100644 index 000000000..9056fbd37 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.8.9/gradle.properties @@ -0,0 +1,2 @@ +minVersionIncluded=1.8 +maxVersionIncluded=1.8.9 diff --git a/legacy-fabric-registry-sync-api-v1/1.8/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java similarity index 86% rename from legacy-fabric-registry-sync-api-v1/1.8/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java rename to legacy-fabric-registry-sync-api-v2/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java index 45c40826a..67599b93c 100644 --- a/legacy-fabric-registry-sync-api-v1/1.8/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/PlayerManagerMixin.java +++ b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/PlayerManagerMixin.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package net.legacyfabric.fabric.mixin.registry.sync; +package net.legacyfabric.fabric.mixin.registry.sync.versioned; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -36,8 +36,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.legacyfabric.fabric.api.networking.v1.ServerPlayNetworking; -import net.legacyfabric.fabric.impl.registry.sync.RegistryRemapperAccess; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; +import net.legacyfabric.fabric.impl.registry.RegistryHelperImplementation; @Mixin(PlayerManager.class) public class PlayerManagerMixin { @@ -48,7 +47,7 @@ public class PlayerManagerMixin { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/Packet;)V", ordinal = 2), method = "onPlayerConnect") public void playerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { if (fabric_shouldSend()) { - player.networkHandler.sendPacket(ServerPlayNetworking.createS2CPacket(RegistryRemapperAccess.PACKET_ID, ServerRegistryRemapper.getInstance().createBuf())); + ServerPlayNetworking.send(player, RegistryHelperImplementation.PACKET_ID, RegistryHelperImplementation.createBuf()); } } diff --git a/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixinV2.java b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixinV2.java new file mode 100644 index 000000000..0cffc2b81 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/SimpleRegistryMixinV2.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.mixin.registry.sync.versioned; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import net.minecraft.util.collection.IdList; +import net.minecraft.util.registry.SimpleRegistry; + +import net.legacyfabric.fabric.api.event.Event; +import net.legacyfabric.fabric.api.event.EventFactory; +import net.legacyfabric.fabric.api.registry.v2.event.RegistryRemapCallback; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.SyncedRegistry; +import net.legacyfabric.fabric.api.registry.v2.registry.registrable.IdsHolder; +import net.legacyfabric.fabric.api.registry.v2.registry.registrable.SyncedRegistrable; +import net.legacyfabric.fabric.api.util.Identifier; + +@Mixin(SimpleRegistry.class) +public abstract class SimpleRegistryMixinV2 implements SyncedRegistry, SyncedRegistrable { + // 1.8+ + @Shadow + public abstract void add(int id, K identifier, V object); + + // 1.8+ + @Shadow + public abstract K getIdentifier(Object par1); + + // 1.9+ + @Shadow + public abstract int getRawId(Object object); + + // 1.7+ + @Shadow + public abstract Object getByRawId(int index); + + @Mutable + @Shadow + @Final + protected IdList ids; + + @Override + public void fabric$register(int rawId, Identifier identifier, V value) { + fabric$getBeforeAddedCallback().invoker().onEntryAdding(rawId, identifier, value); + add(rawId, fabric$toKeyType(identifier), value); + fabric$getEntryAddedCallback().invoker().onEntryAdded(rawId, identifier, value); + } + + @Override + public IdsHolder fabric$getIdsHolder() { + return (IdsHolder) ids; + } + + @Override + public Identifier fabric$getId(V value) { + return new Identifier(getIdentifier(value)); + } + + @Override + public int fabric$getRawId(V value) { + return getRawId(value); + } + + @Override + public V fabric$getValue(int rawId) { + return (V) getByRawId(rawId); + } + + @Override + public void fabric$updateRegistry(IdsHolder ids) { + this.ids = (IdList) ids; + } + + @Unique + private Event> fabric_remapCallbackEvent; + + @Override + public Event> fabric$getRegistryRemapCallback() { + if (this.fabric_remapCallbackEvent == null) { + this.fabric_remapCallbackEvent = EventFactory.createArrayBacked(RegistryRemapCallback.class, + (callbacks) -> (changedMap) -> { + for (RegistryRemapCallback callback : callbacks) { + callback.callback(changedMap); + } + } + ); + } + + return this.fabric_remapCallbackEvent; + } +} diff --git a/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/resources/fabric.mod.json b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..1f20467ce --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/resources/fabric.mod.json @@ -0,0 +1,42 @@ +{ + "schemaVersion": 1, + "id": "legacy-fabric-registry-sync-api-v2", + "name": "Legacy Fabric Registry Sync API (V2)", + "version": "${version}", + "environment": "*", + "license": "Apache-2.0", + "icon": "assets/legacy-fabric/icon.png", + "contact": { + "homepage": "https://legacyfabric.net/", + "irc": "irc://irc.esper.net:6667/legacyfabric", + "issues": "https://github.com/Legacy-Fabric/fabric/issues", + "sources": "https://github.com/Legacy-Fabric/fabric" + }, + "authors": [ + "Legacy-Fabric" + ], + "depends": { + "fabricloader": ">=0.4.0", + "minecraft": "${minecraft_version}" + }, + "description": "Registry hooks", + "entrypoints": { + "preLaunch": [ + ] + }, + "mixins": [ + "legacy-fabric-registry-sync-api-v2.mixins.json" + ], + "custom": { + "modmenu": { + "badges": [ "library" ], + "parent": { + "id": "legacy-fabric-api", + "name": "Legacy Fabric API", + "badges": [ "library" ], + "description": "Core API module providing key hooks and inter-compatibility features for Minecraft 1.7.10-1.12.2.", + "icon": "assets/legacy-fabric/icon.png" + } + } + } +} diff --git a/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json new file mode 100644 index 000000000..9298f31f9 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/1.8.9/src/main/resources/legacy-fabric-registry-sync-api-v2.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "net.legacyfabric.fabric.mixin.registry.sync", + "compatibilityLevel": "JAVA_8", + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + "versioned.PlayerManagerMixin", + "versioned.SimpleRegistryMixinV2" + ], + "client": [ + ] +} diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/event/RegistryRemapCallback.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/event/RegistryRemapCallback.java new file mode 100644 index 000000000..2c7520cb8 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/event/RegistryRemapCallback.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.api.registry.v2.event; + +import java.util.Map; + +import net.legacyfabric.fabric.api.event.Event; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.Registry; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.RegistryEntry; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.SyncedRegistry; +import net.legacyfabric.fabric.api.util.Identifier; +import net.legacyfabric.fabric.impl.registry.RegistryHelperImplementation; + +@FunctionalInterface +public interface RegistryRemapCallback { + void callback(Map> changedIdsMap); + + static Event> event(Identifier registryId) { + return event(RegistryHelperImplementation.getRegistry(registryId)); + } + + static Event> event(Registry registry) { + if (!(registry instanceof SyncedRegistry)) throw new IllegalArgumentException("Provided registry is not remappable!"); + + return ((SyncedRegistry) registry).fabric$getRegistryRemapCallback(); + } +} diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/RegistryEntry.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/RegistryEntry.java new file mode 100644 index 000000000..a2d123f28 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/RegistryEntry.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.api.registry.v2.registry.holder; + +import net.legacyfabric.fabric.api.util.Identifier; + +public interface RegistryEntry { + int getId(); + Identifier getIdentifier(); + T getValue(); +} diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/SyncedRegistry.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/SyncedRegistry.java index bfb8ec27a..7665f7636 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/SyncedRegistry.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/holder/SyncedRegistry.java @@ -17,6 +17,8 @@ package net.legacyfabric.fabric.api.registry.v2.registry.holder; +import net.legacyfabric.fabric.api.event.Event; +import net.legacyfabric.fabric.api.registry.v2.event.RegistryRemapCallback; import net.legacyfabric.fabric.api.util.Identifier; public interface SyncedRegistry extends Registry { @@ -31,4 +33,6 @@ public interface SyncedRegistry extends Registry { T value = fabric$getValue(rawId); return fabric$getId(value); } + + Event> fabric$getRegistryRemapCallback(); } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/IdsHolder.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/IdsHolder.java index 1afcb2cd3..6abd3ae1b 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/IdsHolder.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/IdsHolder.java @@ -23,4 +23,9 @@ public interface IdsHolder extends Iterable { int fabric$nextId(); void fabric$setValue(T value, int id); + int fabric$size(); + int fabric$getId(T value); + default boolean fabric$contains(T value) { + return fabric$getId(value) != -1; + } } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/SyncedRegistrable.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/SyncedRegistrable.java index bcbcfeed7..bb8d0eeb1 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/SyncedRegistrable.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/api/registry/v2/registry/registrable/SyncedRegistrable.java @@ -23,4 +23,6 @@ public interface SyncedRegistrable extends Registrable { default int fabric$nextId() { return fabric$getIdsHolder().fabric$nextId(); } + + void fabric$updateRegistry(IdsHolder ids); } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/ClientRemapInitializer.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/ClientRemapInitializer.java new file mode 100644 index 000000000..45af51ed1 --- /dev/null +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/ClientRemapInitializer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 - 2024 Legacy Fabric + * Copyright (c) 2016 - 2022 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.legacyfabric.fabric.impl.registry; + +import java.io.IOException; +import java.io.UncheckedIOException; + +import net.minecraft.nbt.NbtCompound; + +import net.fabricmc.api.ClientModInitializer; + +import net.legacyfabric.fabric.api.client.networking.v1.ClientPlayNetworking; + +public class ClientRemapInitializer implements ClientModInitializer { + @Override + public void onInitializeClient() { + ClientPlayNetworking.registerGlobalReceiver(RegistryHelperImplementation.PACKET_ID, (client, handler, buf, responseSender) -> { + NbtCompound nbt; + + try { + nbt = buf.readNbtCompound(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + + client.submit(() -> RegistryHelperImplementation.readAndRemap(nbt)); + }); + } +} diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryHelperImplementation.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryHelperImplementation.java index 61f9f5032..cfb07a6ff 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryHelperImplementation.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryHelperImplementation.java @@ -21,20 +21,29 @@ import java.util.Map; import java.util.function.Function; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.PacketByteBuf; + import net.legacyfabric.fabric.api.event.Event; import net.legacyfabric.fabric.api.event.EventFactory; +import net.legacyfabric.fabric.api.networking.v1.PacketByteBufs; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; import net.legacyfabric.fabric.api.registry.v2.event.RegistryInitializedEvent; +import net.legacyfabric.fabric.api.registry.v2.registry.SyncedRegistry; import net.legacyfabric.fabric.api.registry.v2.registry.holder.Registry; import net.legacyfabric.fabric.api.registry.v2.registry.registrable.Registrable; import net.legacyfabric.fabric.api.registry.v2.registry.registrable.SyncedRegistrable; import net.legacyfabric.fabric.api.util.Identifier; import net.legacyfabric.fabric.api.util.VersionUtils; +import net.legacyfabric.fabric.impl.networking.PacketByteBufExtension; import net.legacyfabric.fabric.impl.registry.accessor.RegistryIdSetter; public class RegistryHelperImplementation { + public static final Identifier PACKET_ID = new Identifier("legacy-fabric-api:registry_remap"); public static final boolean hasFlatteningBegun = VersionUtils.matches(">=1.8 <=1.12.2"); public static final Map> INITIALIZATION_EVENTS = new HashMap<>(); private static final Map> REGISTRIES = new HashMap<>(); + private static final Map> REMAPPERS = new HashMap<>(); public static Event getInitializationEvent(Identifier registryId) { Event event; @@ -67,9 +76,16 @@ public static void registerRegistry(Identifier identifier, Registry holder) { REGISTRIES.put(identifier, holder); if (holder instanceof RegistryIdSetter) ((RegistryIdSetter) holder).fabric$setId(identifier); + + if (holder instanceof SyncedRegistry) { + REMAPPERS.put(identifier, new RegistryRemapper<>((SyncedRegistry) holder)); + } + + getInitializationEvent(identifier).invoker().initialized(holder); } public static void register(Registry registry, Identifier identifier, T value) { + if (registry == null) throw new IllegalArgumentException("Can't register to a null registry!"); if (!(registry instanceof Registrable)) throw new IllegalArgumentException("Can't register object to non registrable registry " + registry.fabric$getId()); Registrable registrable = (Registrable) registry; @@ -83,6 +99,7 @@ public static void register(Registry registry, Identifier identifier, T v } public static T register(Registry registry, Identifier identifier, Function valueConstructor) { + if (registry == null) throw new IllegalArgumentException("Can't register to a null registry!"); if (!(registry instanceof SyncedRegistrable)) throw new IllegalArgumentException("Can't register object to non registrable registry " + registry.fabric$getId()); SyncedRegistrable registrable = (SyncedRegistrable) registry; @@ -94,4 +111,49 @@ public static T register(Registry registry, Identifier identifier, Functi return value; } + + public static void remapRegistries() { + for (RegistryRemapper remapper : REMAPPERS.values()) { + remapper.remap(); + } + } + + public static void readAndRemap(NbtCompound compound) { + for (String key : compound.getKeys()) { + String registryKey = key; + + if (BACKWARD_COMPATIBILITY.containsKey(key)) { + registryKey = BACKWARD_COMPATIBILITY.get(key); + } + + Identifier identifier = new Identifier(registryKey); + RegistryRemapper remapper = REMAPPERS.get(identifier); + + if (remapper != null) { + remapper.readNbt(compound.getCompound(key)); + } + } + + remapRegistries(); + } + + private static final Map BACKWARD_COMPATIBILITY = new HashMap<>(); + static { + BACKWARD_COMPATIBILITY.put("Items", RegistryIds.ITEMS.toString()); + } + + public static NbtCompound toNbt() { + NbtCompound compound = new NbtCompound(); + + for (Map.Entry> entry : REMAPPERS.entrySet()) { + compound.put(entry.getKey().toString(), entry.getValue().toNbt()); + } + + return compound; + } + + public static PacketByteBuf createBuf() { + PacketByteBuf buf = PacketByteBufs.create(); + return ((PacketByteBufExtension) buf).writeCompound(toNbt()); + } } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryRemapper.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryRemapper.java index 063d26e9e..e5e03c1a5 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryRemapper.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/impl/registry/RegistryRemapper.java @@ -17,6 +17,9 @@ package net.legacyfabric.fabric.impl.registry; +import java.util.HashMap; +import java.util.Map; +import java.util.function.IntSupplier; import java.util.stream.Collectors; import com.google.common.collect.BiMap; @@ -26,6 +29,7 @@ import net.legacyfabric.fabric.api.logger.v1.Logger; import net.legacyfabric.fabric.api.registry.v2.registry.SyncedRegistry; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.RegistryEntry; import net.legacyfabric.fabric.api.registry.v2.registry.registrable.IdsHolder; import net.legacyfabric.fabric.api.util.Identifier; import net.legacyfabric.fabric.impl.logger.LoggerImpl; @@ -86,6 +90,16 @@ public void remap() { this.dump(); IdsHolder dumpIds = getDumpIds(); + + IntSupplier previousSize = normalizeEntryList(dumpIds); + + invokeListeners(dumpIds); + + updateRegistry(dumpIds); + + this.entryDump.clear(); + this.dump(); + LOGGER.info("Remapped " + previousSize.getAsInt() + " entries"); } private IdsHolder getDumpIds() { @@ -101,5 +115,88 @@ private IdsHolder getDumpIds() { ids.fabric$setValue(value, rawId); } }); + + return ids; + } + + private IntSupplier normalizeEntryList(IdsHolder ids) { + IntSupplier currentSize = ids::fabric$size; + IntSupplier previousSize = () -> this.registry.fabric$getIdsHolder().fabric$size(); + + if (currentSize.getAsInt() > previousSize.getAsInt()) { + if (this.missingMap.isEmpty()) { + throw new IllegalStateException("Registry size increased from " + previousSize.getAsInt() + " to " + currentSize.getAsInt() + " after remapping! This is not possible!"); + } + } else if (currentSize.getAsInt() < previousSize.getAsInt()) { + addNewEntries(ids, currentSize, previousSize); + } + + if (currentSize.getAsInt() != previousSize.getAsInt() && this.missingMap.isEmpty()) { + throw new IllegalStateException("An error occured during remapping"); + } + + return previousSize; + } + + private void addNewEntries(IdsHolder newList, IntSupplier currentSize, IntSupplier previousSize) { + LOGGER.info("Adding " + (previousSize.getAsInt() - currentSize.getAsInt()) + " missing entries to registry"); + + this.registry.stream() + .filter(obj -> !newList.fabric$contains(obj)) + .collect(Collectors.toList()) + .forEach(missingEntry -> { + int newId = newList.fabric$nextId(); + + newList.fabric$setValue(missingEntry, newId); + + LOGGER.info("Adding %s %s with numerical id %d to registry", this.registry.fabric$getId(), this.registry.fabric$getId(missingEntry), newId); + }); + } + + private void invokeListeners(IdsHolder ids) { + Map> changed = new HashMap<>(); + + for (T value : ids) { + int oldId = this.registry.fabric$getIdsHolder().fabric$getId(value); + int newId = ids.fabric$getId(value); + + if (oldId != -1 && oldId != newId) { + LOGGER.info("Remapped %s %s from id %d to id %d", this.registry.fabric$getId(), this.registry.fabric$getId(value), oldId, newId); + changed.put(oldId, new RegistryEntryImpl<>(newId, this.registry.fabric$getId(value), value)); + } + } + + this.registry.fabric$getRegistryRemapCallback().invoker().callback(changed); + } + + private void updateRegistry(IdsHolder ids) { + this.registry.fabric$updateRegistry(ids); + } + + private static class RegistryEntryImpl implements RegistryEntry { + private final int id; + private final Identifier identifier; + private final T value; + + RegistryEntryImpl(int id, Identifier identifier, T value) { + this.id = id; + this.identifier = identifier; + this.value = value; + } + + @Override + public int getId() { + return 0; + } + + @Override + public Identifier getIdentifier() { + return null; + } + + @Override + public T getValue() { + return null; + } } } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/IdListMixinV2.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/IdListMixinV2.java index 979fee942..77720f077 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/IdListMixinV2.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/IdListMixinV2.java @@ -17,6 +17,9 @@ package net.legacyfabric.fabric.mixin.registry.sync; +import java.util.IdentityHashMap; + +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -32,6 +35,13 @@ public abstract class IdListMixinV2 implements IdsHolder { @Shadow public abstract void set(Object value, int index); + @Shadow + @Final + private IdentityHashMap idMap; + + @Shadow + public abstract int getId(T value); + @Override public IdsHolder fabric$new() { return (IdsHolder) new IdList<>(); @@ -50,4 +60,14 @@ public abstract class IdListMixinV2 implements IdsHolder { public void fabric$setValue(T value, int id) { set(value, id); } + + @Override + public int fabric$size() { + return idMap.size(); + } + + @Override + public int fabric$getId(T value) { + return getId(value); + } } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MutableRegistryMixin.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MutableRegistryMixinV2.java similarity index 75% rename from legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MutableRegistryMixin.java rename to legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MutableRegistryMixinV2.java index 75c4e0697..d904555cc 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MutableRegistryMixin.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/MutableRegistryMixinV2.java @@ -30,14 +30,13 @@ import net.legacyfabric.fabric.api.event.EventFactory; import net.legacyfabric.fabric.api.registry.v2.event.RegistryBeforeAddCallback; import net.legacyfabric.fabric.api.registry.v2.event.RegistryEntryAddedCallback; -import net.legacyfabric.fabric.api.registry.v2.registry.holder.Registry; import net.legacyfabric.fabric.api.registry.v2.registry.registrable.Registrable; import net.legacyfabric.fabric.api.util.Identifier; import net.legacyfabric.fabric.impl.registry.RegistryHelperImplementation; import net.legacyfabric.fabric.impl.registry.accessor.RegistryIdSetter; @Mixin(MutableRegistry.class) -public abstract class MutableRegistryMixin implements Registry, RegistryIdSetter, Registrable { +public abstract class MutableRegistryMixinV2 implements net.legacyfabric.fabric.api.registry.v2.registry.holder.Registry, RegistryIdSetter, Registrable { @Shadow public abstract void put(Object key, Object value); @@ -48,33 +47,41 @@ public abstract class MutableRegistryMixin implements Registry, Registr @Final protected Map map; @Unique - private final Event> fabric_addObjectEvent = EventFactory.createArrayBacked(RegistryEntryAddedCallback.class, - (callbacks) -> (rawId, id, object) -> { - for (RegistryEntryAddedCallback callback : callbacks) { - callback.onEntryAdded(rawId, id, object); - } - } - ); + private Event> fabric_addObjectEvent; @Unique - private final Event> fabric_beforeAddObjectEvent = EventFactory.createArrayBacked(RegistryBeforeAddCallback.class, - (callbacks) -> (rawId, id, object) -> { - for (RegistryBeforeAddCallback callback : callbacks) { - callback.onEntryAdding(rawId, id, object); - } - } - ); + private Event> fabric_beforeAddObjectEvent; @Unique private Identifier fabric_id; @Override public Event> fabric$getEntryAddedCallback() { + if (this.fabric_addObjectEvent == null) { + fabric_addObjectEvent = EventFactory.createArrayBacked(RegistryEntryAddedCallback.class, + (callbacks) -> (rawId, id, object) -> { + for (RegistryEntryAddedCallback callback : callbacks) { + callback.onEntryAdded(rawId, id, object); + } + } + ); + } + return this.fabric_addObjectEvent; } @Override public Event> fabric$getBeforeAddedCallback() { + if (this.fabric_beforeAddObjectEvent == null) { + fabric_beforeAddObjectEvent = EventFactory.createArrayBacked(RegistryBeforeAddCallback.class, + (callbacks) -> (rawId, id, object) -> { + for (RegistryBeforeAddCallback callback : callbacks) { + callback.onEntryAdding(rawId, id, object); + } + } + ); + } + return this.fabric_beforeAddObjectEvent; } diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/SimpleRegistryMixinV2.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/SimpleRegistryMixinV2.java index be5d67321..c857f6477 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/SimpleRegistryMixinV2.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/SimpleRegistryMixinV2.java @@ -23,7 +23,6 @@ import net.legacyfabric.fabric.api.registry.v2.registry.SyncedRegistry; - @Mixin(SimpleRegistry.class) public abstract class SimpleRegistryMixinV2 implements SyncedRegistry { } diff --git a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/WorldSaveHandlerMixin.java b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/WorldSaveHandlerMixin.java similarity index 95% rename from legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/WorldSaveHandlerMixin.java rename to legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/WorldSaveHandlerMixin.java index 1c712a1d9..a08240335 100644 --- a/legacy-fabric-registry-sync-api-v1/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/WorldSaveHandlerMixin.java +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/WorldSaveHandlerMixin.java @@ -39,7 +39,7 @@ import net.legacyfabric.fabric.api.logger.v1.Logger; import net.legacyfabric.fabric.impl.logger.LoggerImpl; -import net.legacyfabric.fabric.impl.registry.sync.ServerRegistryRemapper; +import net.legacyfabric.fabric.impl.registry.RegistryHelperImplementation; @Mixin(WorldSaveHandler.class) public class WorldSaveHandlerMixin { @@ -63,7 +63,7 @@ private boolean fabric_readIdMapFile(File file) throws IOException { } if (nbt != null) { - ServerRegistryRemapper.getInstance().readAndRemap(nbt); + RegistryHelperImplementation.readAndRemap(nbt); return true; } } @@ -78,7 +78,7 @@ private File fabric_getWorldIdMapFile(int i) { @Unique private void fabric_saveRegistryData() { - NbtCompound newIdMap = ServerRegistryRemapper.getInstance().toNbtCompound(); + NbtCompound newIdMap = RegistryHelperImplementation.toNbt(); if (!newIdMap.equals(this.fabric_lastSavedIdMap)) { for (int i = FABRIC_ID_REGISTRY_BACKUPS - 1; i >= 0; i--) { diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/resources/fabric.mod.json b/legacy-fabric-registry-sync-api-v2/common/src/main/resources/fabric.mod.json index f5406e502..027f6bc9f 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/resources/fabric.mod.json +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/resources/fabric.mod.json @@ -22,6 +22,7 @@ "description": "Registry hooks", "entrypoints": { "client": [ + "net.legacyfabric.fabric.impl.registry.ClientRemapInitializer" ] }, "mixins": [ @@ -29,10 +30,9 @@ ], "custom": { "loom:injected_interfaces": { - "net/minecraft/class_1367": ["net/legacyfabric/fabric/api/registry/v2/RegistryHolder"], - "net/minecraft/class_1943": ["net/legacyfabric/fabric/api/registry/v2/SyncedRegistryHolder"], - "net/minecraft/class_1942": ["net/legacyfabric/fabric/api/registry/v2/registrable/IdsHolder"], - "net/minecraft/class_2929": ["net/legacyfabric/fabric/api/registry/v2/registrable/IdsHolder"] + "net/minecraft/class_1367": ["net/legacyfabric/fabric/api/registry/v2/registry/holder/Registry"], + "net/minecraft/class_1943": ["net/legacyfabric/fabric/api/registry/v2/registry/holder/SyncedRegistry"], + "net/minecraft/class_1942": ["net/legacyfabric/fabric/api/registry/v2/registry/registrable/IdsHolder"] }, "modmenu": { "badges": [ "library" ], diff --git a/legacy-fabric-registry-sync-api-v2/common/src/main/resources/legacy-fabric-registry-sync-api-v2-common.mixins.json b/legacy-fabric-registry-sync-api-v2/common/src/main/resources/legacy-fabric-registry-sync-api-v2-common.mixins.json index 7062c3539..f0cedd1d4 100644 --- a/legacy-fabric-registry-sync-api-v2/common/src/main/resources/legacy-fabric-registry-sync-api-v2-common.mixins.json +++ b/legacy-fabric-registry-sync-api-v2/common/src/main/resources/legacy-fabric-registry-sync-api-v2-common.mixins.json @@ -7,8 +7,9 @@ }, "mixins": [ "IdListMixinV2", - "MutableRegistryMixin", - "SimpleRegistryMixinV2" + "MutableRegistryMixinV2", + "SimpleRegistryMixinV2", + "WorldSaveHandlerMixin" ], "client": [ ]