#minecraft #bedrock #add-on #框架 #脚本 # #物品

violet_crystal

Minecraft Bedrock 的 Rust 驱动插件开发框架

2 个版本

0.1.1 2024 年 5 月 26 日
0.1.0 2024 年 5 月 25 日

#73游戏

Download history 84/week @ 2024-05-19 293/week @ 2024-05-26 12/week @ 2024-06-02 1/week @ 2024-06-09 4/week @ 2024-06-30 10/week @ 2024-07-07

69 每月下载量

MIT/Apache

1MB
2K SLoC

Logo: Violet Crystal

紫水晶是用于 Rust 驱动的 MCBE 插件开发的 Rust 框架(仍在开发中)

可用功能

  • 包生成
  • 物品(所有组件都齐全!)
  • 脚本支持(将包含 .js 脚本的文件夹与包配对)
  • 配方
  • 方块*

* - 特性和一些组件目前不可用

计划

  • 实体;
  • 动画/渲染控制器;

入门指南

让我们从创建一个新的 来配置一个新的项目开始。

let scripts = Some(ScriptData {
    mc_server_ui_version: "1.2.0-beta".to_string(), // @minecraft/server_ui version
    mc_server_version: "1.11.0-beta".to_string(), // @minecraft/server version
    paired_scripts_folder: r"./src-scripts", // folder from where to get scripts
}); // Script Data. Can be set to None if project doesn't use scripts
let mut pack = Pack::new( // Pack needs to be mutable
    "Violet Crystal".to_string(), // Pack Name
    "violet_crystal".to_string(), // Pack Identifier
    "NaKeR".to_string(), // Pack Author
    "1, 0, 0", // Pack Version. Separated with commas 
    "Nothing here".to_string(), // Pack Description
    true, // Does the project use scripts
    r"*some path*", // Developer BP Folder
    r"*some path*", // Developer RP Folder
    r"*some path*", // Pack Icon
    &scripts, // Script Data which we defined earlier
);

要生成包,我们将使用 pack.generate()pack.build_to_dev()。将这些放在函数末尾。

// Your code here

// Your code here
pack.generate(None); // Generates to "violet_crystal_results" folder.
pack.build_to_dev(); // Copies to specified dev folders.

这将已经创建了一个包。在第一次生成后,将 pack.generate(None) 更改为 pack.generate(Some(false))。这样做是为了确保紫水晶不会更改清单,从而更改 UUID。

让我们添加一个新的物品!

使用 pack.register_item() 添加一个新的物品,它需要一个 Item 参数。

pack.register_item(Item {
     type_id: Identifier {
         namespace: "vc",
         value: "tutorial"
     }, // Identifier is used to indicate a namespaced value
     components: vec![
     ], // item components are going here
});

这将添加一个新的物品。但是等等... 它没有纹理!为了添加纹理,我们首先需要使用 pack.register_item_texture() 将其注册,它需要一个 ItemAtlasEntry 参数。

pack.register_item_texture(ItemAtlasEntry {
    id: "vc_test".to_string(), // Id to use in Item Icon component
    texture_name: "vc_test".to_string(), // Name to use in file system
    path: r"*some path*".to_string(), // Path to texture on your PC
});

然后让我们将其添加到物品中。还记得组件字段吗?

pack.register_item(Item {
     type_id: Identifier {
         namespace: "vc",
         value: "tutorial"
     }, // Identifier is used to indicate a namespaced value
     components: vec![
        &ItemIconComponent {     
            texture: "vc_test", // texture id we've specified earlier
        },                       
     ], // item components are going here
});

这将把纹理添加到物品中。所有物品组件都在那里。我不会列出所有这些。您可以在官方 MC 文档中查看它们的文档。

方块

添加方块也是以类似的方式进行。目前,在 Beta 1 中,您不需要在 texture_set 字段中注册纹理,只需指定路径即可。它可能会像物品那样进行更改,以保持一致性。方块的示例

pack.register_block(Block {                                                                                                                                                                                                                                  
    type_id: Identifier {                                                                                                                                                                                                                                    
        namespace: "vc",                                                                                                                                                                                                                                   
        value: "test"                                                                                                                                                                                                                                        
    },                                                                                                                                                                                                                                                       
    components: vec![                                                                                                                                                                                                                                        
        &collision_box,                                                                                                                                                                                                                                      
        &crafting_table_component,                                                                                                                                                                                                                           
        &BlockDestructibleByExplosionComponent {                                                                                                                                                                                                             
            explosion_resistance: Some(1.0)                                                                                                                                                                                                                  
        },                                                                                                                                                                                                                                                   
        &BlockDestructibleByMiningComponent {                                                                                                                                                                                                                
            seconds_to_destroy: Some(10.0)                                                                                                                                                                                                                   
        },                                                                                                                                                                                                                                                   
        &flammable,                                                                                                                                                                                                                                          
        &BlockFrictionComponent {                                                                                                                                                                                                                            
            friction: 0.7,                                                                                                                                                                                                                                   
        },                                                                                                                                                                                                                                                   
    ],                                                                                                                                                                                                                                                       
    texture_set: r"*path here*".to_string(),                                                                                                                                                 
    sound: "stone".to_string(),                                                                                                                                                                                                                              
    permutations: vec![                                                                                                                                                                                                                                      
        BlockPermutation {                                                                                                                                                                                                                                   
            condition: "q.block_state('amex:test') == true",                                                                                                                                                                                                 
            components: vec![                                                                                                                                                                                                                                
                &BlockFrictionComponent {                                                                                                                                                                                                                    
                    friction: 0.1,                                                                                                                                                                                                                           
                }                                                                                                                                                                                                                                            
            ]                                                                                                                                                                                                                                                
        }                                                                                                                                                                                                                                                    
    ],                                                                                                                                                                                                                                                       
    states: vec![                                                                                                                                                                                                                                            
        &BoolBlockState {                                                                                                                                                                                                                                    
            id: Identifier {                                                                                                                                                                                                                                 
                namespace: "amex",                                                                                                                                                                                                                           
                value: "test"                                                                                                                                                                                                                                
            }                                                                                                                                                                                                                                                
        }                                                                                                                                                                                                                                                    
    ]                                                                                                                                                                                                                                                        
});                                                                                                                                                                                                                                                          

有了这些知识,你就可以开始了!

依赖关系

~3–12MB
~124K SLoC