Architectury 多平台接口实现
我们在面对多平台开发的差异时,我们往往可以用接口的思想来解决。
Architectury 注解
我们可以直接使用注解 dev.architectury.injectables.annotations.ExpectPlatform
,
以注册物品为例子,我们可以这么来实现注册物品 (以 1.20.6
为例,实际注册物品可能与有些许差异):
/common/src/main/java/coolclk/tutorial/world/level/block/Blocks.java
package coolclk.tutorial.world.level.block;
import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.GrassBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
public class Blocks {
public static Block GRASS_BLOCK = register(
"grass_block", new GrassBlock(Properties.of().mapColor(MapColor.GRASS).randomTicks().strength(0.6F).sound(SoundType.GRASS))
);
@ExpectPlatform
public static Block register(String name, Block block) {
throw new AssertionError();
}
}
/common/src/main/java/coolclk/tutorial/world/item/Items.java
package coolclk.tutorial.world.item;
import coolclk.tutorial.world.level.block.Blocks;
import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
public class Items {
public static Item GRASS_BLOCK = registerBlock(Blocks.GRASS_BLOCK);
@ExpectPlatform
public static Item registerBlock(Block block) {
throw new AssertionError();
}
}
/fabric-like/src/main/java/coolclk/tutorial/world/level/block/BlocksImpl.java
package coolclk.tutorial.world.level.block;
import coolclk.tutorial.TutorialMod;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Block;
public class BlocksImpl {
public static Block register(String name, Block block) {
return Registry.register(BuiltInRegistries.BLOCK, new ResourceLocation(TutorialMod.MOD_ID, name), block);
}
}
/fabric-like/src/main/java/coolclk/tutorial/world/item/ItemsImpl.java
package coolclk.tutorial.world.item;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
public class ItemsImpl {
public static Item registerBlock(Block block) {
return Items.registerBlock(new BlockItem(block, new Item.Properties()));
}
}
/neoforge/src/main/java/coolclk/tutorial/world/level/block/BlocksImpl.java
package coolclk.tutorial.world.level.block;
import coolclk.tutorial.TutorialMod;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.registries.DeferredRegister;
public class BlocksImpl {
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(
BuiltInRegistries.BLOCK,
TutorialMod.MOD_ID
);
public static Block register(String name, Block block) {
return BLOCKS.register(
name,
() -> block
).get();
}
}
/neoforge/src/main/java/coolclk/tutorial/world/item/ItemsImpl.java
package coolclk.tutorial.world.item;
import coolclk.tutorial.TutorialMod;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.registries.DeferredRegister;
public class ItemsImpl {
public static final DeferredRegister<Block> ITEMS = DeferredRegister.create(
BuiltInRegistries.ITEM,
TutorialMod.MOD_ID
);
public static Item registerBlock(Block block) {
return ITEMS.register(
BuiltInRegistries.BLOCK.getKey(block),
() -> new BlockItem(block, new Item.Properties())
).get();
}
}
/neoforge/src/main/java/coolclk/tutorial/neoforge/TutorialModNeoForge.java
package coolclk.tutorial.neoforge;
import coolclk.tutorial.TutorialMod;
import coolclk.tutorial.world.item.ItemsImpl;
import coolclk.tutorial.world.level.block.BlocksImpl;
@Mod(TutorialMod.MOD_ID)
public class TutorialModNeoForge {
public TutorialModNeoForge(IEventBus modBus) {
TutorialMod.init();
BlocksImpl.BLOCKS.register(modBus);
ItemsImpl.ITEMS.register(modBus);
}
}
覆写
当然,我们也可以不需要使用注解,只需要保持类路径一致即可。