diff --git a/gradle.properties b/gradle.properties index 8263d20de..b666e30ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,5 +22,6 @@ legacy-fabric-registry-sync-api-v1.version = 2.2.0 legacy-fabric-registry-sync-api-v2.version = 1.0.0 legacy-fabric-item-api-v1.version = 1.0.0 legacy-fabric-block-api-v1.version = 1.0.0 +legacy-fabric-block-entity-api-v1.version = 1.0.0 legacy-fabric-rendering-api-v1.version = 1.0.0 legacy-fabric-resource-loader-v1.version = 2.2.2 diff --git a/legacy-fabric-block-entity-api-v1/1.10.2/build.gradle b/legacy-fabric-block-entity-api-v1/1.10.2/build.gradle new file mode 100644 index 000000000..e69de29bb diff --git a/legacy-fabric-block-entity-api-v1/1.10.2/gradle.properties b/legacy-fabric-block-entity-api-v1/1.10.2/gradle.properties new file mode 100644 index 000000000..649cef215 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.10.2/gradle.properties @@ -0,0 +1,2 @@ +minVersionIncluded=1.10.2 +maxVersionIncluded=1.10.2 diff --git a/legacy-fabric-block-entity-api-v1/1.10.2/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java b/legacy-fabric-block-entity-api-v1/1.10.2/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java new file mode 100644 index 000000000..ca9977a78 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.10.2/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java @@ -0,0 +1,76 @@ +/* + * 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.block.entity; + +import java.util.Map; + +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.block.entity.BlockEntity; + +import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.FabricRegistry; +import net.legacyfabric.fabric.api.util.Identifier; +import net.legacyfabric.fabric.impl.block.entity.BlockEntityUtils; +import net.legacyfabric.fabric.impl.registry.wrapper.MapFabricRegistryWrapper; + +@Mixin(BlockEntity.class) +public class BlockEntityMixin { + @Shadow + @Final + private static Map> stringClassMap; + @Shadow + @Final + private static Map, String> classStringMap; + @Unique + private static FabricRegistry> BLOCK_ENTITY_TYPE_REGISTRY; + + @Inject(method = "", at = @At("RETURN")) + private static void registerRegistry(CallbackInfo ci) { + BLOCK_ENTITY_TYPE_REGISTRY = new MapFabricRegistryWrapper<>( + RegistryIds.BLOCK_ENTITY_TYPES, stringClassMap, classStringMap, + identifier -> BlockEntityUtils.ID_TO_OLD.getOrDefault(identifier, identifier.toString()), + string -> BlockEntityUtils.OLD_TO_ID.getOrDefault(string, new Identifier(string)) + ); + + RegistryHelper.addRegistry(RegistryIds.BLOCK_ENTITY_TYPES, BLOCK_ENTITY_TYPE_REGISTRY); + } + + /* + Previous version of LFAPI used to transform vanilla names to id. + We don't do that anymore, so we still check for id versions to not break old saves. + */ + @ModifyArg(method = "create", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;")) + private static Object fixOldSaves(Object oldKey) { + Identifier asId = new Identifier(oldKey); + + if (BlockEntityUtils.ID_TO_OLD.containsKey(asId)) { + return BlockEntityUtils.ID_TO_OLD.get(asId); + } + + return oldKey; + } +} diff --git a/legacy-fabric-block-entity-api-v1/1.10.2/src/main/resources/fabric.mod.json b/legacy-fabric-block-entity-api-v1/1.10.2/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..9df4134a7 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.10.2/src/main/resources/fabric.mod.json @@ -0,0 +1,44 @@ +{ + "schemaVersion": 1, + "id": "legacy-fabric-block-entity-api-v1", + "name": "Legacy Fabric Block Entity API (V1)", + "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": "Block Entity utils", + "entrypoints": { + "preLaunch": [ + ] + }, + "mixins": [ + "legacy-fabric-block-entity-api-v1.mixins.json" + ], + "custom": { + "loom:injected_interfaces": { + }, + "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-block-entity-api-v1/1.10.2/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json b/legacy-fabric-block-entity-api-v1/1.10.2/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json new file mode 100644 index 000000000..627ad7fa6 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.10.2/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "net.legacyfabric.fabric.mixin.block.entity", + "compatibilityLevel": "JAVA_8", + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + "BlockEntityMixin" + ], + "client": [ + ] +} diff --git a/legacy-fabric-block-entity-api-v1/1.12.2/build.gradle b/legacy-fabric-block-entity-api-v1/1.12.2/build.gradle new file mode 100644 index 000000000..e69de29bb diff --git a/legacy-fabric-block-entity-api-v1/1.12.2/gradle.properties b/legacy-fabric-block-entity-api-v1/1.12.2/gradle.properties new file mode 100644 index 000000000..ccf915102 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.12.2/gradle.properties @@ -0,0 +1,2 @@ +minVersionIncluded=1.11 +maxVersionIncluded=1.12.2 diff --git a/legacy-fabric-block-entity-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java b/legacy-fabric-block-entity-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java new file mode 100644 index 000000000..c59863952 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.12.2/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java @@ -0,0 +1,46 @@ +/* + * 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.block.entity; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.util.Identifier; +import net.minecraft.util.registry.SimpleRegistry; + +import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; +import net.legacyfabric.fabric.api.registry.v2.registry.registrable.DesynchronizeableRegistrable; + +@Mixin(BlockEntity.class) +public class BlockEntityMixin { + @Shadow + @Final + private static SimpleRegistry> BLOCK_ENTITY; + + @Inject(method = "", at = @At("RETURN")) + private static void registerRegistry(CallbackInfo ci) { + ((DesynchronizeableRegistrable) BLOCK_ENTITY).fabric$setSynchronize(false); + RegistryHelper.addRegistry(RegistryIds.BLOCK_ENTITY_TYPES, BLOCK_ENTITY); + } +} diff --git a/legacy-fabric-block-entity-api-v1/1.12.2/src/main/resources/fabric.mod.json b/legacy-fabric-block-entity-api-v1/1.12.2/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..9df4134a7 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.12.2/src/main/resources/fabric.mod.json @@ -0,0 +1,44 @@ +{ + "schemaVersion": 1, + "id": "legacy-fabric-block-entity-api-v1", + "name": "Legacy Fabric Block Entity API (V1)", + "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": "Block Entity utils", + "entrypoints": { + "preLaunch": [ + ] + }, + "mixins": [ + "legacy-fabric-block-entity-api-v1.mixins.json" + ], + "custom": { + "loom:injected_interfaces": { + }, + "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-block-entity-api-v1/1.12.2/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json b/legacy-fabric-block-entity-api-v1/1.12.2/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json new file mode 100644 index 000000000..627ad7fa6 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.12.2/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "net.legacyfabric.fabric.mixin.block.entity", + "compatibilityLevel": "JAVA_8", + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + "BlockEntityMixin" + ], + "client": [ + ] +} diff --git a/legacy-fabric-block-entity-api-v1/1.8.9/build.gradle b/legacy-fabric-block-entity-api-v1/1.8.9/build.gradle new file mode 100644 index 000000000..e69de29bb diff --git a/legacy-fabric-block-entity-api-v1/1.8.9/gradle.properties b/legacy-fabric-block-entity-api-v1/1.8.9/gradle.properties new file mode 100644 index 000000000..c0fb44439 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.8.9/gradle.properties @@ -0,0 +1,2 @@ +minVersionIncluded=1.7 +maxVersionIncluded=1.9.4 diff --git a/legacy-fabric-block-entity-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java b/legacy-fabric-block-entity-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java new file mode 100644 index 000000000..6ac1c177d --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.8.9/src/main/java/net/legacyfabric/fabric/mixin/block/entity/BlockEntityMixin.java @@ -0,0 +1,76 @@ +/* + * 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.block.entity; + +import java.util.Map; + +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.block.entity.BlockEntity; + +import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; +import net.legacyfabric.fabric.api.registry.v2.registry.holder.FabricRegistry; +import net.legacyfabric.fabric.api.util.Identifier; +import net.legacyfabric.fabric.impl.block.entity.BlockEntityUtils; +import net.legacyfabric.fabric.impl.registry.wrapper.MapFabricRegistryWrapper; + +@Mixin(BlockEntity.class) +public class BlockEntityMixin { + @Shadow + @Final + private static Map> stringClassMap; + @Shadow + @Final + private static Map, String> classStringMap; + @Unique + private static FabricRegistry> BLOCK_ENTITY_TYPE_REGISTRY; + + @Inject(method = "", at = @At("RETURN")) + private static void registerRegistry(CallbackInfo ci) { + BLOCK_ENTITY_TYPE_REGISTRY = new MapFabricRegistryWrapper<>( + RegistryIds.BLOCK_ENTITY_TYPES, stringClassMap, classStringMap, + identifier -> BlockEntityUtils.ID_TO_OLD.getOrDefault(identifier, identifier.toString()), + string -> BlockEntityUtils.OLD_TO_ID.getOrDefault(string, new Identifier(string)) + ); + + RegistryHelper.addRegistry(RegistryIds.BLOCK_ENTITY_TYPES, BLOCK_ENTITY_TYPE_REGISTRY); + } + + /* + Previous version of LFAPI used to transform vanilla names to id. + We don't do that anymore, so we still check for id versions to not break old saves. + */ + @ModifyArg(method = "createFromNbt", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;")) + private static Object fixOldSaves(Object oldKey) { + Identifier asId = new Identifier(oldKey); + + if (BlockEntityUtils.ID_TO_OLD.containsKey(asId)) { + return BlockEntityUtils.ID_TO_OLD.get(asId); + } + + return oldKey; + } +} diff --git a/legacy-fabric-block-entity-api-v1/1.8.9/src/main/resources/fabric.mod.json b/legacy-fabric-block-entity-api-v1/1.8.9/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..9df4134a7 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.8.9/src/main/resources/fabric.mod.json @@ -0,0 +1,44 @@ +{ + "schemaVersion": 1, + "id": "legacy-fabric-block-entity-api-v1", + "name": "Legacy Fabric Block Entity API (V1)", + "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": "Block Entity utils", + "entrypoints": { + "preLaunch": [ + ] + }, + "mixins": [ + "legacy-fabric-block-entity-api-v1.mixins.json" + ], + "custom": { + "loom:injected_interfaces": { + }, + "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-block-entity-api-v1/1.8.9/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json b/legacy-fabric-block-entity-api-v1/1.8.9/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json new file mode 100644 index 000000000..627ad7fa6 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/1.8.9/src/main/resources/legacy-fabric-block-entity-api-v1.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "net.legacyfabric.fabric.mixin.block.entity", + "compatibilityLevel": "JAVA_8", + "injectors": { + "defaultRequire": 1 + }, + "mixins": [ + "BlockEntityMixin" + ], + "client": [ + ] +} diff --git a/legacy-fabric-block-entity-api-v1/common.gradle b/legacy-fabric-block-entity-api-v1/common.gradle new file mode 100644 index 000000000..e139671fc --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/common.gradle @@ -0,0 +1,6 @@ +moduleDependencies(project, [ + "legacy-fabric-api-base", + "legacy-fabric-networking-api-v1", + "legacy-fabric-resource-loader-v1", + "legacy-fabric-registry-sync-api-v2" +]) diff --git a/legacy-fabric-block-entity-api-v1/common/build.gradle b/legacy-fabric-block-entity-api-v1/common/build.gradle new file mode 100644 index 000000000..e69de29bb diff --git a/legacy-fabric-block-entity-api-v1/common/gradle.properties b/legacy-fabric-block-entity-api-v1/common/gradle.properties new file mode 100644 index 000000000..a499ab733 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/common/gradle.properties @@ -0,0 +1,2 @@ +minVersionIncluded=1.7 +maxVersionIncluded=1.12.2 diff --git a/legacy-fabric-block-entity-api-v1/common/src/main/java/net/legacyfabric/fabric/api/block/entity/v1/BlockEntityTypeIds.java b/legacy-fabric-block-entity-api-v1/common/src/main/java/net/legacyfabric/fabric/api/block/entity/v1/BlockEntityTypeIds.java new file mode 100644 index 000000000..33718fb55 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/common/src/main/java/net/legacyfabric/fabric/api/block/entity/v1/BlockEntityTypeIds.java @@ -0,0 +1,58 @@ +/* + * 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.block.entity.v1; + +import net.legacyfabric.fabric.api.util.Identifier; +import net.legacyfabric.fabric.api.util.SinceMC; + +public class BlockEntityTypeIds { + public static final Identifier FURNACE = id("furnace"); + public static final Identifier CHEST = id("chest"); + public static final Identifier ENDER_CHEST = id("ender_chest"); + public static final Identifier JUKEBOX = id("jukebox"); + public static final Identifier DISPENSER = id("dispenser"); + public static final Identifier DROPPER = id("dropper"); + public static final Identifier SIGN = id("sign"); + public static final Identifier MOB_SPAWNER = id("mob_spawner"); + public static final Identifier NOTEBLOCK = id("noteblock"); + public static final Identifier PISTON = id("piston"); + public static final Identifier BREWING_STAND = id("brewing_stand"); + public static final Identifier ENCHANTING_TABLE = id("enchanting_table"); + public static final Identifier END_PORTAL = id("end_portal"); + public static final Identifier BEACON = id("beacon"); + public static final Identifier SKULL = id("skull"); + public static final Identifier DAYLIGHT_DETECTOR = id("daylight_detector"); + public static final Identifier HOPPER = id("hopper"); + public static final Identifier COMPARATOR = id("comparator"); + public static final Identifier FLOWER_POT = id("flower_pot"); + @SinceMC("1.8") + public static final Identifier BANNER = id("banner"); + @SinceMC("1.9.4") + public static final Identifier STRUCTURE_BLOCK = id("structure_block"); + @SinceMC("1.9.4") + public static final Identifier END_GATEWAY = id("end_gateway"); + public static final Identifier COMMAND_BLOCK = id("command_block"); + @SinceMC("1.11.2") + public static final Identifier SHULKER_BOX = id("shulker_box"); + @SinceMC("1.12.2") + public static final Identifier BED = id("bed"); + + private static Identifier id(String path) { + return new Identifier(path); + } +} diff --git a/legacy-fabric-block-entity-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/block/entity/BlockEntityUtils.java b/legacy-fabric-block-entity-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/block/entity/BlockEntityUtils.java new file mode 100644 index 000000000..6944aac48 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/common/src/main/java/net/legacyfabric/fabric/impl/block/entity/BlockEntityUtils.java @@ -0,0 +1,55 @@ +/* + * 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.block.entity; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +import net.legacyfabric.fabric.api.block.entity.v1.BlockEntityTypeIds; +import net.legacyfabric.fabric.api.util.Identifier; + +public class BlockEntityUtils { + public static final BiMap OLD_TO_ID = HashBiMap.create(); + public static final BiMap ID_TO_OLD = OLD_TO_ID.inverse(); + + static { + OLD_TO_ID.put("Furnace", BlockEntityTypeIds.FURNACE); + OLD_TO_ID.put("Chest", BlockEntityTypeIds.CHEST); + OLD_TO_ID.put("EnderChest", BlockEntityTypeIds.ENDER_CHEST); + OLD_TO_ID.put("RecordPlayer", BlockEntityTypeIds.JUKEBOX); + OLD_TO_ID.put("Trap", BlockEntityTypeIds.DISPENSER); + OLD_TO_ID.put("Dropper", BlockEntityTypeIds.DROPPER); + OLD_TO_ID.put("Sign", BlockEntityTypeIds.SIGN); + OLD_TO_ID.put("MobSpawner", BlockEntityTypeIds.MOB_SPAWNER); + OLD_TO_ID.put("Music", BlockEntityTypeIds.NOTEBLOCK); + OLD_TO_ID.put("Piston", BlockEntityTypeIds.PISTON); + OLD_TO_ID.put("Cauldron", BlockEntityTypeIds.BREWING_STAND); + OLD_TO_ID.put("EnchantTable", BlockEntityTypeIds.ENCHANTING_TABLE); + OLD_TO_ID.put("Airportal", BlockEntityTypeIds.END_PORTAL); + OLD_TO_ID.put("Control", BlockEntityTypeIds.COMMAND_BLOCK); + OLD_TO_ID.put("Beacon", BlockEntityTypeIds.BEACON); + OLD_TO_ID.put("Skull", BlockEntityTypeIds.SKULL); + OLD_TO_ID.put("DLDetector", BlockEntityTypeIds.DAYLIGHT_DETECTOR); + OLD_TO_ID.put("Hopper", BlockEntityTypeIds.HOPPER); + OLD_TO_ID.put("Comparator", BlockEntityTypeIds.COMPARATOR); + OLD_TO_ID.put("FlowerPot", BlockEntityTypeIds.FLOWER_POT); + OLD_TO_ID.put("Banner", BlockEntityTypeIds.BANNER); + OLD_TO_ID.put("Structure", BlockEntityTypeIds.STRUCTURE_BLOCK); + OLD_TO_ID.put("EndGateway", BlockEntityTypeIds.END_GATEWAY); + } +} diff --git a/legacy-fabric-block-entity-api-v1/common/src/main/resources/fabric.mod.json b/legacy-fabric-block-entity-api-v1/common/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..f7f623bc5 --- /dev/null +++ b/legacy-fabric-block-entity-api-v1/common/src/main/resources/fabric.mod.json @@ -0,0 +1,43 @@ +{ + "schemaVersion": 1, + "id": "legacy-fabric-block-entity-api-v1-common", + "name": "Legacy Fabric Block Entity API (V1)", + "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": "Block Entity utils", + "entrypoints": { + "preLaunch": [ + ] + }, + "mixins": [ + ], + "custom": { + "loom:injected_interfaces": { + }, + "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-v1/common.gradle b/legacy-fabric-registry-sync-api-v1/common.gradle index be10e46f6..a58eab098 100644 --- a/legacy-fabric-registry-sync-api-v1/common.gradle +++ b/legacy-fabric-registry-sync-api-v1/common.gradle @@ -5,4 +5,5 @@ moduleDependencies(project, [ "legacy-fabric-registry-sync-api-v2", "legacy-fabric-item-api-v1", "legacy-fabric-block-api-v1", + "legacy-fabric-block-entity-api-v1" ]) diff --git a/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/BiDefaultedRegistryMixin.java b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/BiDefaultedRegistryMixin.java index cc23020be..9f9393285 100644 --- a/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/BiDefaultedRegistryMixin.java +++ b/legacy-fabric-registry-sync-api-v2/1.7.10/src/main/java/net/legacyfabric/fabric/mixin/registry/sync/versioned/BiDefaultedRegistryMixin.java @@ -19,9 +19,12 @@ import java.util.Objects; -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.util.registry.BiDefaultedRegistry; import net.minecraft.util.registry.SimpleRegistry; @@ -33,19 +36,23 @@ public abstract class BiDefaultedRegistryMixin extends SimpleRegistry { @Shadow private Object defaultValue; - @Shadow - @Final - private String field_8395; - @Shadow public abstract Object get(String par1); + @Unique + private Identifier lf$defaultKey; + + @Inject(method = "", at = @At("RETURN")) + private void fabric$setDefaultKey(String par1, CallbackInfo ci) { + this.lf$defaultKey = new Identifier(par1); + } + @Override public Object fabric$getValue(Identifier id) { String key = (String) fabric$toKeyType(id); Object value = get(key); - if (value == this.defaultValue && !Objects.equals(this.field_8395, key)) return null; + if (value == this.defaultValue && !Objects.equals(this.lf$defaultKey.toString(), key)) return null; return value; } diff --git a/legacyfabric-api/1.10.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.10.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index 23a79494b..4c8ce0ea8 100644 --- a/legacyfabric-api/1.10.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.10.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,16 +19,29 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; import net.legacyfabric.fabric.api.resource.ItemModelRegistry; import net.legacyfabric.fabric.api.util.Identifier; @@ -37,6 +50,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -66,4 +80,40 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + RegistryHelper.register(RegistryIds.BLOCK_ENTITY_TYPES, identifier, TestBlockEntity.class); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean method_421(World world, BlockPos blockPos, BlockState blockState, PlayerEntity playerEntity, Hand hand, @Nullable ItemStack itemStack, Direction direction, float f, float g, float h) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(blockPos); + + if (entity instanceof TestBlockEntity) { + playerEntity.sendMessage(new LiteralText(entity + " at " + blockPos.toString())); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.10.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.10.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..54595ceba 100644 --- a/legacyfabric-api/1.10.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.10.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_1644825.name": "Test Block 1644825", + "tile.legacy-fabric-api.conc_block_3361970.name": "Test Block 3361970", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/1.11.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.11.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index 23a79494b..d22d83d10 100644 --- a/legacyfabric-api/1.11.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.11.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,16 +19,28 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; import net.legacyfabric.fabric.api.resource.ItemModelRegistry; import net.legacyfabric.fabric.api.util.Identifier; @@ -37,6 +49,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -66,4 +79,40 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + RegistryHelper.register(RegistryIds.BLOCK_ENTITY_TYPES, identifier, TestBlockEntity.class); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction direction, float f, float g, float h) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(pos); + + if (entity instanceof TestBlockEntity) { + player.sendMessage(new LiteralText(entity + " at " + pos.toString())); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.11.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.11.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..54595ceba 100644 --- a/legacyfabric-api/1.11.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.11.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_1644825.name": "Test Block 1644825", + "tile.legacy-fabric-api.conc_block_3361970.name": "Test Block 3361970", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/1.12.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.12.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index 23a79494b..d22d83d10 100644 --- a/legacyfabric-api/1.12.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.12.2/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,16 +19,28 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +import net.legacyfabric.fabric.api.registry.v2.RegistryIds; import net.legacyfabric.fabric.api.resource.ItemModelRegistry; import net.legacyfabric.fabric.api.util.Identifier; @@ -37,6 +49,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -66,4 +79,40 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + RegistryHelper.register(RegistryIds.BLOCK_ENTITY_TYPES, identifier, TestBlockEntity.class); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean use(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction direction, float f, float g, float h) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(pos); + + if (entity instanceof TestBlockEntity) { + player.sendMessage(new LiteralText(entity + " at " + pos.toString())); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.12.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.12.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..54595ceba 100644 --- a/legacyfabric-api/1.12.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.12.2/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_1644825.name": "Test Block 1644825", + "tile.legacy-fabric-api.conc_block_3361970.name": "Test Block 3361970", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/1.7.10/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.7.10/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index 30d0f2679..273f20da8 100644 --- a/legacyfabric-api/1.7.10/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.7.10/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,15 +19,25 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +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.holder.FabricRegistry; import net.legacyfabric.fabric.api.util.Identifier; public class RegistryTest implements ModInitializer { @@ -35,6 +45,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -58,4 +69,46 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + + RegistryInitializedEvent.event(RegistryIds.BLOCK_ENTITY_TYPES).register(new RegistryInitializedEvent() { + @Override + public void initialized(FabricRegistry registry) { + RegistryHelper.register(registry, identifier, (T) TestBlockEntity.class); + } + }); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean onActivated(World world, int x, int y, int z, PlayerEntity player, int i, float f, float g, float h) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(x, y, z); + + if (entity instanceof TestBlockEntity) { + player.sendMessage(new LiteralText(entity + " at " + x + "," + y + "," + z)); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.7.10/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.7.10/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..9294257a2 100644 --- a/legacyfabric-api/1.7.10/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.7.10/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_0.name": "Test Block 0", + "tile.legacy-fabric-api.conc_block_7368816.name": "Test Block 7368816", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/1.8.9/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.8.9/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index 8dd49306a..2fb5d03f5 100644 --- a/legacyfabric-api/1.8.9/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.8.9/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,16 +19,29 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +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.holder.FabricRegistry; import net.legacyfabric.fabric.api.resource.ItemModelRegistry; import net.legacyfabric.fabric.api.util.Identifier; @@ -37,6 +50,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -59,4 +73,46 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + + RegistryInitializedEvent.event(RegistryIds.BLOCK_ENTITY_TYPES).register(new RegistryInitializedEvent() { + @Override + public void initialized(FabricRegistry registry) { + RegistryHelper.register(registry, identifier, (T) TestBlockEntity.class); + } + }); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean onUse(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction direction, float posX, float posY, float posZ) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(pos); + + if (entity instanceof TestBlockEntity) { + player.sendMessage(new LiteralText(entity + " at " + pos.toString())); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.8.9/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.8.9/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..54595ceba 100644 --- a/legacyfabric-api/1.8.9/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.8.9/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_1644825.name": "Test Block 1644825", + "tile.legacy-fabric-api.conc_block_3361970.name": "Test Block 3361970", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/1.8/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.8/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index 649025aca..20906dbd0 100644 --- a/legacyfabric-api/1.8/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.8/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,15 +19,28 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +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.holder.FabricRegistry; import net.legacyfabric.fabric.api.resource.ItemModelRegistry; import net.legacyfabric.fabric.api.util.Identifier; @@ -36,6 +49,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -58,4 +72,46 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + + RegistryInitializedEvent.event(RegistryIds.BLOCK_ENTITY_TYPES).register(new RegistryInitializedEvent() { + @Override + public void initialized(FabricRegistry registry) { + RegistryHelper.register(registry, identifier, (T) TestBlockEntity.class); + } + }); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean onUse(World world, BlockPos pos, BlockState state, PlayerEntity player, Direction direction, float posX, float posY, float posZ) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(pos); + + if (entity instanceof TestBlockEntity) { + player.sendMessage(new LiteralText(entity + " at " + pos.toString())); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.8/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.8/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..9294257a2 100644 --- a/legacyfabric-api/1.8/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.8/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_0.name": "Test Block 0", + "tile.legacy-fabric-api.conc_block_7368816.name": "Test Block 7368816", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/1.9.4/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java b/legacyfabric-api/1.9.4/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java index cc0fa4c79..64c82602d 100644 --- a/legacyfabric-api/1.9.4/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java +++ b/legacyfabric-api/1.9.4/src/testmod/java/net/legacyfabric/fabric/test/registry/RegistryTest.java @@ -19,16 +19,31 @@ import java.util.concurrent.ThreadLocalRandom; +import org.jetbrains.annotations.Nullable; + import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.item.itemgroup.ItemGroup; +import net.minecraft.text.LiteralText; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; import net.fabricmc.api.ModInitializer; import net.legacyfabric.fabric.api.registry.v2.RegistryHelper; +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.holder.FabricRegistry; import net.legacyfabric.fabric.api.resource.ItemModelRegistry; import net.legacyfabric.fabric.api.util.Identifier; @@ -37,6 +52,7 @@ public class RegistryTest implements ModInitializer { public void onInitialize() { this.registerItems(); this.registerBlocks(); + this.registerBlockEntity(); } private void registerItems() { @@ -66,4 +82,46 @@ private void registerBlocks() { RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(block)); } } + + private void registerBlockEntity() { + Identifier identifier = new Identifier("legacy-fabric-api", "test_block_entity"); + + Block blockWithEntity = new TestBlockWithEntity(Material.DIRT).setItemGroup(ItemGroup.FOOD); + RegistryHelper.register(Block.REGISTRY, identifier, blockWithEntity); + RegistryHelper.register(Item.REGISTRY, identifier, new BlockItem(blockWithEntity)); + + RegistryInitializedEvent.event(RegistryIds.BLOCK_ENTITY_TYPES).register(new RegistryInitializedEvent() { + @Override + public void initialized(FabricRegistry registry) { + RegistryHelper.register(registry, identifier, (T) TestBlockEntity.class); + } + }); + } + + public static class TestBlockWithEntity extends BlockWithEntity { + protected TestBlockWithEntity(Material material) { + super(material); + } + + @Override + public @Nullable BlockEntity createBlockEntity(World world, int id) { + return new TestBlockEntity(); + } + + @Override + public boolean method_421(World world, BlockPos blockPos, BlockState blockState, PlayerEntity playerEntity, Hand hand, @Nullable ItemStack itemStack, Direction direction, float f, float g, float h) { + if (!world.isClient) { + BlockEntity entity = world.getBlockEntity(blockPos); + + if (entity instanceof TestBlockEntity) { + playerEntity.sendMessage(new LiteralText(entity + " at " + blockPos.toString())); + } + } + + return true; + } + } + + public static class TestBlockEntity extends BlockEntity { + } } diff --git a/legacyfabric-api/1.9.4/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json b/legacyfabric-api/1.9.4/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json index c9de3dd3e..54595ceba 100644 --- a/legacyfabric-api/1.9.4/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json +++ b/legacyfabric-api/1.9.4/src/testmod/resources/assets/legacy-fabric-api/lang/en_us.json @@ -1,5 +1,8 @@ { "api.keybinding.testTranslationKey": "Test Keybinding", "legacyfabric.api.youreTesting": "You're Testing Fabric API!", - "item.legacy-fabric-api.test_item.name": "Test Item" + "item.legacy-fabric-api.test_item.name": "Test Item", + "tile.legacy-fabric-api.conc_block_1644825.name": "Test Block 1644825", + "tile.legacy-fabric-api.conc_block_3361970.name": "Test Block 3361970", + "tile.legacy-fabric-api.test_block_entity.name": "Test Block with Entity" } diff --git a/legacyfabric-api/common.gradle b/legacyfabric-api/common.gradle index 9598864ea..e2834bcdd 100644 --- a/legacyfabric-api/common.gradle +++ b/legacyfabric-api/common.gradle @@ -13,6 +13,7 @@ moduleDependencies(project, [ "legacy-fabric-registry-sync-api-v2", "legacy-fabric-item-api-v1", "legacy-fabric-block-api-v1", + "legacy-fabric-block-entity-api-v1", "legacy-fabric-rendering-api-v1", "legacy-fabric-crash-report-info-v1", "legacy-fabric-command-api-v2" diff --git a/settings.gradle b/settings.gradle index 16791cd1c..8189d9a7f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -43,6 +43,7 @@ loadProject("legacy-fabric-registry-sync-api-v1") loadProject("legacy-fabric-registry-sync-api-v2") loadProject("legacy-fabric-item-api-v1") loadProject("legacy-fabric-block-api-v1") +loadProject("legacy-fabric-block-entity-api-v1") loadProject("legacy-fabric-rendering-api-v1") loadProject("legacy-fabric-crash-report-info-v1") loadProject("legacy-fabric-command-api-v2")