[{"data":1,"prerenderedAt":1077},["ShallowReactive",2],{"data":3,"\u002Fwiki\u002Fdocs\u002Fplugin":118},[4,9,14,19,24,29,34,39,44,49,54,59,64,68,73,78,83,88,93,98,103,108,113],{"title":5,"path":6,"description":7,"id":8},"FAQ","\u002Fblockbench\u002Ffaq","Frequently Asked Questions about Blockbench","content\u002Fblockbench\u002Ffaq.md",{"title":10,"path":11,"description":12,"id":13},"Formats","\u002Fblockbench\u002Fformats","formats","content\u002Fblockbench\u002Fformats.md",{"title":15,"path":16,"description":17,"id":18},"Legacy Versions","\u002Fblockbench\u002Flegacy-versions","Blockbench version history and changelogs prior to switching to Github Releases","content\u002Fblockbench\u002Flegacy-versions.md",{"title":20,"path":21,"description":22,"id":23},"Localization","\u002Fblockbench\u002Flocalization","How to contribute to Blockbench languages","content\u002Fblockbench\u002Flocalization.md",{"title":25,"path":26,"description":27,"id":28},"Logos and Brand Assets","\u002Fblockbench\u002Flogos","Frequently Asked Questions about the Blockbench app","content\u002Fblockbench\u002Flogos.md",{"title":30,"path":31,"description":32,"id":33},"Custom Themes","\u002Fblockbench\u002Fthemes","Themes allow you to change the visual appearance of Blockbench. You can drag and drop .bbtheme files into Blockbench to load them.","content\u002Fblockbench\u002Fthemes.md",{"title":35,"path":36,"description":37,"id":38},"The .bbmodel format","\u002Fdocs\u002Fbbmodel","An overview of the .bbmodel file format","content\u002Fdocs\u002Fbbmodel.md",{"title":40,"path":41,"description":42,"id":43},"Blockbench","\u002Fdocs\u002Fblockbench","The Blockbench object provides useful variables and methods to interact with general functionality of Blockbench.","content\u002Fdocs\u002Fblockbench.md",{"title":45,"path":46,"description":47,"id":48},"Upgrading Plugins to 5.0","\u002Fdocs\u002Fplugin-upgrade-to-5.0","An overview of breaking changes in the plugin API in 5.0","content\u002Fdocs\u002Fplugin-upgrade-to-5.0.md",{"title":50,"path":51,"description":52,"id":53},"Creating a Plugin","\u002Fdocs\u002Fplugin","This article will go over the basic steps needed to create your first plugin.","content\u002Fdocs\u002Fplugin.md",{"title":55,"path":56,"description":57,"id":58},"Properties","\u002Fdocs\u002Fproperty","Properties are used to dynamically assign properties to existing classes that are undo-relevant.\nThe advantages of using properties include:","content\u002Fdocs\u002Fproperty.md",{"title":60,"path":61,"description":62,"id":63},"Interface","\u002Fdocs\u002Fui","","content\u002Fdocs\u002Fui.md",{"title":65,"path":66,"description":62,"id":67},"Undo","\u002Fdocs\u002Fundo","content\u002Fdocs\u002Fundo.md",{"title":69,"path":70,"description":71,"id":72},"Web App URL Parameters","\u002Fdocs\u002Furl-parameters","How to provide integration with the Blockbench web app using URL parameters","content\u002Fdocs\u002Furl-parameters.md",{"title":74,"path":75,"description":76,"id":77},"Utils","\u002Fdocs\u002Futility","Blockbench comes with a bunch of custom utility functions to make the life of developers easier.","content\u002Fdocs\u002Futility.md",{"title":79,"path":80,"description":81,"id":82},"Animation Expressions","\u002Fguides\u002Fanimation-expressions","Expressions in animations can be used to create dynamic animations based on math expressions, or to create systems where variables can be used to modify the transformation or state of the model, such as facial expressions","content\u002Fguides\u002Fanimation-expressions.md",{"title":84,"path":85,"description":86,"id":87},"Bedrock Modeling and Animation","\u002Fguides\u002Fbedrock-modeling","Learn how to create entity models and animations for Minecraft Bedrock Edition","content\u002Fguides\u002Fbedrock-modeling.md",{"title":89,"path":90,"description":91,"id":92},"Blockbench Overview & Tips","\u002Fguides\u002Fblockbench-overview-tips","The fundamentals of Blockbench and how to use it efficiently","content\u002Fguides\u002Fblockbench-overview-tips.md",{"title":94,"path":95,"description":96,"id":97},"Emissive Textures in Renders","\u002Fguides\u002Femissive-textures-renders","How to create elegant emissive textures in renders","content\u002Fguides\u002Femissive-textures-renders.md",{"title":99,"path":100,"description":101,"id":102},"3D Export","\u002Fguides\u002Fexport-formats","An overview of the different export formats and how to transfer your model into other programs","content\u002Fguides\u002Fexport-formats.md",{"title":104,"path":105,"description":106,"id":107},"Particles and Sounds in MC Bedrock","\u002Fguides\u002Fminecraft-particles-sounds","How to add particles and sounds effects to animations for Minecraft Bedrock Edition","content\u002Fguides\u002Fminecraft-particles-sounds.md",{"title":109,"path":110,"description":111,"id":112},"Minecraft Style Guide","\u002Fguides\u002Fminecraft-style-guide","Tips for creating art in the Minecraft style","content\u002Fguides\u002Fminecraft-style-guide.md",{"title":114,"path":115,"description":116,"id":117},"Rendering Models","\u002Fguides\u002Fmodel-rendering","Learn how to create renders of your Blockbench models","content\u002Fguides\u002Fmodel-rendering.md",{"id":53,"title":50,"body":119,"description":52,"extension":1072,"meta":1073,"navigation":414,"path":51,"seo":1074,"stem":1075,"__hash__":1076},{"type":120,"value":121,"toc":1058},"minimark",[122,126,129,134,139,150,154,162,172,291,393,402,405,475,479,498,506,510,513,517,520,524,534,546,549,552,626,630,637,669,673,676,1030,1034,1042,1045,1054],[123,124,50],"h1",{"id":125},"creating-a-plugin",[127,128,52],"p",{},[130,131,133],"h2",{"id":132},"basics","Basics",[135,136,138],"h3",{"id":137},"prerequisites","Prerequisites",[127,140,141,142,149],{},"To create a Blockbench plugin, you need basic knowledge of Javascript and Git, a working text editor like ",[143,144,148],"a",{"href":145,"rel":146},"https:\u002F\u002Fcode.visualstudio.com",[147],"nofollow","VS Code",", and of course Blockbench.",[135,151,153],{"id":152},"plugin-file-structure","Plugin file structure",[127,155,156,157,161],{},"Plugins consist of a Javascript file. To create a plugin, create a new Javascript file named ",[158,159,160],"code",{},"[plugin-id].js",". Inside this file, use the method Plugin.register to initialize the plugin, as seen in the example.",[163,164,165],"blockquote",{},[127,166,167,171],{},[168,169,170],"strong",{},"NOTE:","  the plugin ID must be the same as the file name minus extension.",[173,174,178],"pre",{"className":175,"code":176,"language":177,"meta":62,"style":62},"language-javascript shiki shiki-themes github-light github-dark","Plugin.register('plugin_id', {\n    title: 'Plugin Name',\n    author: 'Your Name',\n    icon: 'icon',\n    description: 'Your Description',\n    version: '1.0.0',\n    variant: 'both',\n    onload() {\n    }\n});\n","javascript",[158,179,180,203,215,226,237,248,259,270,279,285],{"__ignoreMap":62},[181,182,185,189,193,196,200],"span",{"class":183,"line":184},"line",1,[181,186,188],{"class":187},"sVt8B","Plugin.",[181,190,192],{"class":191},"sScJk","register",[181,194,195],{"class":187},"(",[181,197,199],{"class":198},"sZZnC","'plugin_id'",[181,201,202],{"class":187},", {\n",[181,204,206,209,212],{"class":183,"line":205},2,[181,207,208],{"class":187},"    title: ",[181,210,211],{"class":198},"'Plugin Name'",[181,213,214],{"class":187},",\n",[181,216,218,221,224],{"class":183,"line":217},3,[181,219,220],{"class":187},"    author: ",[181,222,223],{"class":198},"'Your Name'",[181,225,214],{"class":187},[181,227,229,232,235],{"class":183,"line":228},4,[181,230,231],{"class":187},"    icon: ",[181,233,234],{"class":198},"'icon'",[181,236,214],{"class":187},[181,238,240,243,246],{"class":183,"line":239},5,[181,241,242],{"class":187},"    description: ",[181,244,245],{"class":198},"'Your Description'",[181,247,214],{"class":187},[181,249,251,254,257],{"class":183,"line":250},6,[181,252,253],{"class":187},"    version: ",[181,255,256],{"class":198},"'1.0.0'",[181,258,214],{"class":187},[181,260,262,265,268],{"class":183,"line":261},7,[181,263,264],{"class":187},"    variant: ",[181,266,267],{"class":198},"'both'",[181,269,214],{"class":187},[181,271,273,276],{"class":183,"line":272},8,[181,274,275],{"class":191},"    onload",[181,277,278],{"class":187},"() {\n",[181,280,282],{"class":183,"line":281},9,[181,283,284],{"class":187},"    }\n",[181,286,288],{"class":183,"line":287},10,[181,289,290],{"class":187},"});\n",[292,293,294,301,307,313,323,329,340,357,363,369,375,381,387],"ul",{},[295,296,297,300],"li",{},[158,298,299],{},"title: String"," Plugin title as shown in the store in Blockbench",[295,302,303,306],{},[158,304,305],{},"author: String"," Author name or names",[295,308,309,312],{},[158,310,311],{},"description: String"," Plugin description for the store in Blockbench",[295,314,315,318,319],{},[158,316,317],{},"icon: String"," Blockbench icon string, see ",[143,320,322],{"href":321},"blockbench#icons","Blockbench#icons",[295,324,325,328],{},[158,326,327],{},"tags: String Array"," Plugin tags that will be displayed in the store. You can have up to 3. Plugins specifically designed for Minecraft must one of the following tags: 'Minecraft', 'Minecraft: Java Edition', or 'Minecraft: Bedrock Edition'.",[295,330,331,334,335],{},[158,332,333],{},"version: String"," Version number for your plugin using ",[143,336,339],{"href":337,"rel":338},"https:\u002F\u002Fsemver.org",[147],"semver",[295,341,342,345,346,349,350,353,354],{},[158,343,344],{},"variant: String"," Variant of Blockbench which supports your plugin. Can be ",[158,347,348],{},"desktop",", ",[158,351,352],{},"web"," or ",[158,355,356],{},"both",[295,358,359,362],{},[158,360,361],{},"min_version: String"," Minimum compatible Blockbench version",[295,364,365,368],{},[158,366,367],{},"await_loading: String"," Wait for the plugin to finish loading, before allowing Blockbench to do anything such as loading a project. This is useful for plugins that add formats and codecs when opening a file with Blockbench that requires those formats.",[295,370,371,374],{},[158,372,373],{},"onload()"," Runs whenever the plugin is loaded or after a reload",[295,376,377,380],{},[158,378,379],{},"onunload()"," Runs whenever the plugin unloads",[295,382,383,386],{},[158,384,385],{},"oninstall()"," Runs when the player installs the plugin",[295,388,389,392],{},[158,390,391],{},"onuninstall()"," Runs when the player uninstalls the plugin",[127,394,395,396,401],{},"You can find more plugin metadata options in the ",[143,397,400],{"href":398,"rel":399},"https:\u002F\u002Fweb.blockbench.net\u002Fdocs",[147],"Plugin API Refererence",".",[127,403,404],{},"The variable context of a plugin file is isolated, so you can declare variables like this without polluting the global object.",[173,406,408],{"className":175,"code":407,"language":177,"meta":62,"style":62},"\nlet plugin_variable_1;\n\nPlugin.register('plugin_id', {\n    onload() {\n        plugin_variable_1 = 'foo';\n    },\n    ...\n});\n\n",[158,409,410,416,425,429,441,447,461,466,471],{"__ignoreMap":62},[181,411,412],{"class":183,"line":184},[181,413,415],{"emptyLinePlaceholder":414},true,"\n",[181,417,418,422],{"class":183,"line":205},[181,419,421],{"class":420},"szBVR","let",[181,423,424],{"class":187}," plugin_variable_1;\n",[181,426,427],{"class":183,"line":217},[181,428,415],{"emptyLinePlaceholder":414},[181,430,431,433,435,437,439],{"class":183,"line":228},[181,432,188],{"class":187},[181,434,192],{"class":191},[181,436,195],{"class":187},[181,438,199],{"class":198},[181,440,202],{"class":187},[181,442,443,445],{"class":183,"line":239},[181,444,275],{"class":191},[181,446,278],{"class":187},[181,448,449,452,455,458],{"class":183,"line":250},[181,450,451],{"class":187},"        plugin_variable_1 ",[181,453,454],{"class":420},"=",[181,456,457],{"class":198}," 'foo'",[181,459,460],{"class":187},";\n",[181,462,463],{"class":183,"line":261},[181,464,465],{"class":187},"    },\n",[181,467,468],{"class":183,"line":272},[181,469,470],{"class":420},"    ...\n",[181,472,473],{"class":183,"line":281},[181,474,290],{"class":187},[135,476,478],{"id":477},"api-autocomplete","API Autocomplete",[127,480,481,482,487,488,491,492,497],{},"You can use the ",[143,483,486],{"href":484,"rel":485},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fblockbench-types",[147],"Blockbench typescript types"," to get autocomplete support for the Blockbench API. This only works in ",[143,489,148],{"href":145,"rel":490},[147],".\nTypes are required when using ",[143,493,496],{"href":494,"rel":495},"https:\u002F\u002Fwww.typescriptlang.org",[147],"Typescript"," to build a plugin, but they are also super helpful when using Javascript. Currently Blockbench types are also more up-to-date than the Wiki.\nYou can install the types from NPM via",[173,499,504],{"className":500,"code":502,"language":503},[501],"language-text","npm i --save-dev blockbench-types\n","text",[158,505,502],{"__ignoreMap":62},[135,507,509],{"id":508},"testing-the-plugin","Testing the plugin",[127,511,512],{},"To test your plugin, you can load it from the plugin menu using the button in the title bar, or you can simply drag and drop it into Blockbench. Use the Plugin menu or press Ctrl\u002FCmd + J to reload it.",[130,514,516],{"id":515},"an-example","An example",[127,518,519],{},"In this example we are going to create a small silly plugin that will randomize the height of all selected cubes.",[135,521,523],{"id":522},"structure","Structure",[127,525,526,527,530,531,401],{},"First, create a new file named ",[158,528,529],{},"height_randomizer.js",". Open the file and define the variable ",[158,532,533],{},"button",[173,535,537],{"className":175,"code":536,"language":177,"meta":62,"style":62},"let button;\n\n",[158,538,539],{"__ignoreMap":62},[181,540,541,543],{"class":183,"line":184},[181,542,421],{"class":420},[181,544,545],{"class":187}," button;\n",[127,547,548],{},"Now we need to register the plugin. This process will give Blockbench all the required information to handle the plugin.\nIn case the user is offline or loads the plugin from the computer, this will also provide the plugin metadata such as name and author for the plugin store.",[127,550,551],{},"Write this code inside the function right after the button variable.",[173,553,555],{"className":175,"code":554,"language":177,"meta":62,"style":62},"Plugin.register('height_randomizer', {\n    title: 'Height Randomizer',\n    author: 'YourName',\n    description: 'This plugin can randomize the height of all selected cubes',\n    icon: 'bar_chart',\n    version: '0.0.1',\n    variant: 'both'\n});\n",[158,556,557,570,579,588,597,606,615,622],{"__ignoreMap":62},[181,558,559,561,563,565,568],{"class":183,"line":184},[181,560,188],{"class":187},[181,562,192],{"class":191},[181,564,195],{"class":187},[181,566,567],{"class":198},"'height_randomizer'",[181,569,202],{"class":187},[181,571,572,574,577],{"class":183,"line":205},[181,573,208],{"class":187},[181,575,576],{"class":198},"'Height Randomizer'",[181,578,214],{"class":187},[181,580,581,583,586],{"class":183,"line":217},[181,582,220],{"class":187},[181,584,585],{"class":198},"'YourName'",[181,587,214],{"class":187},[181,589,590,592,595],{"class":183,"line":228},[181,591,242],{"class":187},[181,593,594],{"class":198},"'This plugin can randomize the height of all selected cubes'",[181,596,214],{"class":187},[181,598,599,601,604],{"class":183,"line":239},[181,600,231],{"class":187},[181,602,603],{"class":198},"'bar_chart'",[181,605,214],{"class":187},[181,607,608,610,613],{"class":183,"line":250},[181,609,253],{"class":187},[181,611,612],{"class":198},"'0.0.1'",[181,614,214],{"class":187},[181,616,617,619],{"class":183,"line":261},[181,618,264],{"class":187},[181,620,621],{"class":198},"'both'\n",[181,623,624],{"class":183,"line":272},[181,625,290],{"class":187},[135,627,629],{"id":628},"functionality","Functionality",[127,631,632,633,401],{},"The full API documentation can be found on ",[143,634,636],{"href":398,"rel":635},[147],"Blockbench Reference Docs",[292,638,639,653,661],{},[295,640,641,642,647,648,401],{},"In this case we are using an ",[143,643,646],{"href":644,"rel":645},"https:\u002F\u002Fweb.blockbench.net\u002Fdocs\u002Fclasses\u002Fgenerated_interface_actions.Action.html",[147],"Action"," to modify certain properties on a ",[143,649,652],{"href":650,"rel":651},"https:\u002F\u002Fweb.blockbench.net\u002Fdocs\u002Fclasses\u002Fcustom_cube.Cube.html",[147],"Cube",[295,654,655,656,660],{},"We use the ",[143,657,65],{"href":658,"rel":659},"https:\u002F\u002Fweb.blockbench.net\u002Fdocs\u002Fvariables\u002Fcustom_undo.Undo.html",[147]," API to register our changes.",[295,662,655,663,668],{},[143,664,667],{"href":665,"rel":666},"https:\u002F\u002Fweb.blockbench.net\u002Fdocs\u002Ffunctions\u002Fcustom_canvas.Canvas.updateView.html",[147],"updateView"," API to visually update the interface with our new changes",[135,670,672],{"id":671},"result","Result",[127,674,675],{},"If you have followed the steps above, you should end up with something like this:",[173,677,679],{"className":175,"code":678,"language":177,"meta":62,"style":62},"let button;\n\nPlugin.register('height_randomizer', {\n    title: 'Height Randomizer',\n    author: 'YourName',\n    description: 'This plugin can randomize the height of all selected cubes',\n    icon: 'bar_chart',\n    version: '0.0.1',\n    variant: 'both',\n    onload() {\n        button = new Action('randomize_height', {\n            name: 'Randomize Height',\n            description: 'Randomize the height of all selected elements',\n            icon: 'bar_chart',\n            click: function() {\n                Undo.initEdit({elements: Cube.selected});\n                Cube.selected.forEach(cube => {\n                    cube.to[1] = cube.from[0] + Math.floor(Math.random()*8);\n                });\n                Canvas.updateView({\n                    elements: Cube.selected,\n                    element_aspects: {geometry: true},\n                    selection: true\n                });\n                Undo.finishEdit('Randomize cube height');\n            }\n        });\n        MenuBar.menus.tools.addAction(button);\n    },\n    onunload() {\n        button.delete();\n    }\n});\n",[158,680,681,687,691,703,711,719,727,735,743,751,757,778,789,800,810,824,836,857,907,913,924,930,942,951,956,971,977,983,995,1000,1008,1020,1025],{"__ignoreMap":62},[181,682,683,685],{"class":183,"line":184},[181,684,421],{"class":420},[181,686,545],{"class":187},[181,688,689],{"class":183,"line":205},[181,690,415],{"emptyLinePlaceholder":414},[181,692,693,695,697,699,701],{"class":183,"line":217},[181,694,188],{"class":187},[181,696,192],{"class":191},[181,698,195],{"class":187},[181,700,567],{"class":198},[181,702,202],{"class":187},[181,704,705,707,709],{"class":183,"line":228},[181,706,208],{"class":187},[181,708,576],{"class":198},[181,710,214],{"class":187},[181,712,713,715,717],{"class":183,"line":239},[181,714,220],{"class":187},[181,716,585],{"class":198},[181,718,214],{"class":187},[181,720,721,723,725],{"class":183,"line":250},[181,722,242],{"class":187},[181,724,594],{"class":198},[181,726,214],{"class":187},[181,728,729,731,733],{"class":183,"line":261},[181,730,231],{"class":187},[181,732,603],{"class":198},[181,734,214],{"class":187},[181,736,737,739,741],{"class":183,"line":272},[181,738,253],{"class":187},[181,740,612],{"class":198},[181,742,214],{"class":187},[181,744,745,747,749],{"class":183,"line":281},[181,746,264],{"class":187},[181,748,267],{"class":198},[181,750,214],{"class":187},[181,752,753,755],{"class":183,"line":287},[181,754,275],{"class":191},[181,756,278],{"class":187},[181,758,760,763,765,768,771,773,776],{"class":183,"line":759},11,[181,761,762],{"class":187},"        button ",[181,764,454],{"class":420},[181,766,767],{"class":420}," new",[181,769,770],{"class":191}," Action",[181,772,195],{"class":187},[181,774,775],{"class":198},"'randomize_height'",[181,777,202],{"class":187},[181,779,781,784,787],{"class":183,"line":780},12,[181,782,783],{"class":187},"            name: ",[181,785,786],{"class":198},"'Randomize Height'",[181,788,214],{"class":187},[181,790,792,795,798],{"class":183,"line":791},13,[181,793,794],{"class":187},"            description: ",[181,796,797],{"class":198},"'Randomize the height of all selected elements'",[181,799,214],{"class":187},[181,801,803,806,808],{"class":183,"line":802},14,[181,804,805],{"class":187},"            icon: ",[181,807,603],{"class":198},[181,809,214],{"class":187},[181,811,813,816,819,822],{"class":183,"line":812},15,[181,814,815],{"class":191},"            click",[181,817,818],{"class":187},": ",[181,820,821],{"class":420},"function",[181,823,278],{"class":187},[181,825,827,830,833],{"class":183,"line":826},16,[181,828,829],{"class":187},"                Undo.",[181,831,832],{"class":191},"initEdit",[181,834,835],{"class":187},"({elements: Cube.selected});\n",[181,837,839,842,845,847,851,854],{"class":183,"line":838},17,[181,840,841],{"class":187},"                Cube.selected.",[181,843,844],{"class":191},"forEach",[181,846,195],{"class":187},[181,848,850],{"class":849},"s4XuR","cube",[181,852,853],{"class":420}," =>",[181,855,856],{"class":187}," {\n",[181,858,860,863,867,870,872,875,878,880,883,886,889,892,895,898,901,904],{"class":183,"line":859},18,[181,861,862],{"class":187},"                    cube.to[",[181,864,866],{"class":865},"sj4cs","1",[181,868,869],{"class":187},"] ",[181,871,454],{"class":420},[181,873,874],{"class":187}," cube.from[",[181,876,877],{"class":865},"0",[181,879,869],{"class":187},[181,881,882],{"class":420},"+",[181,884,885],{"class":187}," Math.",[181,887,888],{"class":191},"floor",[181,890,891],{"class":187},"(Math.",[181,893,894],{"class":191},"random",[181,896,897],{"class":187},"()",[181,899,900],{"class":420},"*",[181,902,903],{"class":865},"8",[181,905,906],{"class":187},");\n",[181,908,910],{"class":183,"line":909},19,[181,911,912],{"class":187},"                });\n",[181,914,916,919,921],{"class":183,"line":915},20,[181,917,918],{"class":187},"                Canvas.",[181,920,667],{"class":191},[181,922,923],{"class":187},"({\n",[181,925,927],{"class":183,"line":926},21,[181,928,929],{"class":187},"                    elements: Cube.selected,\n",[181,931,933,936,939],{"class":183,"line":932},22,[181,934,935],{"class":187},"                    element_aspects: {geometry: ",[181,937,938],{"class":865},"true",[181,940,941],{"class":187},"},\n",[181,943,945,948],{"class":183,"line":944},23,[181,946,947],{"class":187},"                    selection: ",[181,949,950],{"class":865},"true\n",[181,952,954],{"class":183,"line":953},24,[181,955,912],{"class":187},[181,957,959,961,964,966,969],{"class":183,"line":958},25,[181,960,829],{"class":187},[181,962,963],{"class":191},"finishEdit",[181,965,195],{"class":187},[181,967,968],{"class":198},"'Randomize cube height'",[181,970,906],{"class":187},[181,972,974],{"class":183,"line":973},26,[181,975,976],{"class":187},"            }\n",[181,978,980],{"class":183,"line":979},27,[181,981,982],{"class":187},"        });\n",[181,984,986,989,992],{"class":183,"line":985},28,[181,987,988],{"class":187},"        MenuBar.menus.tools.",[181,990,991],{"class":191},"addAction",[181,993,994],{"class":187},"(button);\n",[181,996,998],{"class":183,"line":997},29,[181,999,465],{"class":187},[181,1001,1003,1006],{"class":183,"line":1002},30,[181,1004,1005],{"class":191},"    onunload",[181,1007,278],{"class":187},[181,1009,1011,1014,1017],{"class":183,"line":1010},31,[181,1012,1013],{"class":187},"        button.",[181,1015,1016],{"class":191},"delete",[181,1018,1019],{"class":187},"();\n",[181,1021,1023],{"class":183,"line":1022},32,[181,1024,284],{"class":187},[181,1026,1028],{"class":183,"line":1027},33,[181,1029,290],{"class":187},[130,1031,1033],{"id":1032},"submitting-your-plugin","Submitting your plugin",[127,1035,1036,1037,401],{},"For testing or internal use you can load the plugin from the file. If you think your plugin can be useful for a larger group of users, you can submit it to the ",[143,1038,1041],{"href":1039,"rel":1040},"https:\u002F\u002Fwww.github.com\u002FJannisX11\u002Fblockbench-plugins",[147],"blockbench-plugins repository",[127,1043,1044],{},"To submit a plugin, fork the repository and add your plugin to the \u002Fplugins folder. Then add your plugin to the plugins.json file using the same ID and metadata as in your plugin file. When you are done, create a pull request and wait for it to be merged. Use the same process to submit updates and changes to your plugin.",[127,1046,1047,1048,1053],{},"Please make sure to read the submission requirements in ",[143,1049,1052],{"href":1050,"rel":1051},"https:\u002F\u002Fgithub.com\u002FJannisX11\u002Fblockbench-plugins#readme",[147],"README.md"," before submitting your plugin.",[1055,1056,1057],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":62,"searchDepth":205,"depth":217,"links":1059},[1060,1066,1071],{"id":132,"depth":205,"text":133,"children":1061},[1062,1063,1064,1065],{"id":137,"depth":217,"text":138},{"id":152,"depth":217,"text":153},{"id":477,"depth":217,"text":478},{"id":508,"depth":217,"text":509},{"id":515,"depth":205,"text":516,"children":1067},[1068,1069,1070],{"id":522,"depth":217,"text":523},{"id":628,"depth":217,"text":629},{"id":671,"depth":217,"text":672},{"id":1032,"depth":205,"text":1033},"md",{},{"title":50,"description":52},"docs\u002Fplugin","o1njWG6IGPcBjJl5Fn6Nu4uDq29UBbBlmnUv_Nv-OXo",1776013264586]