Skip to content

管理 BlockEntity

Since 2.1.0

通过实现 ISyncPersistRPCBlockEntity,你可以将所有同步和持久化代码委托给 LDLib2。 你不需要任何额外的代码,只需设置好 syncStorage 和注解即可。

public class MyBlockEntity extends BlockEntity implements ISyncPersistRPCBlockEntity {
    @Getter
    private final FieldManagedStorage syncStorage = new FieldManagedStorage(this);

    @Persisted
    @DescSynced
    @UpdateListener(methodName = "onIntValueChanged")
    private int intValue = 10;
    @Persisted
    @DescSynced
    @DropSaved
    @RequireRerender
    private ItemStack itemStack = ItemStack.EMPTY;

    public MyBlockEntity(BlockPos pWorldPosition, BlockState pBlockState) {
        super(...);
    }

    private void onIntValueChanged(int oldValue, int newValue) {
        LDLib2.LOGGER.info("Int value changed from {} to {}", oldValue, newValue);
    }

    @RPCMethod
    public void rpcMsg(String msg) {
    if (level.isClient) { // 接收端
        LDLib2.LOGGER.info("Received RPC from server: {}", message);
    } else { // 发送端
        rpcToTracking("rpcMsg", msg)
    }
}

Note

实际上,ISyncPersistRPCBlockEntityISyncBlockEntityIRPCBlockEntityIPersistManagedHolderIBlockEntityManaged 组成。 如果你只需要其中部分功能,或者想要进行更精细的控制,可以选择只实现它们中的一部分。

Warning

如果你启用了 useAsyncThread()(默认返回 true)。你必须注意线程安全问题。例如,notifyPersistence() 将在一个线程中被触发。 通常,你不需要担心它,LDLib2 会处理所有情况。