+
+
+
diff --git a/assets/css/0.styles.c3e38df3.css b/assets/css/0.styles.c3e38df3.css
new file mode 100644
index 000000000..0ec167b69
--- /dev/null
+++ b/assets/css/0.styles.c3e38df3.css
@@ -0,0 +1 @@
+code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;-webkit-user-select:none;user-select:none;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#3eaf7c;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/TouhouLittleMaid/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.page .theme-default-content[data-v-15b7b770]:not(.custom){max-width:80%}.page blockquote[data-v-15b7b770]{border-left:5px solid #96b946;margin-bottom:.8rem;padding:5px 15px;color:#656565;background-color:#f2f2f2;border-top-right-radius:2px;border-bottom-right-radius:2px}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-759a7d02]{display:none}.theme-code-block__active[data-v-759a7d02]{display:block}.theme-code-block>pre[data-v-759a7d02]{background-color:orange}.page .theme-default-content[data-v-deefee04]:not(.custom){max-width:80%}.page blockquote[data-v-deefee04]{border-left:5px solid #96b946;margin-bottom:.8rem;padding:5px 15px;color:#656565;background-color:#f2f2f2;border-top-right-radius:2px;border-bottom-right-radius:2px}.theme-code-group__nav[data-v-deefee04]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-deefee04]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-deefee04]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-deefee04]{border-bottom:1px solid #42b983}.pre-blank[data-v-deefee04]{color:#42b983}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.page .theme-default-content:not(.custom){max-width:80%}.page blockquote{border-left:5px solid #96b946;margin-bottom:.8rem;padding:5px 15px;color:#656565;background-color:#f2f2f2;border-top-right-radius:2px;border-bottom-right-radius:2px}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}
\ No newline at end of file
diff --git a/assets/img/search.83621669.svg b/assets/img/search.83621669.svg
new file mode 100644
index 000000000..03d83913e
--- /dev/null
+++ b/assets/img/search.83621669.svg
@@ -0,0 +1 @@
+
diff --git a/assets/js/1.e6d3c32f.js b/assets/js/1.e6d3c32f.js
new file mode 100644
index 000000000..39ce33cdb
--- /dev/null
+++ b/assets/js/1.e6d3c32f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[1,12,14,19,20,21],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return k}));n(90);const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=a(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return a(t.path)===a(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function k(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var s=n(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(14),o=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},242:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},247:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var s=n(241),i=n(242),r=n(91),o=n.n(r),a={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},257:function(t,e,n){"use strict";n(247)},258:function(t,e,n){},265:function(t,e,n){"use strict";n.r(e);var s=n(254),i=n(239),r={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:s.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,s=this.$site.themeConfig.locales||{},i={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(i=>{const r=t[i],o=s[i]&&s[i].label||r.lang;let a;return r.lang===this.$lang?a=e:(a=e.replace(this.$localeConfig.path,i),n.some(t=>t.path===a)||(a=i)),{text:o,link:a}})};return[...this.userNav,i]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n{let s=i()(e,"title","");return i()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var a={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let o=0;o=n);o++){const a=e[o];if(this.getPageLocalePath(a)===s&&this.isSearchable(a))if(r(t,a))i.push(a);else if(a.headers)for(let e=0;e=n);e++){const n=a.headers[e];n.title&&r(t,a,n.title)&&i.push(Object.assign({},a,{path:a.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,c=n(283),h=n(265);function f(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var p={name:"Navbar",components:{SidebarButton:c.default,NavLinks:h.default,SearchBox:u,AlgoliaSearchBox:{}},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(f(this.$el,"paddingLeft"))+parseInt(f(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},d=(n(290),Object(l.a)(p,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=d.exports}}]);
\ No newline at end of file
diff --git a/assets/js/10.da380764.js b/assets/js/10.da380764.js
new file mode 100644
index 000000000..94381b30e
--- /dev/null
+++ b/assets/js/10.da380764.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[10,3,12,14,18,19,21],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function b(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(14),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(243),n(14)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},245:function(t,e,n){},247:function(t,e,n){},250:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var i=n(266),s=n(255),r=n(239);function a(t,e){if("group"===e.type){const n=e.path&&Object(r.e)(t,e.path),i=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path));return n||i}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},254:function(t,e,n){"use strict";n.r(e);var i=n(241),s=n(242),r=n(91),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,n){"use strict";n.r(e);var i=n(239);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||b)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(252),n(14)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},257:function(t,e,n){"use strict";n(247)},263:function(t,e,n){"use strict";n(250)},264:function(t,e,n){},265:function(t,e,n){"use strict";n.r(e);var i=n(254),s=n(239),r={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},s={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(s=>{const r=t[s],a=i[s]&&i[s].label||r.lang;let o;return r.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,s),n.some(t=>t.path===o)||(o=s)),{text:a,link:o}})};return[...this.userNav,s]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(s.j)(t),{items:(t.items||[]).map(s.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/102.482c782e.js b/assets/js/102.482c782e.js
new file mode 100644
index 000000000..c4a3bf870
--- /dev/null
+++ b/assets/js/102.482c782e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{381:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/103.c5f2d849.js b/assets/js/103.c5f2d849.js
new file mode 100644
index 000000000..624b1e66c
--- /dev/null
+++ b/assets/js/103.c5f2d849.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{382:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/104.4c3ca6e1.js b/assets/js/104.4c3ca6e1.js
new file mode 100644
index 000000000..5c7df62d7
--- /dev/null
+++ b/assets/js/104.4c3ca6e1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{383:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/105.55ed8d36.js b/assets/js/105.55ed8d36.js
new file mode 100644
index 000000000..0bb3254c2
--- /dev/null
+++ b/assets/js/105.55ed8d36.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{384:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/106.917e4f04.js b/assets/js/106.917e4f04.js
new file mode 100644
index 000000000..8f19796a9
--- /dev/null
+++ b/assets/js/106.917e4f04.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{385:function(t,n,o){"use strict";o.r(n);var s=o(14),e=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Hãy đảm bào rằng phiên bản của Touhou Little Maid mà bạn đang dùng là bản mới nhất.")])])])}),[],!1,null,null,null);n.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/107.836420c2.js b/assets/js/107.836420c2.js
new file mode 100644
index 000000000..aa98678c5
--- /dev/null
+++ b/assets/js/107.836420c2.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{386:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/108.7cd5fa7c.js b/assets/js/108.7cd5fa7c.js
new file mode 100644
index 000000000..63df87dff
--- /dev/null
+++ b/assets/js/108.7cd5fa7c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{387:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/109.b93451cf.js b/assets/js/109.b93451cf.js
new file mode 100644
index 000000000..fef5c4217
--- /dev/null
+++ b/assets/js/109.b93451cf.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{388:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/11.72ae73cf.js b/assets/js/11.72ae73cf.js
new file mode 100644
index 000000000..86149c03a
--- /dev/null
+++ b/assets/js/11.72ae73cf.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[11,15,17],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return v})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(u(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function d(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},249:function(t,e,n){},259:function(t,e,n){"use strict";n(248)},260:function(t,e,n){var r=n(11),i=n(4),a=n(10);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},261:function(t,e,n){"use strict";n(249)},262:function(t,e,n){},267:function(t,e,n){"use strict";n.r(e);var r=n(246),i=n.n(r),a=n(239),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(259),n(14)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=u.exports},268:function(t,e,n){"use strict";n.r(e);n(90);var r=n(239),i=n(260),a=n.n(i),s=n(246),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.k)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;r")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("ore"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("blockGlass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("ore"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("sand"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("diamond_sword"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 可变参数的示例,这里仅写成一个合成的输入物品")]),s._v("\nAltar"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addItemCraftRecipe")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:craft_apple"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("touhou_little_maid"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("apple"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("ore"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("blockGlass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 生成女仆的合成添加")]),s._v("\nAltar"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMaidSpawnCraftRecipe")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"test:replace_maid"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.5")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("grass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("grass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("grass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 女仆手办复活的合成添加")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 这个合成只能书写 1-5 个物品,手办物品是直接强制内嵌在合成中的")]),s._v("\nAltar"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addMaidReviveCraftRecipe")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"test:reborn_maid"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("grass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("grass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("grass"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 其他生物的合成")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 第三个参数需要书写完整的实体 id")]),s._v("\nAltar"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("addEntitySpawnCraftRecipe")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"test:spawn_pig"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"minecraft:pig"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("stone"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("stone"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("minecraft"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("stone"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 删除合成,通过合成的 id 来删除合成,这也是为什么上面多次提到需要设置独立合成 id 的原因")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 只有一个参数,即合成的 id,只需要通过 JEI 就能查到模组自带合成的 id")]),s._v("\nAltar"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("removeRecipe")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:craft_camera"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/116.055322c8.js b/assets/js/116.055322c8.js
new file mode 100644
index 000000000..e9a8603da
--- /dev/null
+++ b/assets/js/116.055322c8.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{395:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"自定义-javascript-动画"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#自定义-javascript-动画"}},[t._v("#")]),t._v(" 自定义 JavaScript 动画")]),t._v(" "),e("p",[t._v("通过 JavaScript 文件,你可以为女仆或坐垫添加自定义动画。")]),t._v(" "),e("ul",[e("li",[t._v("本 wiki 适用于 Touhou Little Maid 模组 "),e("code",[t._v("1.12.2")]),t._v(" 和 "),e("code",[t._v("1.16.5")]),t._v(" 版本;")]),t._v(" "),e("li",[t._v("需要对 JavaScript 基本语法有简单的了解;")]),t._v(" "),e("li",[t._v("需要高中及以上数学知识,尤其是对三角函数和极坐标的理解。")]),t._v(" "),e("li",[t._v("文本编辑软件推荐 VSCode,相关文本文件均需要用 UTF-8 无 BOM 编码进行存储。")])]),t._v(" "),e("h2",{attrs:{id:"基本格式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#基本格式"}},[t._v("#")]),t._v(" 基本格式")]),t._v(" "),e("p",[t._v("动画脚本放置在文件夹任意位置均可,只需要在对应模型字段处声明动画文件位置即可。 我建议将它放入 "),e("code",[t._v("animation")]),t._v(" 文件夹中。")]),t._v(" "),e("p",[t._v("下面是通用模板:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 当你需要使用 GlWrapper 时才需要声明这一段代码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity 需要应用动画的实体对象\n * @param limbSwing 实体在行走过程中的速度(可以理解为汽车的速度表)\n * @param limbSwingAmount 实体行走的总里程数(可以理解为汽车的里程表)\n * @param ageInTicks 实体的 tick 时间,一个从 0 开始一直增加的数值\n * @param netHeadYaw 实体头部的偏航\n * @param headPitch 实体头部的俯仰\n * @param scale 实体缩放参数,默认为 0.0625,未发现任何使用的地方\n * @param modelMap 为一个 map,存储了该模型所有的骨骼\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 相关动画的书写")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("这里我们举一个简单的例子,当前模型有一个带有名为 "),e("code",[t._v("rotation")]),t._v(" 的骨骼,我们想要把让这个骨骼绕着 X 轴持续的做旋转运动,运动的速度大约为每 tick 1 度(也就是 18 秒转一圈),我们可以这样写动画。")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 当你需要使用 GlWrapper 时才需要声明这一段代码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 先从 modelMap 中尝试获取名为 rotation 的骨骼")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 以防万一,我们做个简单的判定,确保此骨骼一定存在")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 通过骨骼的 setRotateAngleX 函数设置其 X 轴角度")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks 为实体的 tick 时间,一个从 0 开始一直增加的数值")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 通过取余运算(也就是 % 符号)将这个数限定在 0~360 之间")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 因为该方法只接收弧度值,所以需要乘以 0.017453292 转换成对应弧度")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这样我们就实现了每 tick 旋转 1 度的动画")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("现在我们再进行一个更加复杂的运动,我们有一个名为 "),e("code",[t._v("wing")]),t._v(" 的骨骼,我们想要其能够持续的来回摆动。")]),t._v(" "),e("p",[t._v("摆动围绕 Y 轴,摆动角度在 "),e("code",[t._v("-20°~40°")]),t._v(" 之间,每 5 秒做一次完整的往复运动。")]),t._v(" "),e("p",[t._v("这一块恰好需要用到高中所学的三角函数知识,这一块选取正弦或者余弦均可,我们使用正弦函数。")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 当你需要使用 GlWrapper 时才需要声明这一段代码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 先从 modelMap 中尝试获取名为 wing 的骨骼")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 以防万一,我们做个简单的判定,确保此骨骼一定存在")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 每 5 秒完整的往复一次,也就是 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 通过乘法和求余来实现这个功能")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 这一块调用了 JavaScript 的 Math 函数")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 构建正弦函数,获得数值为 -20~40 的周期函数")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 最后进行参数的应用")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("其他复杂的运动均可通过相关函数来实现。")]),t._v(" "),e("h2",{attrs:{id:"游戏内热重载功能"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#游戏内热重载功能"}},[t._v("#")]),t._v(" 游戏内热重载功能")]),t._v(" "),e("p",[t._v("因为干巴巴的函数式并不能确定该动画是否表现正确,我们添加了游戏内的动画热重载功能。")]),t._v(" "),e("p",[t._v("加载模型资源包后,只需使用以下命令即可重新加载所有动画数据。")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"函数文档"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#函数文档"}},[t._v("#")]),t._v(" 函数文档")]),t._v(" "),e("p",[t._v("删除线样式的表示此函数已在 1.16 中被废弃,你可以访问"),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("此处连接"),e("OutboundLink")],1),t._v("查看源码 API。")]),t._v(" "),e("h3",{attrs:{id:"实体参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#实体参数"}},[t._v("#")]),t._v(" 实体参数")]),t._v(" "),e("p",[t._v("依据附加动画的对象不同,"),e("code",[t._v("entity")]),t._v(" 参数可用的函数也不相同。")]),t._v(" "),e("h4",{attrs:{id:"女仆"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#女仆"}},[t._v("#")]),t._v(" 女仆")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("函数名")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("返回值")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("备注")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆穿戴头盔后,返回 "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆穿戴胸甲后,返回 "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆穿戴护腿后,返回 "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆穿戴靴子后,返回 "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当女仆佩戴头盔后,返回头盔物品的注册名称。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当女仆佩戴胸甲后,返回胸甲物品的注册名称。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当女仆佩戴护腿后,返回护腿物品的注册名称。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当女仆佩戴靴子后,返回头盔物品的注册名称。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆是否处于祈求模式")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆是否处于骑乘模式")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆是否处于待命模式")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("女仆是否携带手推车或其他实体。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取女仆的生命值")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取女仆的最大生命值")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取一个固定值,每个实体都是不同的,类似于该实体的 UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"坐垫"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#坐垫"}},[t._v("#")]),t._v(" 坐垫")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("函数名")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("返回值")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("备注")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("坐垫是否被玩家所坐")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("坐垫是否有乘客")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取一个固定值,每个实体都是不同的,类似于该实体的 UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"世界"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#世界"}},[t._v("#")]),t._v(" 世界")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("函数名")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("返回值")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("备注")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取当前世界的时间(tick,0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当前世界是否为白天")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当前世界是否为黑夜")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当前世界是否在降雨")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("当前世界是否处于雷雨中")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-和-limbswingamount-参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-和-limbswingamount-参数"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" 和 "),e("code",[t._v("limbSwingAmount")]),t._v(" 参数")]),t._v(" "),e("p",[t._v("这些都是浮点数,"),e("code",[t._v("limbSwing")]),t._v("是实体的行走速度(可以将其视为汽车的速度计),"),e("code",[t._v("limbSwingAmount")]),t._v("是实体的总行走距离(可以将其视为汽车的里程表)。")]),t._v(" "),e("p",[t._v("这两个数据主要用于腿部和肢体的旋转,Minecraft原版使用这两个基本数据来计算手臂和腿部摆动的动画。")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("改变值"),e("code",[t._v("0.6662")]),t._v("将控制摆动的频率,乘以公式的系数 (例如,腿部使用"),e("code",[t._v("1.4")]),t._v("作为系数) 来改变摆动的幅度。")]),t._v(" "),e("p",[t._v("使用原版Minecraft的手臂和腿摆动公式可以使摆动动画更加自然。")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-参数"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" 参数")]),t._v(" "),e("p",[t._v("浮点数,一个从 0 开始每 tick 都会自加的变量,大多数动画中都会用到的自变量。")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-和-headpitch-参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-和-headpitch-参数"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" 和 "),e("code",[t._v("headPitch")]),t._v(" 参数")]),t._v(" "),e("p",[t._v("二者均为浮点数,单位为角度(这是原版 Minecraft 所设计的)。")]),t._v(" "),e("p",[t._v("通常此参数可以用作旋转角度,你只需要将其更改为弧度。")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("如果在此部分设置的系数大于'0.017453292',可能会出现一些错误问题。")])]),t._v(" "),e("h3",{attrs:{id:"scale-参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-参数"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" 参数")]),t._v(" "),e("p",[t._v("浮点数,固定为 0.0625。")]),t._v(" "),e("p",[t._v("一个含义不明的值。")]),t._v(" "),e("h3",{attrs:{id:"modelmap-参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-参数"}},[t._v("#")]),t._v(" modelMap 参数")]),t._v(" "),e("p",[t._v("一个使用字符串作为键的保存组的 Map。")]),t._v(" "),e("p",[t._v("您可以通过"),e("code",[t._v('modelMap.get("xxx")')]),t._v("获取相应的组。 如果没有与名称匹配的组,返回"),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("假设我们想获取目标组"),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("然后我们可以使用这个"),e("code",[t._v("head")]),t._v("组来设置各种参数,制作动画。")]),t._v(" "),e("p",[t._v("当然,为了预防起见,最好对该组进行检查,以确保它存在。")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 制作各种动画")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"组"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#组"}},[t._v("#")]),t._v(" 组")]),t._v(" "),e("p",[t._v("我们可以通过"),e("code",[t._v('modelMap.get("xxx")')]),t._v("获取各种组,以下是可用于获取到的组的函数列表。")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("函数名")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("返回值")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("备注")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组的 X 轴角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组的 Y 轴角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组的 Z 轴角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组的 X 轴坐标偏移")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组的 Y 轴坐标偏移")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组的 Z 轴坐标偏移")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("设置组是否隐藏")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取组的 X 轴角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取组的 Y 轴角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取组的 Z 轴角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取 ModelRenderer 的初始化 X 轴旋转角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取 ModelRenderer 的初始化 Y 轴旋转角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取 ModelRenderer 的初始化 Z 轴旋转角度")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取组的 X 轴坐标偏移")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取组的 Y 轴坐标偏移")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("获取组的 Z 轴坐标偏移")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("检查组是否隐藏")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("在脚本的最开头,我们使用了一个叫做 "),e("code",[t._v("GlWrapper")]),t._v(" 的工具,它可以进行各种平移、旋转和缩放操作。")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("函数名")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("返回值")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("备注")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("将实体移动至坐标 x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("以直线 "),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" 为轴,将其旋转 "),e("code",[t._v("angle")]),t._v(" 度。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("无")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("将实体在三条轴上缩放 x y z 倍")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/117.4b1a4e68.js b/assets/js/117.4b1a4e68.js
new file mode 100644
index 000000000..0d095ac34
--- /dev/null
+++ b/assets/js/117.4b1a4e68.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{396:function(t,_,a){"use strict";a.r(_);var r=a(14),v=Object(r.a)({},(function(){var t=this,_=t._self._c;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"自定义模型包"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#自定义模型包"}},[t._v("#")]),t._v(" 自定义模型包")]),t._v(" "),_("p",[t._v("Touhou Little Maid 模组支持自定义模型包,你可以通过 Blockbench 这样的软件快速制作你喜欢的模型。 游戏可以读取 zip 压缩文件格式的模型包,或者直接读取文件夹。")]),t._v(" "),_("p",[t._v("该模型包兼容的模组版本 "),_("code",[t._v("1.12.2")]),t._v(" 和 "),_("code",[t._v("1.16.5")]),t._v(" 完全相同,只是加载方法略有不同:")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("1.12.2")]),t._v(":模型包需要像原版资源包一样加载。")]),t._v(" "),_("li",[_("code",[t._v("1.16.5")]),t._v(":模型包需要放置在游戏目录下的 "),_("code",[t._v("tlm_custom_pack")]),t._v(" 文件夹中。")])]),t._v(" "),_("p",[t._v("即使你是新手,从零开始制作一个自定义模型包也不难。 你只需要以下免费软件:")]),t._v(" "),_("ul",[_("li",[_("p",[t._v("Blockbench: 一个由 "),_("code",[t._v("JannisX11")]),t._v(" 开发的专门用于 Minecraft 3D 建模的软件。")]),t._v(" "),_("p",[t._v("官方网站:"),_("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://blockbench.net/"),_("OutboundLink")],1)]),t._v(" "),_("p",[t._v("模组目前只支持基岩版模型格式,不支持基岩版动画文件。")])]),t._v(" "),_("li",[_("p",[t._v("Visual Studio Code:微软开发的一个集成开发环境软件。")]),t._v(" "),_("p",[t._v("官方网站:"),_("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://code.visualstudio.com/"),_("OutboundLink")],1)]),t._v(" "),_("p",[t._v("主要用于编辑语言文件,可选。")])])]),t._v(" "),_("p",[t._v("此外,我还编写了一个用于导出自定义模型包的 Blockbench 插件,仅适用于 Blockbench 4.0 版本")]),t._v(" "),_("p",[t._v("插件网站: "),_("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://page.cfpa.team/TLM-Utils-Plugins/"),_("OutboundLink")],1)]),t._v(" "),_("h1",{attrs:{id:"快速入门"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#快速入门"}},[t._v("#")]),t._v(" 快速入门")]),t._v(" "),_("p",[t._v("首先你需要了解如何使用 Blockbench,其次你需要安装 "),_("code",[t._v("tlm-utils")]),t._v(" 插件。"),_("br"),t._v("\n当一切完成后,你可以根据下面的说明开始制作一个模型包。")]),t._v(" "),_("h2",{attrs:{id:"_1-创建默认模型"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_1-创建默认模型"}},[t._v("#")]),t._v(" 1. 创建默认模型")]),t._v(" "),_("p",[t._v("创建一个默认模型,它将自动创建一个默认的基岩版模型,你可以在此基础上进行修改。"),_("br"),t._v("\n如果你选择 "),_("code",[t._v("坐垫")]),t._v(",没有默认模型。")]),t._v(" "),_("p",[_("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),t._v(" "),_("h2",{attrs:{id:"_2-基于默认模型-随心所欲的修改它"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_2-基于默认模型-随心所欲的修改它"}},[t._v("#")]),t._v(" 2. 基于默认模型,随心所欲的修改它")]),t._v(" "),_("p",[t._v("需要注意以下几点:")]),t._v(" "),_("ol",[_("li",[_("p",[t._v("女仆的动画是根据"),_("strong",[t._v("组名")]),t._v("自动添加的,所以请不要随意删除或重命名组名。")]),t._v(" "),_("blockquote",[_("p",[t._v("想知道哪些组名可用? 请查看 "),_("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("预设动画")]),t._v(" 篇章。")],1)]),t._v(" "),_("blockquote",[_("p",[t._v("你可以右击大纲界面打开预设动画菜单"),_("br"),t._v(" "),_("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),t._v(" "),_("li",[_("p",[t._v("注意组的子父级关系。")])]),t._v(" "),_("li",[_("p",[t._v("注意旋转点。")])])]),t._v(" "),_("h2",{attrs:{id:"_3-创建材质"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_3-创建材质"}},[t._v("#")]),t._v(" 3. 创建材质")]),t._v(" "),_("p",[t._v("你可以直接在 Blockbench 中编辑材质,或者通过其他图像编辑器编辑材质。")]),t._v(" "),_("p",[_("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),t._v(" "),_("h2",{attrs:{id:"_4-创建一个模型包"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_4-创建一个模型包"}},[t._v("#")]),t._v(" 4. 创建一个模型包")]),t._v(" "),_("p",[_("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),t._v(" "),_("h2",{attrs:{id:"_5-将模型导出到模型包"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_5-将模型导出到模型包"}},[t._v("#")]),t._v(" 5. 将模型导出到模型包")]),t._v(" "),_("p",[_("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),t._v(" "),_("h2",{attrs:{id:"_6-愉快的加载模型吧"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#_6-愉快的加载模型吧"}},[t._v("#")]),t._v(" 6. 愉快的加载模型吧!")])])}),[],!1,null,null,null);_.default=v.exports}}]);
\ No newline at end of file
diff --git a/assets/js/118.38082445.js b/assets/js/118.38082445.js
new file mode 100644
index 000000000..644252413
--- /dev/null
+++ b/assets/js/118.38082445.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{397:function(s,t,a){"use strict";a.r(t);var n=a(14),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"女仆模型包详解"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#女仆模型包详解"}},[s._v("#")]),s._v(" 女仆模型包详解")]),s._v(" "),t("ul",[t("li",[s._v("本 wiki 适用于 Touhou Little Maid 模组 "),t("code",[s._v("1.12.2")]),s._v(" 和 "),t("code",[s._v("1.16.5")]),s._v(" 最新版;")]),s._v(" "),t("li",[s._v("需要了解原版 Minecraft 的资源包结构;")]),s._v(" "),t("li",[s._v("需要了解 JSON 格式;")]),s._v(" "),t("li",[s._v("当前仅支持 "),t("strong",[s._v("1.10.0 和 1.12.0 版本基岩版模型")]),s._v(";")]),s._v(" "),t("li",[s._v("对于文本编辑软件,我们推荐使用 "),t("code",[s._v("Visual Studio Code")]),s._v(",所有的文件都需要以 "),t("code",[s._v("UTF-8 无 BOM")]),s._v(" 编码保存。")])]),s._v(" "),t("h2",{attrs:{id:"模型包结构"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#模型包结构"}},[s._v("#")]),s._v(" 模型包结构")]),s._v(" "),t("p",[s._v("为了更好地理解如何创建模型包,我们在此列出了模型包的结构")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("模型包文件夹\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br")])]),t("h2",{attrs:{id:"模型包描述文件"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#模型包描述文件"}},[s._v("#")]),s._v(" 模型包描述文件")]),s._v(" "),t("p",[s._v("文件完整的结构如下,只有标记为“(必须)”的部分才是必须的,你不必填写所有内容。")]),s._v(" "),t("p",[s._v("模型支持带有注释的 JSON 文件,请酌情使用。")]),s._v(" "),t("div",{staticClass:"language-json line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型包包名(必须)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"pack_name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Touhou Project Model Packs"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 作者列表")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"author"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"TartaricAcid"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SuccinicAcid"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型包的描述文本")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"description"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Default Model Packs"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型包的版本")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"version"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1.0.0"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型包的制作时间")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"date"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2019-07-14"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型包的图标,缺失此字段,材质包将没有图标")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"icon"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:textures/maid_icon.png"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型列表(必须)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_list"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型 id,不允许重复(必须)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:hakurei_reimu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型所在的位置,使用完整的资源地址")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型所使用的材质位置,使用完整的资源地址")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"texture"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 渲染成物品形态时的模型大小,默认为 1.0")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"render_item_scale"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.9")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 渲染成实体时的大小,范围为 0.2~2.0,默认为 1.0")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"render_entity_scale"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.75")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型名称")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Reimu Hakurei"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 该模型的描述文本")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"description"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Shrine Maiden of Hakurei"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 动画脚本,如果没有此字段,将会自动调用默认动画")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// tlm-utils 插件会自动依据组名生成对应的动画脚本引用")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"animation"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:animation/maid.default.js"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br")])]),t("p",[s._v("上面的示例列出了所有可用字段,只需要带有“(必须)”的字段,其余部分可以省略。")]),s._v(" "),t("p",[s._v("为了简单起见,你可以写一个像这样的文件:")]),s._v(" "),t("div",{staticClass:"language-json line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型包包名(必须)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"pack_name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Touhou Project Model Packs"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型列表(必须)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_list"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 模型 id,不允许重复(必须)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:hakurei_reimu"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("p",[s._v("如果我们不填写 "),t("code",[s._v("model")]),s._v(" 或 "),t("code",[s._v("texture")]),s._v(",它将基于 "),t("code",[s._v("model_id")]),s._v(" 选择默认的模型和材质。")]),s._v(" "),t("p",[s._v("比如上述案例中 "),t("code",[s._v("model_id")]),s._v(" 为 "),t("code",[s._v("touhou_little_maid:hakurei_reimu")]),s._v(",那么此时模型文件就为该资源域下的 "),t("code",[s._v("models/entity")]),s._v(" 文件夹下名为 "),t("code",[s._v("hakurei_reimu.json")]),s._v(" 的文件,材质就为该资源域下的 "),t("code",[s._v("textures/entity")]),s._v(" 文件夹下名为 "),t("code",[s._v("hakurei_reimu.png")]),s._v(" 的文件。")]),s._v(" "),t("p",[s._v("如果我们书写了 "),t("code",[s._v("model")]),s._v(" 或者 "),t("code",[s._v("texture")]),s._v(" 字段,那么其内容并无限制,你甚至可以调用其他模型包中的模型,只需要书写对资源地址即可。")]),s._v(" "),t("h2",{attrs:{id:"动态图标"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#动态图标"}},[s._v("#")]),s._v(" 动态图标")]),s._v(" "),t("p",[s._v("图标没有大小限制,支持静态图标和动态图标。")]),s._v(" "),t("p",[s._v("任意为 1:1 的图标均会被解析为静态图标。 不为 1:1 的长图,会以 0.1 秒的间隔逐次显示,从而形成动态图效果。")]),s._v(" "),t("blockquote",[t("p",[s._v("下图就为模组自带的图标,左侧被解析为静态图标,右侧被解析为动态图标")])]),s._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),s._v(" "),t("h2",{attrs:{id:"模型文件"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#模型文件"}},[s._v("#")]),s._v(" 模型文件")]),s._v(" "),t("ul",[t("li",[s._v("本模组使用基岩版 "),t("code",[s._v("1.10.0")]),s._v(" 或 "),t("code",[s._v("1.12.0")]),s._v(" JSON 文件来进行模型的加载,该文件可以通过建模软件 "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Blockbench"),t("OutboundLink")],1),s._v(" 直接导出,不需要对其做任何修改。")]),s._v(" "),t("li",[s._v("我们提供了许多预设动画,你只需要创建一个特殊名称的组,那么插件就会在导出模型是依据组名生成对应的动画脚本引用。 想要了解所有可用动画,请查看 "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[s._v("预设动画")]),s._v(" 篇章。")],1),s._v(" "),t("li",[s._v("模型也支持 JavaScript 自定义动画,你可以在自定义动画章节中找到对应介绍。")])]),s._v(" "),t("h2",{attrs:{id:"国际化"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#国际化"}},[s._v("#")]),s._v(" 国际化")]),s._v(" "),t("p",[s._v("作为一个面向国际化的游戏,模型包的部分内容自然也兼容国际化。")]),s._v(" "),t("ul",[t("li",[s._v("模型包中的 "),t("code",[s._v("pack_name")]),s._v(" 和 "),t("code",[s._v("description")]),s._v(" 字段支持国际化;")]),s._v(" "),t("li",[s._v("模型列表的 "),t("code",[s._v("name")]),s._v(" 和 "),t("code",[s._v("description")]),s._v(" 字段支持国际化。")])]),s._v(" "),t("p",[s._v("国际化的添加方式很简单,只需要书写以 "),t("code",[s._v("{")]),s._v(" 开头,"),t("code",[s._v("}")]),s._v(" 结尾的字符串即可,中间部分为语言文件的 Key,而后书写对应语言文件即可。")]),s._v(" "),t("p",[s._v("比如我们书写了如下的内容(只截取了一小段)")]),s._v(" "),t("div",{staticClass:"language-json line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"pack_name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{pack.vanilla_touhou_model.name}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"description"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{pack.vanilla_touhou_model.desc}"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("而后在模型包资源域下的 "),t("code",[s._v("lang")]),s._v(" 文件夹下创建 "),t("code",[s._v("en_us.lang")]),s._v(" 文件,书写如下内容即可:")]),s._v(" "),t("div",{staticClass:"language-properties line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-properties"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[s._v("pack.vanilla_touhou_model.name")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[s._v("Vanilla Touhou Model")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[s._v("pack.vanilla_touhou_model.desc")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[s._v("Default Model Packs")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("我们只添加了英文文件,如果还想再支持中文,创建 "),t("code",[s._v("zh_cn.lang")]),s._v(" 文件书写如下内容即可:")]),s._v(" "),t("div",{staticClass:"language-properties line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-properties"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[s._v("pack.vanilla_touhou_model.name")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[s._v("原版东方资源包")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[s._v("pack.vanilla_touhou_model.desc")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[s._v("默认的模型包")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("在前面的案例中,如果我们没有书写 "),t("code",[s._v("name")]),s._v(" 字段,那么系统会依据 "),t("code",[s._v("model_id")]),s._v(" 自动生成本地化 key,比如 "),t("code",[s._v("model_id")]),s._v(" 为 "),t("code",[s._v("touhou_little_maid:cushion")]),s._v(",那么生成的语言文件 key 为 "),t("code",[s._v("model.touhou_little_maid.cushion.name")]),s._v("。")]),s._v(" "),t("p",[t("code",[s._v("description")]),s._v(" 字段默认不生成,需要自行主动书写。")]),s._v(" "),t("h2",{attrs:{id:"兼容性问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#兼容性问题"}},[s._v("#")]),s._v(" 兼容性问题")]),s._v(" "),t("p",[s._v("鉴于部分作者制作的模型比较特殊,与女仆本身拥有多种附加的外形显示不兼容。 此处专门对非标模型提供了适配的做法:")]),s._v(" "),t("table",[t("thead",[t("tr",[t("th",{staticStyle:{"text-align":"center"}},[s._v("问题")]),s._v(" "),t("th",{staticStyle:{"text-align":"center"}},[s._v("解决方法")])])]),s._v(" "),t("tbody",[t("tr",[t("td",{staticStyle:{"text-align":"center"}},[s._v("动画不协调")]),s._v(" "),t("td",{staticStyle:{"text-align":"center"}},[s._v("编写自定义 JavaScript 动画脚本")])]),s._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"center"}},[s._v("手臂持有物品位置不对")]),s._v(" "),t("td",{staticStyle:{"text-align":"center"}},[s._v("使用定位骨骼进行定位")])]),s._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"center"}},[s._v("禁止显示手部物品")]),s._v(" "),t("td",{staticStyle:{"text-align":"center"}},[s._v("只要 "),t("code",[s._v("armLeft")]),s._v(" 或者 "),t("code",[s._v("armRight")]),s._v(" 骨骼不存在,那么对应的手持物品就不会显示")])]),s._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"center"}},[s._v("背包位置不正确")]),s._v(" "),t("td",{staticStyle:{"text-align":"center"}},[s._v("使用定位骨骼进行定位")])]),s._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"center"}},[s._v("背包、拉杆箱、载具、扫帚,自定义头颅等位置兼容不对")]),s._v(" "),t("td",{staticStyle:{"text-align":"center"}},[s._v("采用如下书写关闭这些功能")])])])]),s._v(" "),t("div",{staticClass:"language-json line-numbers-mode"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("br"),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"pack_name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Touhou Project Pack"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_list"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:hakurei_reimu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"show_backpack"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 阻止背包的显示")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"show_custom_head"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 阻止女仆显示自定义头颅")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"show_hata"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 阻止旗指物的显示,在 1.16 中弃用")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"can_hold_trolley"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 阻止女仆持有拉杆箱,在 1.16 中弃用")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"can_hold_vehicle"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 阻止女仆持有载具,在 1.16 中弃用")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"can_riding_broom"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("false")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 阻止女仆骑乘扫帚,在 1.16 中弃用")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("h2",{attrs:{id:"女仆彩蛋"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#女仆彩蛋"}},[s._v("#")]),s._v(" 女仆彩蛋")]),s._v(" "),t("p",[s._v("我们添加了女仆命名彩蛋功能,特殊命名的女仆可以直接调用特定模型。")]),s._v(" "),t("p",[s._v("彩蛋的书写方式非常简单,模组会自动识别其为彩蛋模型,也不会出现在皮肤选择界面。")]),s._v(" "),t("h3",{attrs:{id:"普通彩蛋"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#普通彩蛋"}},[s._v("#")]),s._v(" 普通彩蛋")]),s._v(" "),t("p",[s._v("如下为普通命名彩蛋的书写方式。 普通命名彩蛋下,女仆只需要命名为下面 "),t("code",[s._v("tag")]),s._v(" 字段,就会调用该模型。")]),s._v(" "),t("div",{staticClass:"language-json line-numbers-mode"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("br"),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"pack_name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Touhou Project Model Pack"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_list"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:hakurei_reimu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"easter_egg"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"tag"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"IKUN~"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("h3",{attrs:{id:"加密彩蛋"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#加密彩蛋"}},[s._v("#")]),s._v(" 加密彩蛋")]),s._v(" "),t("p",[s._v("如下为加密彩蛋的书写方式。 加密彩蛋彩蛋下,女仆需要特定命名,该命名的 SHA-1 值为如下的 "),t("code",[s._v("tag")]),s._v(" 字段,才会调用该模型。")]),s._v(" "),t("p",[s._v("如下书写方式,当女仆命名为 "),t("code",[s._v("IKUN~")]),s._v(" 时,因为这个字符的 SHA-1 值为 "),t("code",[s._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),s._v(",符合 "),t("code",[s._v("tag")]),s._v(" 字段,会调用该模型。")]),s._v(" "),t("div",{staticClass:"language-json line-numbers-mode"},[t("div",{staticClass:"highlight-lines"},[t("br"),t("br"),t("br"),t("br"),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("div",{staticClass:"highlighted"},[s._v(" ")]),t("br"),t("br"),t("br")]),t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"pack_name"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Touhou Project Model Pack"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_list"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"model_id"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"touhou_little_maid:hakurei_reimu"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"easter_egg"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"encrypt"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[s._v('"tag"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("h2",{attrs:{id:"其他问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#其他问题"}},[s._v("#")]),s._v(" 其他问题")]),s._v(" "),t("h3",{attrs:{id:"贴图闪烁-z-fighting-问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#贴图闪烁-z-fighting-问题"}},[s._v("#")]),s._v(" 贴图闪烁(Z-fighting)问题")]),s._v(" "),t("p",[s._v("这是 OpenGL 本身的一个问题,我们在制作模型过程中使用了平面、或者是两个重合的立方体,就会出现此问题。")]),s._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),s._v(" "),t("p",[s._v("对于平面图形导致的问题,只为其中某一面附上材质,另一面留空可以解决此问题;对于两个重合几何体,只需要微移几何体,或者对重合部分的材质进行剔除即可。")]),s._v(" "),t("h3",{attrs:{id:"文件名大小写问题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#文件名大小写问题"}},[s._v("#")]),s._v(" 文件名大小写问题")]),s._v(" "),t("p",[s._v("在 Minecraft 中,所有文件名都必须是小写。")])])}),[],!1,null,null,null);t.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/119.82410d1e.js b/assets/js/119.82410d1e.js
new file mode 100644
index 000000000..2c10d9a59
--- /dev/null
+++ b/assets/js/119.82410d1e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{398:function(t,i,a){"use strict";a.r(i);var o=a(14),s=Object(o.a)({},(function(){var t=this,i=t._self._c;return i("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[i("h1",{attrs:{id:"预设动画"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#预设动画"}},[t._v("#")]),t._v(" 预设动画")]),t._v(" "),i("p",[t._v("模组内置了许多预设动画,你只需要:")]),t._v(" "),i("ol",[i("li",[t._v("在 Blockbench 中为想要添加动画的组设置正确的组名。")]),t._v(" "),i("li",[t._v("在 "),i("code",[t._v("maid_model.json")]),t._v(" 文件的 "),i("code",[t._v("animation")]),t._v(" 字段中调用正确的动画脚本引用。")])]),t._v(" "),i("blockquote",[i("p",[i("code",[t._v("tlm-utils")]),t._v(" 插件可以自动依据组名调用正确的动画脚本引用,你只需点击 "),i("code",[t._v("分析动画")]),t._v(" 按钮。 "),i("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),i("p",[t._v("Blockbech 插件提供了所有可用的预设动画,你可以右击大纲界面打开预设动画菜单"),i("br"),t._v(" "),i("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),i("h2",{attrs:{id:"定位组"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#定位组"}},[t._v("#")]),t._v(" 定位组")]),t._v(" "),i("p",[t._v("用于渲染定位,基于组的旋转点来的,组内可以为空。")]),t._v(" "),i("h3",{attrs:{id:"armleftpositioningbone"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),i("code",[t._v("armLeftPositioningBone")])]),t._v(" "),i("p",[t._v("左手物品的位置,其父组必须是 "),i("code",[t._v("armLeft")])]),t._v(" "),i("h3",{attrs:{id:"armrightpositioningbone"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),i("code",[t._v("armRightPositioningBone")])]),t._v(" "),i("p",[t._v("右手物品的位置,其父组必须是 "),i("code",[t._v("armRight")])]),t._v(" "),i("h3",{attrs:{id:"backpackpositioningbone"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),i("code",[t._v("backpackPositioningBone")])]),t._v(" "),i("p",[t._v("背包肩带位置,它必须位于根目录下")])])}),[],!1,null,null,null);i.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/12.4ef66142.js b/assets/js/12.4ef66142.js
new file mode 100644
index 000000000..33b4e7737
--- /dev/null
+++ b/assets/js/12.4ef66142.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[12,14,19,21],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return b})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return s.test(r)?t:r+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(14),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(243),n(14)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},247:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var i=n(241),r=n(242),s=n(91),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},257:function(t,e,n){"use strict";n(247)},265:function(t,e,n){"use strict";n.r(e);var i=n(254),r=n(239),s={name:"NavLinks",components:{NavLink:n(241).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},r={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(r=>{const s=t[r],a=i[r]&&i[r].label||s.lang;let o;return s.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,r),n.some(t=>t.path===o)||(o=r)),{text:a,link:o}})};return[...this.userNav,r]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(r.j)(t),{items:(t.items||[]).map(r.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e,t){Promise.all([Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,295,7)),Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,296,7))]).then(([a])=>{a=a.default;const{algoliaOptions:i={}}=e;a(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:{...i,facetFilters:["lang:"+t].concat(i.facetFilters||[])},handleSelected:(e,t,a)=>{const{pathname:i,hash:n}=new URL(a.url),r=i.replace(this.$site.base,"/"),s=decodeURIComponent(n);this.$router.push(`${r}${s}`)}}))})},update(e,t){this.$el.innerHTML='',this.initialize(e,t)}}},n=(a(288),a(14)),r=Object(n.a)(i,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/14.3eb9dfa2.js b/assets/js/14.3eb9dfa2.js
new file mode 100644
index 000000000..95ae75c9d
--- /dev/null
+++ b/assets/js/14.3eb9dfa2.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[14,19,21],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return b})),n.d(e,"j",(function(){return g}));n(90);const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(14),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},242:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(243),n(14)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},244:function(t,e,n){},251:function(t,e,n){"use strict";n(244)},254:function(t,e,n){"use strict";n.r(e);var i=n(241),r=n(242),s=n(91),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(251),n(14)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports}}]);
\ No newline at end of file
diff --git a/assets/js/15.df39777f.js b/assets/js/15.df39777f.js
new file mode 100644
index 000000000..77d5618f2
--- /dev/null
+++ b/assets/js/15.df39777f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{239:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return o})),e.d(n,"i",(function(){return a})),e.d(n,"f",(function(){return u})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return p})),e.d(n,"b",(function(){return l})),e.d(n,"e",(function(){return f})),e.d(n,"k",(function(){return h})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return v})),e.d(n,"j",(function(){return b}));e(90);const r=/#.*$/,i=/\.(md|html)$/,o=/\/$/,a=/^[a-z]+:/i;function s(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return a.test(t)}function c(t){return/^mailto:/.test(t)}function p(t){return/^tel:/.test(t)}function l(t){if(u(t))return t;const n=t.match(r),e=n?n[0]:"",i=s(t);return o.test(i)?t:i+".html"+e}function f(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return s(t.path)===s(n)}function h(t,n,e){if(u(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const o=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return h(e,n,r);if(Array.isArray(n))return Object.assign(h(e,n[0],r),{title:n[1]});{const o=n.children||[];return 0===o.length&&n.path?Object.assign(h(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:o.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function v(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,n){t.exports=function(t){return null==t}},249:function(t,n,e){},260:function(t,n,e){var r=e(11),i=e(4),o=e(10);t.exports=function(t){return"string"==typeof t||!i(t)&&o(t)&&"[object String]"==r(t)}},261:function(t,n,e){"use strict";e(249)},268:function(t,n,e){"use strict";e.r(n);e(90);var r=e(239),i=e(260),o=e.n(i),a=e(246),s=e.n(a),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return p(c.PREV,this)},next(){return p(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,n){return l(t,n,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,n){return l(t,n,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function p(t,{$themeConfig:n,$page:e,$route:i,$site:a,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:p,getPageLinkConfig:l}=t,f=p(n),h=l(e),d=s()(h)?f:h;return!1===d?void 0:o()(d)?Object(r.k)(a.pages,d,i.path):c(e,u)}function l(t,n,e){const r=[];!function t(n,e){for(let r=0,i=n.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},241:function(t,e,n){"use strict";n.r(e);var i=n(239),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},a=n(14),s=Object(a.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=s.exports},256:function(t,e,n){},269:function(t,e,n){"use strict";n(256)},280:function(t,e,n){"use strict";n.r(e);var i={name:"Home",components:{NavLink:n(241).default},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},r=(n(269),n(14)),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[e("header",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?e("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?e("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,(function(n,i){return e("div",{key:i,staticClass:"feature"},[e("h2",[t._v(t._s(n.title))]),t._v(" "),e("p",[t._v(t._s(n.details))])])})),0):t._e(),t._v(" "),e("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?e("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):e("Content",{staticClass:"footer",attrs:{"slot-key":"footer"}})],1)}),[],!1,null,null,null);e.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/17.13f9f737.js b/assets/js/17.13f9f737.js
new file mode 100644
index 000000000..affb29dac
--- /dev/null
+++ b/assets/js/17.13f9f737.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return b}));n(90);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function u(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function d(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,n){},259:function(t,e,n){"use strict";n(248)},267:function(t,e,n){"use strict";n.r(e);var i=n(246),r=n.n(i),a=n(239),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(259),n(14)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/18.6d3b94c1.js b/assets/js/18.6d3b94c1.js
new file mode 100644
index 000000000..07ed4beb8
--- /dev/null
+++ b/assets/js/18.6d3b94c1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return o})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function o(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(o(t))return t;const e=t.match(r),n=e?e[0]:"",i=u(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return u(t.path)===u(e)}function d(t,e,n){if(o(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},245:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},255:function(t,e,n){"use strict";n.r(e);var r=n(239);function i(t,e,n,r,i){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function a(t,e,n,s,u,o=1){return!e||o>u?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const c=Object(r.e)(s,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,c,e.level-1),a(t,e.children,n,s,u,o+1)])}))}var s={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:s,$themeConfig:u,$themeLocaleConfig:o},props:{item:c,sidebarDepth:l}}){const p=Object(r.e)(s,c.path),f="auto"===c.type?p||c.children.some(t=>Object(r.e)(s,c.basePath+"#"+t.slug)):p,d="external"===c.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,c.path,c.title||c.path):i(t,c.path,c.title||c.path,f),h=[e.frontmatter.sidebarDepth,l,o.sidebarDepth,u.sidebarDepth,1].find(t=>void 0!==t),b=o.displayAllHeaders||u.displayAllHeaders;if("auto"===c.type)return[d,a(t,c.children,c.basePath,s,h)];if((f||b)&&c.headers&&!r.d.test(c.path)){return[d,a(t,Object(r.c)(c.headers),c.path,s,h)]}return d}},u=(n(252),n(14)),o=Object(u.a)(s,void 0,void 0,!1,null,null,null);e.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/19.fd36e329.js b/assets/js/19.fd36e329.js
new file mode 100644
index 000000000..ffda4123f
--- /dev/null
+++ b/assets/js/19.fd36e329.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{240:function(t,e,n){},242:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},243:function(t,e,n){"use strict";n(240)}}]);
\ No newline at end of file
diff --git a/assets/js/2.6bfae921.js b/assets/js/2.6bfae921.js
new file mode 100644
index 000000000..519121cc0
--- /dev/null
+++ b/assets/js/2.6bfae921.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{245:function(t,e,a){},246:function(t,e){t.exports=function(t){return null==t}},248:function(t,e,a){},249:function(t,e,a){},250:function(t,e,a){},252:function(t,e,a){"use strict";a(245)},253:function(t,e,a){"use strict";a.r(e);var n=a(266),s=a(255),i=a(239);function r(t,e){if("group"===e.type){const a=e.path&&Object(i.e)(t,e.path),n=e.children.some(e=>"group"===e.type?r(t,e):"page"===e.type&&Object(i.e)(t,e.path));return a||n}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:n.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let a=0;a-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(i.e)(this.$route,t.regularPath)}}},l=a(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(a,n){return e("li",{key:n},["group"===a.type?e("SidebarGroup",{attrs:{item:a,open:n===t.openGroupIndex,collapsable:a.collapsable||a.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(n)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:a}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,a){"use strict";a.r(e);var n=a(239);function s(t,e,a,n,s){const i={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:n,"sidebar-link":!0}};return s>2&&(i.style={"padding-left":s+"rem"}),t("RouterLink",i,a)}function i(t,e,a,r,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(n.e)(r,a+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,a+"#"+e.slug,e.title,u,e.level-1),i(t,e.children,a,r,o,l+1)])}))}var r={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:a,$route:r,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(n.e)(r,u.path),d="auto"===u.type?p||u.children.some(t=>Object(n.e)(r,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,a){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[a,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,i(t,u.children,u.basePath,r,f)];if((d||b)&&u.headers&&!n.d.test(u.path)){return[h,i(t,Object(n.c)(u.headers),u.path,r,f)]}return h}},o=(a(252),a(14)),l=Object(o.a)(r,void 0,void 0,!1,null,null,null);e.default=l.exports},256:function(t,e,a){},259:function(t,e,a){"use strict";a(248)},260:function(t,e,a){var n=a(11),s=a(4),i=a(10);t.exports=function(t){return"string"==typeof t||!s(t)&&i(t)&&"[object String]"==n(t)}},261:function(t,e,a){"use strict";a(249)},262:function(t,e,a){},263:function(t,e,a){"use strict";a(250)},264:function(t,e,a){},266:function(t,e,a){"use strict";a.r(e);var n=a(239),s={name:"SidebarGroup",components:{DropdownTransition:a(242).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=a(253).default},methods:{isActive:n.e}},i=(a(263),a(14)),r=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=r.exports},267:function(t,e,a){"use strict";a.r(e);var n=a(246),s=a.n(n),i=a(239),r={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=s()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:a="",docsBranch:n="master",docsRepo:i=e}=this.$site.themeConfig;return t&&i&&this.$page.relativePath?this.createEditLink(e,i,a,n,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,a,n,s){if(/bitbucket.org/.test(e)){return e.replace(i.a,"")+"/src"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s+`?mode=edit&spa=0&at=${n}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(i.a,"")+"/-/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}return(i.i.test(e)?e:"https://github.com/"+e).replace(i.a,"")+"/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}}},o=(a(259),a(14)),l=Object(o.a)(r,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=l.exports},268:function(t,e,a){"use strict";a.r(e);a(90);var n=a(239),s=a(260),i=a.n(s),r=a(246),o=a.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(u.PREV,this)},next(){return c(u.NEXT,this)}}};const u={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:a,$route:s,$site:r,sidebarItems:l}){const{resolveLink:u,getThemeLinkConfig:c,getPageLinkConfig:p}=t,d=c(e),h=p(a),f=o()(h)?d:h;return!1===f?void 0:i()(f)?Object(n.k)(r.pages,f,s.path):u(a,l)}function p(t,e,a){const n=[];!function t(e,a){for(let n=0,s=e.length;n({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(o.l)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},u=a(14),c=Object(u.a)(l,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home"):e("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/20.dadc13e1.js b/assets/js/20.dadc13e1.js
new file mode 100644
index 000000000..6a6eeea4e
--- /dev/null
+++ b/assets/js/20.dadc13e1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{258:function(t,c,n){},270:function(t,c,n){"use strict";n(258)},283:function(t,c,n){"use strict";n.r(c);n(270);var i=n(14),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/21.e6ea6789.js b/assets/js/21.e6ea6789.js
new file mode 100644
index 000000000..3e9fcf537
--- /dev/null
+++ b/assets/js/21.e6ea6789.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{239:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return u})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return l})),e.d(n,"h",(function(){return c})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"k",(function(){return p})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return b})),e.d(n,"j",(function(){return m}));e(90);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,u=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return u.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=o(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return o(t.path)===o(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function b(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},241:function(t,n,e){"use strict";e.r(n);var r=e(239),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(14),u=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=u.exports}}]);
\ No newline at end of file
diff --git a/assets/js/22.d6dd6838.js b/assets/js/22.d6dd6838.js
new file mode 100644
index 000000000..f7a75f0ae
--- /dev/null
+++ b/assets/js/22.d6dd6838.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{304:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/23.7644efef.js b/assets/js/23.7644efef.js
new file mode 100644
index 000000000..60b300d29
--- /dev/null
+++ b/assets/js/23.7644efef.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{303:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/24.49d67207.js b/assets/js/24.49d67207.js
new file mode 100644
index 000000000..10e369401
--- /dev/null
+++ b/assets/js/24.49d67207.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{305:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/25.50f2775a.js b/assets/js/25.50f2775a.js
new file mode 100644
index 000000000..97caaafbe
--- /dev/null
+++ b/assets/js/25.50f2775a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{307:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/26.499b887e.js b/assets/js/26.499b887e.js
new file mode 100644
index 000000000..7252b243b
--- /dev/null
+++ b/assets/js/26.499b887e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{306:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench.\nThe game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/27.da876177.js b/assets/js/27.da876177.js
new file mode 100644
index 000000000..e67210279
--- /dev/null
+++ b/assets/js/27.da876177.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{308:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/28.8c9cd3e7.js b/assets/js/28.8c9cd3e7.js
new file mode 100644
index 000000000..8d7005688
--- /dev/null
+++ b/assets/js/28.8c9cd3e7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{309:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/29.cc520228.js b/assets/js/29.cc520228.js
new file mode 100644
index 000000000..868f8ae68
--- /dev/null
+++ b/assets/js/29.cc520228.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{310:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/3.fb24add6.js b/assets/js/3.fb24add6.js
new file mode 100644
index 000000000..fa29bc748
--- /dev/null
+++ b/assets/js/3.fb24add6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[3,18,19],{239:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(90);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},240:function(t,e,n){},242:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(243),n(14)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},243:function(t,e,n){"use strict";n(240)},245:function(t,e,n){},250:function(t,e,n){},252:function(t,e,n){"use strict";n(245)},253:function(t,e,n){"use strict";n.r(e);var r=n(266),i=n(255),s=n(239);function a(t,e){if("group"===e.type){const n=e.path&&Object(s.e)(t,e.path),r=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path));return n||r}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(14),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},255:function(t,e,n){"use strict";n.r(e);var r=n(239);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(252),n(14)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},263:function(t,e,n){"use strict";n(250)},266:function(t,e,n){"use strict";n.r(e);var r=n(239),i={name:"SidebarGroup",components:{DropdownTransition:n(242).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(253).default},methods:{isActive:r.e}},s=(n(263),n(14)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/30.17a0565d.js b/assets/js/30.17a0565d.js
new file mode 100644
index 000000000..0251461f5
--- /dev/null
+++ b/assets/js/30.17a0565d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{311:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/31.e94ebe66.js b/assets/js/31.e94ebe66.js
new file mode 100644
index 000000000..b3d57db39
--- /dev/null
+++ b/assets/js/31.e94ebe66.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{312:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/32.88b02eea.js b/assets/js/32.88b02eea.js
new file mode 100644
index 000000000..9b85c2cf7
--- /dev/null
+++ b/assets/js/32.88b02eea.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{313:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/33.11481b20.js b/assets/js/33.11481b20.js
new file mode 100644
index 000000000..a7c533997
--- /dev/null
+++ b/assets/js/33.11481b20.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{314:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/34.1eda958d.js b/assets/js/34.1eda958d.js
new file mode 100644
index 000000000..ecf7c70c7
--- /dev/null
+++ b/assets/js/34.1eda958d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{315:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/35.7cb197fa.js b/assets/js/35.7cb197fa.js
new file mode 100644
index 000000000..02930ff25
--- /dev/null
+++ b/assets/js/35.7cb197fa.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{316:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/36.25bab098.js b/assets/js/36.25bab098.js
new file mode 100644
index 000000000..818c7194a
--- /dev/null
+++ b/assets/js/36.25bab098.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{317:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/37.730755ce.js b/assets/js/37.730755ce.js
new file mode 100644
index 000000000..7d3063e40
--- /dev/null
+++ b/assets/js/37.730755ce.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{318:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/38.0fa16594.js b/assets/js/38.0fa16594.js
new file mode 100644
index 000000000..28dbe59b1
--- /dev/null
+++ b/assets/js/38.0fa16594.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{319:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/39.8b7cd42f.js b/assets/js/39.8b7cd42f.js
new file mode 100644
index 000000000..0479feefc
--- /dev/null
+++ b/assets/js/39.8b7cd42f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{320:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/4.84e1e480.js b/assets/js/4.84e1e480.js
new file mode 100644
index 000000000..0586a1790
--- /dev/null
+++ b/assets/js/4.84e1e480.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{277:function(t,e,n){},291:function(t,e,n){"use strict";n(277)},302:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(291),n(14)),l=Object(p.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/40.275ac68b.js b/assets/js/40.275ac68b.js
new file mode 100644
index 000000000..2d3d0e937
--- /dev/null
+++ b/assets/js/40.275ac68b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{321:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/41.e3d6e8a1.js b/assets/js/41.e3d6e8a1.js
new file mode 100644
index 000000000..fbe629647
--- /dev/null
+++ b/assets/js/41.e3d6e8a1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{322:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/42.d05e0adc.js b/assets/js/42.d05e0adc.js
new file mode 100644
index 000000000..95e7ae8f5
--- /dev/null
+++ b/assets/js/42.d05e0adc.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{323:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/43.d762e602.js b/assets/js/43.d762e602.js
new file mode 100644
index 000000000..b67f8ddff
--- /dev/null
+++ b/assets/js/43.d762e602.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{324:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/44.2616b1bb.js b/assets/js/44.2616b1bb.js
new file mode 100644
index 000000000..4acd7287b
--- /dev/null
+++ b/assets/js/44.2616b1bb.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{325:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/45.3531f370.js b/assets/js/45.3531f370.js
new file mode 100644
index 000000000..23344c5d8
--- /dev/null
+++ b/assets/js/45.3531f370.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{326:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/46.f0a7df49.js b/assets/js/46.f0a7df49.js
new file mode 100644
index 000000000..2b249e92b
--- /dev/null
+++ b/assets/js/46.f0a7df49.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{327:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/47.91fbf833.js b/assets/js/47.91fbf833.js
new file mode 100644
index 000000000..c39dcebe3
--- /dev/null
+++ b/assets/js/47.91fbf833.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{328:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/48.180c583a.js b/assets/js/48.180c583a.js
new file mode 100644
index 000000000..4b4961bed
--- /dev/null
+++ b/assets/js/48.180c583a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{329:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/49.a14742c2.js b/assets/js/49.a14742c2.js
new file mode 100644
index 000000000..74db01e42
--- /dev/null
+++ b/assets/js/49.a14742c2.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{330:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/5.d1364975.js b/assets/js/5.d1364975.js
new file mode 100644
index 000000000..6a24baee1
--- /dev/null
+++ b/assets/js/5.d1364975.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{278:function(t,e,a){},292:function(t,e,a){"use strict";a(278)},298:function(t,e,a){"use strict";a.r(e);var s={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(292),a(14)),n=Object(i.a)(s,(function(){return(0,this._self._c)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/50.7daff065.js b/assets/js/50.7daff065.js
new file mode 100644
index 000000000..a3460df19
--- /dev/null
+++ b/assets/js/50.7daff065.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{331:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/51.6065ffcc.js b/assets/js/51.6065ffcc.js
new file mode 100644
index 000000000..93b013838
--- /dev/null
+++ b/assets/js/51.6065ffcc.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{332:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/52.b222be95.js b/assets/js/52.b222be95.js
new file mode 100644
index 000000000..739c209f6
--- /dev/null
+++ b/assets/js/52.b222be95.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{333:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/53.293f9b07.js b/assets/js/53.293f9b07.js
new file mode 100644
index 000000000..6a1088153
--- /dev/null
+++ b/assets/js/53.293f9b07.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{334:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/54.b0e13135.js b/assets/js/54.b0e13135.js
new file mode 100644
index 000000000..c8da6e10c
--- /dev/null
+++ b/assets/js/54.b0e13135.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{335:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/55.31cc900a.js b/assets/js/55.31cc900a.js
new file mode 100644
index 000000000..f82db599a
--- /dev/null
+++ b/assets/js/55.31cc900a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{336:function(t,n,o){"use strict";o.r(n);var s=o(14),e=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("使用している東方リトルメイドmodのバージョンが最新であることを確認してください。")])])])}),[],!1,null,null,null);n.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/56.5e3d6279.js b/assets/js/56.5e3d6279.js
new file mode 100644
index 000000000..41b1d8f34
--- /dev/null
+++ b/assets/js/56.5e3d6279.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{337:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"椅子モデルパックの詳細"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#椅子モデルパックの詳細"}},[t._v("#")]),t._v(" 椅子モデルパックの詳細")]),t._v(" "),s("ul",[s("li",[t._v("このwikiは "),s("code",[t._v("1.12.2")]),t._v(" または "),s("code",[t._v("1.16.5")]),t._v(" の最新バージョンのTouhou Little Maid modに適用されます。")]),t._v(" "),s("li",[t._v("バニラの Minecraft リソースパックの構造を理解する必要があります。")]),t._v(" "),s("li",[t._v("JSON 形式の理解が必要です。")]),t._v(" "),s("li",[t._v("現在、 "),s("strong",[t._v("1.10.0 または 1.12.0 Bedrock Edition Model")]),t._v(" のみをサポートしています。")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/57.7321eb56.js b/assets/js/57.7321eb56.js
new file mode 100644
index 000000000..2cf193485
--- /dev/null
+++ b/assets/js/57.7321eb56.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{338:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"祭壇レシピのカスタマイズ"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#祭壇レシピのカスタマイズ"}},[t._v("#")]),t._v(" 祭壇レシピのカスタマイズ")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("1.16.5では、祭壇のレシピを追加するためにデータパックを使用します")]),t._v(" "),s("p",[s("strong",[t._v("データパックの使用方法を理解している必要があります")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("この機能を使用する前に、 "),s("code",[t._v("CraftTweaker")]),t._v(" の基本的なスクリプト記述方法を理解していることを確認してください。")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/58.9e0f41e5.js b/assets/js/58.9e0f41e5.js
new file mode 100644
index 000000000..2ec6abc30
--- /dev/null
+++ b/assets/js/58.9e0f41e5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{339:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"javascriptアニメーションのカスタマイズ"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#javascriptアニメーションのカスタマイズ"}},[t._v("#")]),t._v(" JavaScriptアニメーションのカスタマイズ")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/59.966afbae.js b/assets/js/59.966afbae.js
new file mode 100644
index 000000000..746d2bb60
--- /dev/null
+++ b/assets/js/59.966afbae.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{340:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"モデルパックのカスタマイズ"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#モデルパックのカスタマイズ"}},[e._v("#")]),e._v(" モデルパックのカスタマイズ")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/6.95c348a6.js b/assets/js/6.95c348a6.js
new file mode 100644
index 000000000..9d63aa1f4
--- /dev/null
+++ b/assets/js/6.95c348a6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{279:function(e,t,a){},293:function(e,t,a){"use strict";a(279)},299:function(e,t,a){"use strict";a.r(t);var o={name:"CodeGroup",data:()=>({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(e){this.activateCodeTab(e)}},mounted(){this.loadTabs()},methods:{changeCodeTab(e){this.activeCodeTabIndex=e},loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.componentOptions)).map((e,t)=>(""===e.componentOptions.propsData.active&&(this.activeCodeTabIndex=t),{title:e.componentOptions.propsData.title,elm:e.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remove("theme-code-block__active")}),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},s=(a(293),a(14)),c=Object(s.a)(o,(function(){var e=this,t=e._self._c;return t("ClientOnly",[t("div",{staticClass:"theme-code-group"},[t("div",{staticClass:"theme-code-group__nav"},[t("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(a,o){return t("li",{key:a.title,staticClass:"theme-code-group__li"},[t("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(a.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?t("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/60.5709f945.js b/assets/js/60.5709f945.js
new file mode 100644
index 000000000..5f1e3ad61
--- /dev/null
+++ b/assets/js/60.5709f945.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{341:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"メイドモデルパックの詳細"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#メイドモデルパックの詳細"}},[t._v("#")]),t._v(" メイドモデルパックの詳細")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/61.b18d2b9d.js b/assets/js/61.b18d2b9d.js
new file mode 100644
index 000000000..0397c0468
--- /dev/null
+++ b/assets/js/61.b18d2b9d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{342:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"プリセット-アニメーション"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#プリセット-アニメーション"}},[t._v("#")]),t._v(" プリセット アニメーション")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/62.7fd8a141.js b/assets/js/62.7fd8a141.js
new file mode 100644
index 000000000..dbe489e43
--- /dev/null
+++ b/assets/js/62.7fd8a141.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{361:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/63.1e44899f.js b/assets/js/63.1e44899f.js
new file mode 100644
index 000000000..5e29feb88
--- /dev/null
+++ b/assets/js/63.1e44899f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{343:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/64.1c6ed2aa.js b/assets/js/64.1c6ed2aa.js
new file mode 100644
index 000000000..e405c00e5
--- /dev/null
+++ b/assets/js/64.1c6ed2aa.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{344:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/65.62babaf7.js b/assets/js/65.62babaf7.js
new file mode 100644
index 000000000..103dbf2cd
--- /dev/null
+++ b/assets/js/65.62babaf7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{345:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/66.5c90a2cd.js b/assets/js/66.5c90a2cd.js
new file mode 100644
index 000000000..448488a94
--- /dev/null
+++ b/assets/js/66.5c90a2cd.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{346:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/67.42819055.js b/assets/js/67.42819055.js
new file mode 100644
index 000000000..bbe3d461e
--- /dev/null
+++ b/assets/js/67.42819055.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{347:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/68.3e78b586.js b/assets/js/68.3e78b586.js
new file mode 100644
index 000000000..672709e82
--- /dev/null
+++ b/assets/js/68.3e78b586.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{348:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/69.5350aa84.js b/assets/js/69.5350aa84.js
new file mode 100644
index 000000000..537d433e0
--- /dev/null
+++ b/assets/js/69.5350aa84.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{399:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/7.c5b5bad4.js b/assets/js/7.c5b5bad4.js
new file mode 100644
index 000000000..fad0db45e
--- /dev/null
+++ b/assets/js/7.c5b5bad4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{300:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(14),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/70.9db89af0.js b/assets/js/70.9db89af0.js
new file mode 100644
index 000000000..fbb61c971
--- /dev/null
+++ b/assets/js/70.9db89af0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{400:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/71.7e9bbfc1.js b/assets/js/71.7e9bbfc1.js
new file mode 100644
index 000000000..487129679
--- /dev/null
+++ b/assets/js/71.7e9bbfc1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{349:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/72.4e39d762.js b/assets/js/72.4e39d762.js
new file mode 100644
index 000000000..9b3366b8c
--- /dev/null
+++ b/assets/js/72.4e39d762.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{350:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/73.71dad78a.js b/assets/js/73.71dad78a.js
new file mode 100644
index 000000000..60da6274c
--- /dev/null
+++ b/assets/js/73.71dad78a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{352:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/74.ec14dd66.js b/assets/js/74.ec14dd66.js
new file mode 100644
index 000000000..94cc86fd9
--- /dev/null
+++ b/assets/js/74.ec14dd66.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{351:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/75.078cb3ea.js b/assets/js/75.078cb3ea.js
new file mode 100644
index 000000000..ba4c00f58
--- /dev/null
+++ b/assets/js/75.078cb3ea.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{353:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/76.38455b18.js b/assets/js/76.38455b18.js
new file mode 100644
index 000000000..c7de23cb9
--- /dev/null
+++ b/assets/js/76.38455b18.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{354:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/77.7893c904.js b/assets/js/77.7893c904.js
new file mode 100644
index 000000000..cfc007a5f
--- /dev/null
+++ b/assets/js/77.7893c904.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{355:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button.\n"),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/78.069bbc60.js b/assets/js/78.069bbc60.js
new file mode 100644
index 000000000..8af558f1d
--- /dev/null
+++ b/assets/js/78.069bbc60.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{356:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Certifique-se de que a versão do mod Touhou Little Maid que você está usando é a mais recente.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/79.2611cbe5.js b/assets/js/79.2611cbe5.js
new file mode 100644
index 000000000..3dab8ccfe
--- /dev/null
+++ b/assets/js/79.2611cbe5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{357:function(t,e,s){"use strict";s.r(e);var a=s(14),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"chair-model-pack-detalhas"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-detalhas"}},[t._v("#")]),t._v(" Chair Model Pack Detalhas")]),t._v(" "),e("ul",[e("li",[t._v("Esta wiki se aplica ao mod Touhou Little Maid na versão mais recente "),e("code",[t._v("1.12.2")]),t._v(" ou "),e("code",[t._v("1.16.5")]),t._v(";")]),t._v(" "),e("li",[t._v("Requer compreensão da estrutura do pacote de recursos do Minecraft;")]),t._v(" "),e("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),e("li",[t._v("Currently only supports models for "),e("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),e("li",[t._v("For file editing software, we recommend "),e("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),e("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"model-packs-structure"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),e("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br")])]),e("h2",{attrs:{id:"model-packs-description-files"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),e("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),e("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),e("div",{staticClass:"language-json line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br"),e("span",{staticClass:"line-number"},[t._v("22")]),e("br"),e("span",{staticClass:"line-number"},[t._v("23")]),e("br"),e("span",{staticClass:"line-number"},[t._v("24")]),e("br"),e("span",{staticClass:"line-number"},[t._v("25")]),e("br"),e("span",{staticClass:"line-number"},[t._v("26")]),e("br"),e("span",{staticClass:"line-number"},[t._v("27")]),e("br"),e("span",{staticClass:"line-number"},[t._v("28")]),e("br"),e("span",{staticClass:"line-number"},[t._v("29")]),e("br"),e("span",{staticClass:"line-number"},[t._v("30")]),e("br"),e("span",{staticClass:"line-number"},[t._v("31")]),e("br"),e("span",{staticClass:"line-number"},[t._v("32")]),e("br"),e("span",{staticClass:"line-number"},[t._v("33")]),e("br"),e("span",{staticClass:"line-number"},[t._v("34")]),e("br"),e("span",{staticClass:"line-number"},[t._v("35")]),e("br"),e("span",{staticClass:"line-number"},[t._v("36")]),e("br"),e("span",{staticClass:"line-number"},[t._v("37")]),e("br"),e("span",{staticClass:"line-number"},[t._v("38")]),e("br"),e("span",{staticClass:"line-number"},[t._v("39")]),e("br"),e("span",{staticClass:"line-number"},[t._v("40")]),e("br"),e("span",{staticClass:"line-number"},[t._v("41")]),e("br"),e("span",{staticClass:"line-number"},[t._v("42")]),e("br"),e("span",{staticClass:"line-number"},[t._v("43")]),e("br"),e("span",{staticClass:"line-number"},[t._v("44")]),e("br"),e("span",{staticClass:"line-number"},[t._v("45")]),e("br"),e("span",{staticClass:"line-number"},[t._v("46")]),e("br"),e("span",{staticClass:"line-number"},[t._v("47")]),e("br"),e("span",{staticClass:"line-number"},[t._v("48")]),e("br"),e("span",{staticClass:"line-number"},[t._v("49")]),e("br"),e("span",{staticClass:"line-number"},[t._v("50")]),e("br"),e("span",{staticClass:"line-number"},[t._v("51")]),e("br")])]),e("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),e("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),e("div",{staticClass:"language-json line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br")])]),e("p",[t._v("If we do not fill the field for "),e("code",[t._v("model")]),t._v(" or "),e("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),e("code",[t._v("model_id")]),t._v(".")]),t._v(" "),e("p",[t._v("For the example above, "),e("code",[t._v("model_id")]),t._v(" is "),e("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),e("code",[t._v("cushion.json")]),t._v(" under "),e("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),e("code",[t._v("cushion.png")]),t._v(" under "),e("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("If we filled the field for "),e("code",[t._v("model")]),t._v(" or "),e("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),e("p",[e("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("X")]),t._v(" and "),e("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),e("code",[t._v("X")]),t._v(" and "),e("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),e("h2",{attrs:{id:"animated-icon"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),e("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),e("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),e("blockquote",[e("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),e("p",[e("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),e("h2",{attrs:{id:"model-files"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),e("ul",[e("li",[t._v("This mod is using JSON files in Bedrock "),e("code",[t._v("1.10.0")]),t._v(" or "),e("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),e("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),e("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),e("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),e("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),e("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),e("h2",{attrs:{id:"internationlization"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),e("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("pack_name")]),t._v(" and "),e("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),e("li",[e("code",[t._v("name")]),t._v(" and "),e("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),e("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),e("code",[t._v("{")]),t._v(" and end it using "),e("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),e("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),e("div",{staticClass:"language-json line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("p",[t._v("and then under model pack namespace, in the "),e("code",[t._v("lang")]),t._v(" folder we create "),e("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),e("div",{staticClass:"language-properties line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-properties"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),e("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),e("div",{staticClass:"language-properties line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-properties"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("p",[t._v("For the first example, if we did not fill the "),e("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),e("code",[t._v("model_id")]),t._v(", for example "),e("code",[t._v("model_id")]),t._v(" is "),e("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),e("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),e("p",[e("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/80.14d918d0.js b/assets/js/80.14d918d0.js
new file mode 100644
index 000000000..adebb47e2
--- /dev/null
+++ b/assets/js/80.14d918d0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{358:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/81.47c3e1dd.js b/assets/js/81.47c3e1dd.js
new file mode 100644
index 000000000..85af335c6
--- /dev/null
+++ b/assets/js/81.47c3e1dd.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{359:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/82.3af3eebd.js b/assets/js/82.3af3eebd.js
new file mode 100644
index 000000000..4182d4c8c
--- /dev/null
+++ b/assets/js/82.3af3eebd.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{360:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/83.4d63937f.js b/assets/js/83.4d63937f.js
new file mode 100644
index 000000000..0d04fe432
--- /dev/null
+++ b/assets/js/83.4d63937f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{362:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/84.358433c5.js b/assets/js/84.358433c5.js
new file mode 100644
index 000000000..52e0bf99d
--- /dev/null
+++ b/assets/js/84.358433c5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{363:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/85.ec9c12c4.js b/assets/js/85.ec9c12c4.js
new file mode 100644
index 000000000..3b8c861f6
--- /dev/null
+++ b/assets/js/85.ec9c12c4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{364:function(t,e,o){"use strict";o.r(e);var s=o(14),n=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Make sure the version of Touhou Little Maid mod you're using is the latest.")])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/86.58a726e0.js b/assets/js/86.58a726e0.js
new file mode 100644
index 000000000..f3fc88230
--- /dev/null
+++ b/assets/js/86.58a726e0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[86],{365:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"chair-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#chair-model-pack-details"}},[t._v("#")]),t._v(" Chair Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/87.4aa8465e.js b/assets/js/87.4aa8465e.js
new file mode 100644
index 000000000..fc14cfb54
--- /dev/null
+++ b/assets/js/87.4aa8465e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{366:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"custom-altar-recipes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#custom-altar-recipes"}},[t._v("#")]),t._v(" Custom Altar Recipes")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Please make sure you know how to use the Minecaft vanilla datapack")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Fixed type")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Entity type name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Additional NBT data for the entity")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The necessary power point required for crafting")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can write up to 6 parameters, is the ingredients for the recipe")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/88.997272f0.js b/assets/js/88.997272f0.js
new file mode 100644
index 000000000..791579c9d
--- /dev/null
+++ b/assets/js/88.997272f0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{367:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"custom-javascript-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#custom-javascript-animation"}},[t._v("#")]),t._v(" Custom JavaScript Animation")]),t._v(" "),e("p",[t._v("Through JavaScript files, you can add custom animations for maid or chair.")]),t._v(" "),e("ul",[e("li",[t._v("This wiki is suitable for Touhou Little Maid mod in "),e("code",[t._v("1.12.2")]),t._v(" and "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Basic understanding for JavaScript language;")]),t._v(" "),e("li",[t._v("Some high school mathematical knowledge, especially towards Trigonometric function and polar coordinates;")]),t._v(" "),e("li",[t._v("For editing script software, VSCode is recommended, all related script files requires to be saved using UTF-8 without BOM.")])]),t._v(" "),e("h2",{attrs:{id:"basic-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#basic-format"}},[t._v("#")]),t._v(" Basic Format")]),t._v(" "),e("p",[t._v("Animation script can be put in any location of the folder, you only need to call the file path on the corresponding models. I recommend putting it in the "),e("code",[t._v("animation")]),t._v(" folder.")]),t._v(" "),e("p",[t._v("Below is the general template:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Entity that requires the corresponding animation\n * @param limbSwing The walking speed of the entity (think of it as the speedometer of a car)\n * @param limbSwingAmount The total walking distance of the entity (think of it as the odometer of a car)\n * @param ageInTicks The tick time of an entity, the value that constantly increase from 0\n * @param netHeadYaw The yaw for the head of the entity\n * @param headPitch The pitch for the head of the entity\n * @param scale Param for scaling the entity, default is 0.0625, no use found.\n * @param modelMap The group of the model saved for a hashmap\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Script for the model")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Here we have a simple example, current model has a group named "),e("code",[t._v("rotation")]),t._v(" we want this group to make a rotational movement around the X axis, the movement speed is around 1 degree every tick (18 sec/r), we can write it as below.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'rotation' from modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through the function setRotateAngleX in the group, we set its X axis angle")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks is tick time for the entity, a value that constantly increases starting from 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Through remainder operator (which is % sign), set the value between 0~360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// And with that we achieved the animation of rotating 1 degree every tick")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Now we add another more complex motion, we have a group named "),e("code",[t._v("wing")]),t._v(", and we want a constant back and forth oscillating motion.")]),t._v(" "),e("p",[t._v("Oscillate around Y axis, at a degree between "),e("code",[t._v("-20°~40°")]),t._v(", and one cycle is completed every 5 second.")]),t._v(" "),e("p",[t._v("Trigonometry function fits our need, as you can use sine or cosine for this, we will be using sine function.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This call is only needed when you need to use GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First obtain a group named 'wing' from modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Just in case, we make a simple check to make sure this group existed")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// One complete cycle every 5 second, which is 100 tick")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Using multiplication and remainder operator we can achieve this requirement")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This is using the Math function in JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Construct sine function, and obtain a periodic function between -20°~40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Since this method only accepts radian, we need to multiply it by 0.017453292 to convert into radian")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("All other complex motion can be achieved through the related functions.")]),t._v(" "),e("h2",{attrs:{id:"hot-reload"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hot-reload"}},[t._v("#")]),t._v(" Hot Reload")]),t._v(" "),e("p",[t._v("Since you can't determine if the animation is correct just by looking at the functions, we added a function to hot reload the animation ingame.")]),t._v(" "),e("p",[t._v("After you load the model resource pack you made, just use the following command can reload all animation's data.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"function-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#function-documentation"}},[t._v("#")]),t._v(" Function Documentation")]),t._v(" "),e("p",[t._v("Strikethrough style means that the method is deprecated in 1.16, you can visit the "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("link here"),e("OutboundLink")],1),t._v(" to view the source code API.")]),t._v(" "),e("h3",{attrs:{id:"entity-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#entity-parameter"}},[t._v("#")]),t._v(" Entity Parameter")]),t._v(" "),e("p",[t._v("Depending on the target of the added animation, the function that can be used by "),e("code",[t._v("entity")]),t._v(" differs as well.")]),t._v(" "),e("h4",{attrs:{id:"maid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#maid"}},[t._v("#")]),t._v(" Maid")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears helmet, returns helmet item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears chestplate, returns chestplate item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears leggings, returns leggings item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("After maid wears boots, returns boots item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in begging mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("If maid is using arms, this function will return "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's swinging time")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in riding mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is in standby mode")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is carrying trolley or other entities")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding Marisa Broom")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is riding vehicle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid hold portable audio and play it")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing backpack")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's backpack level")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid wearing sasimono")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is swinging left or right arm, return "),e("code",[t._v("false")]),t._v(" if it's the right")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the left arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float[3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the right arm rotation data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the dimension where the maid is in")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's task, such as "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has mainhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid has offhand item")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid mainhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid offhand item's registry name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in water")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid in rain")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome register name")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("String")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's biome temperature enum")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on hurt")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's max health")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether maid is sleep")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get the maid's favorability")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the maid is on ground")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("double")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get maid's armor value")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"chair"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#chair"}},[t._v("#")]),t._v(" Chair")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair is sit by the player")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the chair has passenger")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's yaw")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair passenger's pitch")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("int")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's dim id")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("World")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get chair's world data")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get a fixed value, each entity is different, similar to the entity's UUID")])])])]),t._v(" "),e("h4",{attrs:{id:"world"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#world"}},[t._v("#")]),t._v(" World")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("long")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get world's time (tick, 0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is day")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is night")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is raining")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Whether the world is thundering")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/89.0fd9c84c.js b/assets/js/89.0fd9c84c.js
new file mode 100644
index 000000000..f23da429d
--- /dev/null
+++ b/assets/js/89.0fd9c84c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{369:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/90.cf3ab8a8.js b/assets/js/90.cf3ab8a8.js
new file mode 100644
index 000000000..9380daffa
--- /dev/null
+++ b/assets/js/90.cf3ab8a8.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[90],{368:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"maid-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-easter-eggs"}},[t._v("#")]),t._v(" Maid Easter Eggs")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"other-questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-questions"}},[t._v("#")]),t._v(" Other Questions")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/91.f06d630d.js b/assets/js/91.f06d630d.js
new file mode 100644
index 000000000..a76469bc9
--- /dev/null
+++ b/assets/js/91.f06d630d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{370:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"preset-animation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#preset-animation"}},[t._v("#")]),t._v(" Preset Animation")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Position the backpack shoulder strap, it must be the root group")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/92.ae5970af.js b/assets/js/92.ae5970af.js
new file mode 100644
index 000000000..9ee035915
--- /dev/null
+++ b/assets/js/92.ae5970af.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{371:function(t,o,n){"use strict";n.r(o);var s=n(14),e=Object(s.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Убедитесь, что вы используете самую последнюю версию Touhou Little Maid.")])])])}),[],!1,null,null,null);o.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/93.1d8b8288.js b/assets/js/93.1d8b8288.js
new file mode 100644
index 000000000..ae18c9c4e
--- /dev/null
+++ b/assets/js/93.1d8b8288.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{372:function(t,s,a){"use strict";a.r(s);var e=a(14),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"детали-моделеи-стульев"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#детали-моделеи-стульев"}},[t._v("#")]),t._v(" Детали моделей стульев")]),t._v(" "),s("ul",[s("li",[t._v("Этот вики применяется для Touhou Little Maid "),s("code",[t._v("1.12.2")]),t._v(" и "),s("code",[t._v("1.16.5")]),t._v(" последней версии;")]),t._v(" "),s("li",[t._v("Требует понимания структуры набора ресурсов ванильного Minecraft;")]),t._v(" "),s("li",[t._v("Требует понимания формата JSON;")]),t._v(" "),s("li",[t._v("В настоящее время поддерживает только модели "),s("strong",[t._v("1.10.0 или 1.12.0 Bedrock Edition")]),t._v(".")]),t._v(" "),s("li",[t._v("Для редактирования файлов мы рекомендуем "),s("code",[t._v("Visual Studio Code")]),t._v(", все связанные файлы должны быть сохранены с помощью "),s("code",[t._v("UTF-8 без BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"структура-наборов-моделеи"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#структура-наборов-моделеи"}},[t._v("#")]),t._v(" Структура наборов моделей")]),t._v(" "),s("p",[t._v("Чтобы лучше понять, как создать пакеты моделей, мы перечислили здесь формат структуры пакетов моделей")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("папка пакетов моделей\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_chair.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cushion.json\n │ └─wheel_chair.json\n └─textures\n └─entity\n ├─cushion.png\n └─wheel_chair.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"описание-фаилов-наборов-моделеи"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#описание-фаилов-наборов-моделеи"}},[t._v("#")]),t._v(" Описание файлов наборов моделей")]),t._v(" "),s("p",[t._v("Структура полного файла ниже, только части, которые помечены как '(Обязательные)' должны быть заполнены, вы не должны заполнять всё.")]),t._v(" "),s("p",[t._v("Модель поддерживает JSON файлы с комментариями, пожалуйста, используйте их по своему усмотрению.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-08-20"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/chair_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/cushion.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/cushion.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The entity height(pixels) above ground when sat on, default is 3")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"mounted_height"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Will tamed entities such as maids can sit on it, default is true")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tameable_can_ride"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Whether the chair has gravity, the default is false")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"no_gravity"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cushion"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Just A Normal Cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, chair will not have any animation")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/chair/passenger/rotation.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br"),s("span",{staticClass:"line-number"},[t._v("46")]),s("br"),s("span",{staticClass:"line-number"},[t._v("47")]),s("br"),s("span",{staticClass:"line-number"},[t._v("48")]),s("br"),s("span",{staticClass:"line-number"},[t._v("49")]),s("br"),s("span",{staticClass:"line-number"},[t._v("50")]),s("br"),s("span",{staticClass:"line-number"},[t._v("51")]),s("br")])]),s("p",[t._v("На примере выше перечислены все возможные поля, однако для заполнения обязательны только поля с '(Required)', остальные могут быть опущены.")]),t._v(" "),s("p",[t._v("Для простоты можно написать такой файл:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Custom Chair Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:cushion"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the model file will be "),s("code",[t._v("cushion.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("cushion.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("p",[s("code",[t._v("mounted_height")]),t._v(" is the height of the entity when it is riding the model, the unit is the pixels above ground, you can use decimals.")]),t._v(" "),s("blockquote",[s("p",[t._v("The "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" position of the riding entity will always be the center of the chair entity, please preset the "),s("code",[t._v("X")]),t._v(" and "),s("code",[t._v("Z")]),t._v(" of the chair models when designing the models.")])]),t._v(" "),s("h2",{attrs:{id:"анимированная-иконка"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#анимированная-иконка"}},[t._v("#")]),t._v(" Анимированная иконка")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"фаил-моделеи"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#фаил-моделеи"}},[t._v("#")]),t._v(" Файл моделей")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"интернационализация"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#интернационализация"}},[t._v("#")]),t._v(" Интернационализация")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_chair_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Custom Chair Model Packs")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("自定义坐垫模型包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_chair_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/94.51dfef78.js b/assets/js/94.51dfef78.js
new file mode 100644
index 000000000..79486f1a4
--- /dev/null
+++ b/assets/js/94.51dfef78.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{374:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"свои-рецепты-алтаря"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#свои-рецепты-алтаря"}},[t._v("#")]),t._v(" Свои рецепты Алтаря")]),t._v(" "),s("h2",{attrs:{id:"_1-16-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-16-5"}},[t._v("#")]),t._v(" 1.16.5")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.16.5 use datapack to add altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Пожалуйста, убедитесь, что вы знаете, как использовать ванильный датапак Minecaft")])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Фиксированный тип")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:altar_crafting"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Имя типа энтити")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:item"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Доп. NBT данные для энтити")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"nbt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_gohei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Кол-во силы для крафта")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"power"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Вы можете записать до 6 параметров, это ингредиенты для рецепта")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"ingredients"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"forge:rods/wooden"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"item"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:paper"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br")])]),s("h2",{attrs:{id:"_1-12-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_1-12-2"}},[t._v("#")]),t._v(" 1.12.2")]),t._v(" "),s("p",[t._v("Touhou Little Maid in 1.12.2 added compability to "),s("code",[t._v("CraftTweaker")]),t._v(", use "),s("code",[t._v("CraftTweaker")]),t._v(" to add/edit altar recipes")]),t._v(" "),s("p",[s("strong",[t._v("Before using this function, please make sure you have understood the basic script writing method for "),s("code",[t._v("CraftTweaker")]),t._v(".")])]),t._v(" "),s("div",{staticClass:"language-js line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Simplified template for recipes for importing related ZenClass")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" mods"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("touhoulittlemaid"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Altar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Adding item recipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// First parameter: String, is the recipe ID, recommend you write in the format of xxxx:xxxx, and make sure it does not share names with other receipes")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Second parameter: Float, is the necessary power point required for crafting")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: IItemStack, is the output item for the recipe")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Other parameters: IIngredient, you can write up to 6 parameters, is the input for the recipe")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("sand"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("diamond_sword"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for changable parameter")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addItemCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_apple"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("touhou_little_maid"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("apple"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ore"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("blockGlass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn maid")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidSpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:replace_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for maid revive")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This recipes can only write 1-5 items, the garage kit items are directly forced to be embedded in the recipes")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMaidReviveCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:reborn_maid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("grass"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Example for spawn other mob")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Third parameter: entity id")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("addEntitySpawnCraftRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"test:spawn_pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minecraft:pig"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("minecraft"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("stone"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// To delete a recipe, you can delete through recipe id, this is also why we mentioned you need to set unique recipe id above")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// There is only one parameter, which is recipe id, you can check the included recipe ID through JEI")]),t._v("\nAltar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("removeRecipe")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:craft_camera"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/95.aa13d0bc.js b/assets/js/95.aa13d0bc.js
new file mode 100644
index 000000000..63cac2e88
--- /dev/null
+++ b/assets/js/95.aa13d0bc.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{373:function(t,e,a){"use strict";a.r(e);var n=a(14),s=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"пользовательская-анимация-javascript"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#пользовательская-анимация-javascript"}},[t._v("#")]),t._v(" Пользовательская анимация JavaScript")]),t._v(" "),e("p",[t._v("С помощью JavaScript-файлов вы можете добавлять пользовательские анимации для горничной или кресла.")]),t._v(" "),e("ul",[e("li",[t._v("Этот вики подходит для Touhou Little Maid "),e("code",[t._v("1.12.2")]),t._v(" и "),e("code",[t._v("1.16.5")]),t._v(":")]),t._v(" "),e("li",[t._v("Базовое понимание языка JavaScript;")]),t._v(" "),e("li",[t._v("Немного математических знаний из средней/старшей школы, в частности тригонометрических функций и полярных координат;")]),t._v(" "),e("li",[t._v("Для редактирования скриптов, рекомендуется использовать VSCode с сохранением в кодировке UTF-8 без BOM.")])]),t._v(" "),e("h2",{attrs:{id:"базовыи-формат"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#базовыи-формат"}},[t._v("#")]),t._v(" Базовый формат")]),t._v(" "),e("p",[t._v("Скрипт с анимацией может быть помещён в любую папку, вам нужно только указать путь к файлу для соответствующих моделей. Я рекомендую поместить его в папку "),e("code",[t._v("animation")]),t._v(".")]),t._v(" "),e("p",[t._v("Ниже приведен общий шаблон:")]),t._v(" "),e("div",{staticClass:"language-js line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-js"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Это вызывается только если вы хотите использовать GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/**\n * @param entity Сущность/моб, к которой применяется данная анимация\n * @param limbSwing Скорость движения моба (как спидометр в машине)\n * @param limbSwingAmount Пройденная мобом дистанция (как счётчик пробега в машине)\n * @param ageInTicks Возраст моба в тиках, значение постоянно увеличивается от 0\n * @param netHeadYaw Поворот головы моба\n * @param headPitch Наклон головы моба\n * @param scale Значение масштабирования моба. По умолчанию - 0.0625. Применений не найдено.\n * @param modelMap Группа модели, сохраненная для хэш-карты\n */")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Скрипт для модели")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Простой пример: текущая модет имеет группу костей, названную "),e("code",[t._v("rotation")]),t._v(". Нам нужно, чтобы эта группа вращалась вдоль оси X со скоростью 1 градус каждый тик (18 секунд на 1 оборот). Мы можем написать анимацию так:")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Это вызывается только если вам нужно использовать GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Сперва определим грумму 'rotation' из modelMap")]),t._v("\n rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rotation"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// На всякий случай, сделаем простую проверку наличия этой группы у модели")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// С помощью setRotateAngleX, мы установим угол вращения по оси X")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ageInTicks - это возраст сущности, значение, постоянно увеличивающееся от 0")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// С помощью оператора % мы найдём остаток от деленияв промежутке от 0 до 360")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Так как функция принимает только радианы, умножим полученное значение на 0.017453292 чтобы превратить градусы в радианы")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// И так мы получим анимацию вращения на 1 градус каждый тик")]),t._v("\n rotation"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("p",[t._v("Теперь мы добавим еще одно сложное движение, у нас есть группа с именем "),e("code",[t._v("wing")]),t._v(", и мы хотим, чтобы крылья постоянно двигались вперёд-назад.")]),t._v(" "),e("p",[t._v("Поворот будет по оси Y на угол от "),e("code",[t._v("-20° до 40°")]),t._v(", и цикл будет повторяться каждые 5 секунд.")]),t._v(" "),e("p",[t._v("Тригонометрическая функция соответствует нашим нуждам, так как вы можете использовать синус или косинус, мы будем использовать функцию синуса.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Это вызывается только если вам нужно использовать GlWrapper")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" GlWrapper "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Java"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"com.github.tartaricacid.touhoulittlemaid.client.animation.script.GlWrapper"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("asJSONCompatible")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("animation")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("entity"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" limbSwingAmount"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ageInTicks"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" netHeadYaw"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n headPitch"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" scale"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" modelMap")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Сперва найдём группу 'wing' из modelMap")]),t._v("\n wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wing"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// На всякий случай сделаем простую проверку наличия этой группы у модели")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wing "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Один цикл займёт 5 секунд, что равно 100 тикам")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Используя умножение и остаток от деления мы получим желаемое")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ageInTicks "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.6")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("360")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Теперь используется функция Math из JavaScript")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Используя синус, мы получим периодическую функцию в интервале от -20° до 40°")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")]),t._v(" func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" Math"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sin")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("time "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Так как функция принимает только радианы, умножим полученное значение на 0.017453292 чтобы превратить градусы в радианы")]),t._v("\n wing"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("func "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br"),e("span",{staticClass:"line-number"},[t._v("20")]),e("br"),e("span",{staticClass:"line-number"},[t._v("21")]),e("br")])]),e("p",[t._v("Все остальные сложные движения могут быть получены с помощью соответствующих фунций.")]),t._v(" "),e("h2",{attrs:{id:"быстрая-перезагрузка"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#быстрая-перезагрузка"}},[t._v("#")]),t._v(" Быстрая перезагрузка")]),t._v(" "),e("p",[t._v("Так как вы не можете понять, правильно ли написана анимация, только лишь посмотрев на код, мы добавили возможность быстрой перезагрузки анимации в игре.")]),t._v(" "),e("p",[t._v("После того, как вы загрузите созданный вами набор ресурсов модели, просто используйте следующую команду для перезагрузки всех данных анимации.")]),t._v(" "),e("ul",[e("li",[t._v("1.12.2: "),e("code",[t._v("/maid_res reload")])]),t._v(" "),e("li",[t._v("1.16.5: "),e("code",[t._v("/tlm pack reload")])])]),t._v(" "),e("h2",{attrs:{id:"документация-по-функциям"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#документация-по-функциям"}},[t._v("#")]),t._v(" Документация по функциям")]),t._v(" "),e("p",[t._v("Зачёркнутый стиль означает, что данные функции устарели в 1.16, вы можете посетить "),e("a",{attrs:{href:"https://github.com/TartaricAcid/TouhouLittleMaid/tree/1.16.5/src/main/java/com/github/tartaricacid/touhoulittlemaid/api/animation",target:"_blank",rel:"noopener noreferrer"}},[t._v("эту ссылку"),e("OutboundLink")],1),t._v(" чтобы увидеть исходный код.")]),t._v(" "),e("h3",{attrs:{id:"параметры-сущностеи"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#параметры-сущностеи"}},[t._v("#")]),t._v(" Параметры сущностей")]),t._v(" "),e("p",[t._v("В зависимости от цели, к которой применяется анимация, функции, используемые "),e("code",[t._v("сущностью")]),t._v(", также могут отличаться друг от друга.")]),t._v(" "),e("h4",{attrs:{id:"горничная"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#горничная"}},[t._v("#")]),t._v(" Горничная")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Имя функции")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Возвращаемое значение")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Примечание")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела шлем, возвращает "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Есди горничная надела нагрудник, возвращает "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела поножи, возвращает "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела ботинки, возвращает "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHelmet()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела шлем, возвращает имя шлема из реестра предметов")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getChestPlate()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела нагрудник, возвращает имя нагрудника из реестра предметов")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getLeggings()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела поножи, возвращает имя поножей из реестра предметов")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBoots()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная надела ботинки, возвращает имя ботинок из реестра предметов")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isBegging()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Находится ли горничная в режиме попрошайки")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingingArms()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Если горничная двигает руками, эта функция вернет "),e("code",[t._v("true")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSwingProgress()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт время анимации рук")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRiding()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Едет ли горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSitting()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Сидит ли на месте горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldTrolley()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Держит ли горничная тележку или другие объекты")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingMarisaBroom()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Сидит ли горничная на метле")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isRidingPlayer()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Едет ли горничная верхом на игроке")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isHoldVehicle()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Едет ли горничная на транспорте")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("isPortableAudioPlay()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Держит ли горничная портативное радио и играет ли оно")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasBackpack()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Одет ли на горничной рюкзак")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getBackpackLevel()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("целочисленный")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт уровень рюкзака")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("hasSasimono()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Одет ли на горничную сазимоно")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSwingLeftHand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Использует ли горничная левую руку, вернёт "),e("code",[t._v("false")]),t._v(", если правую")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getLeftHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число [3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт данные вращения левой руки")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getRightHandRotation()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число [3]")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт данные вращения правой руки")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("целочисленный")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт измерение, где находится горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("Мир")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт данные о мире")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getTask()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт занятие горничной, такое как "),e("code",[t._v("attack")]),t._v(", "),e("code",[t._v("ranged_attack")])])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Есть ли предмет в главной (правой) руке горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Есть ли предмет во вторичной (левой) руке горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemMainhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт имя предмета, находящегося в главной руке горничной, из реестра предметов")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getItemOffhand()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт имя предмета, находящегося во вторичной руке горничной, из реестра предметов")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inWater()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("В воде ли горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("inRain()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Под дождём ли горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getAtBiome()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт из реестра имя биома, где находится горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getAtBiomeTemp()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("строковый")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт температуру биома, в котором находится горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("onHurt()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Больно ли горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт здоровье горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getMaxHealth()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт максимальное здоровье горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isSleep()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Спит ли горничная")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getFavorability()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("целочисленный")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт благоприятность горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isOnGround()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Находится ли горничная на блоке")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getArmorValue()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("большоt дробное число (double)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт значение брони горничной")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("большое целое число (long)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт фиксированное значение, уникальное для каждой сущности, схожее с UUID мобов")])])])]),t._v(" "),e("h4",{attrs:{id:"сидение"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#сидение"}},[t._v("#")]),t._v(" Сидение")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Имя функции")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Возвращаемое значение")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Примечание")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRidingPlayer()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Сидит ли за этим сидением игрок")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("hasPassenger()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Имеет ли это сидение пассажира")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт поворот пассажира")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getYaw()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт поворот сидения")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getPassengerPitch()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("дробное число")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт наклон пассажира")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("s",[e("code",[t._v("getDim()")])])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("целочисленный")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт ID измерения")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorld()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("Мир")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт данные о мире")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getSeed()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("большое целое число (long)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт фиксированное значение, уникальное для каждой сущности, схожее с UUID мобов")])])])]),t._v(" "),e("h4",{attrs:{id:"мир"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#мир"}},[t._v("#")]),t._v(" Мир")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Имя функции")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Возвращаемое значение")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Примечание")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getWorldTime()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("большое целое число (long)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Вернёт время в тиках (0-24000)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isDay()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Сейчас день?")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isNight()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Сейчас ночь?")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isRaining()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Идёт ли дождь")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isThundering()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("логический")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Идёт ли шторм")])])])]),t._v(" "),e("h3",{attrs:{id:"limbswing-limbswingamount-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#limbswing-limbswingamount-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("limbSwing")]),t._v(" & "),e("code",[t._v("limbSwingAmount")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("These are floating points, "),e("code",[t._v("limbSwing")]),t._v(" is the walking speed of the entity (think of it as the speedometer of a car), "),e("code",[t._v("limbSwingAmount")]),t._v(" is the total walking distance of the entity (think of it as the odometer of a car).")]),t._v(" "),e("p",[t._v("These two data are mainly used on the rotation of the legs and limbs, Minecraft vanilla uses these two basic data to calculate the animation of the arm and leg swinging.")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(left hand)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount")]),t._v("(right hand)")]),t._v(" "),e("p",[e("code",[t._v("Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(left leg)")]),t._v(" "),e("p",[e("code",[t._v("-Math.cos(limbSwing * 0.6662) * limbSwingAmount * 1.4")]),t._v("(right leg)")]),t._v(" "),e("p",[t._v("Changing the value "),e("code",[t._v("0.6662")]),t._v(" will control the frequency of the swing, multiplied by the coeffecient of the formula (for example, the leg uses "),e("code",[t._v("1.4")]),t._v(" as the coeffecient) to change the amplitude of the swing.")]),t._v(" "),e("p",[t._v("Using the vanilla Minecraft formula for arm and leg swinging can make a more natural swinging animation.")]),t._v(" "),e("h3",{attrs:{id:"ageinticks-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ageinticks-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("ageInTicks")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, a variable that self-increase from 0 every tick, a self-changing parameter that's used in most animation function.")]),t._v(" "),e("h3",{attrs:{id:"netheadyaw-and-headpitch-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#netheadyaw-and-headpitch-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("netHeadYaw")]),t._v(" and "),e("code",[t._v("headPitch")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Both are floating point, and are degrees value (this is how vanilla Minecraft is designed).")]),t._v(" "),e("p",[t._v("Normally this parameter can be used as a rotation angle, you just need to change it into radian.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleX")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("headPitch "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nhead"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setRotateAngleY")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("netHeadYaw "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.017453292")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("blockquote",[e("p",[t._v("If the coeffiecient in this section is set to be larger than '0.017453292', there may have some error issue.")])]),t._v(" "),e("h3",{attrs:{id:"scale-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scale-parameter"}},[t._v("#")]),t._v(" "),e("code",[t._v("scale")]),t._v(" Parameter")]),t._v(" "),e("p",[t._v("Floating point, fixed at 0.0625.")]),t._v(" "),e("p",[t._v("A value that has unknown meaning.")]),t._v(" "),e("h3",{attrs:{id:"modelmap-parameter"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modelmap-parameter"}},[t._v("#")]),t._v(" modelMap Parameter")]),t._v(" "),e("p",[t._v("A Map that saves group, using string as keys.")]),t._v(" "),e("p",[t._v("You can get the corresponding group through "),e("code",[t._v('modelMap.get("xxx")')]),t._v(". If there is no group that matches the name, return "),e("code",[t._v("undefined")])]),t._v(" "),e("p",[t._v("Let's say we want to get the target group "),e("code",[t._v("head")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Then we can set various parameter using this "),e("code",[t._v("head")]),t._v(" group to make animation.")]),t._v(" "),e("p",[t._v("Of course, as a precaution, it's best to set a check for this group, to make sure it's existed.")]),t._v(" "),e("div",{staticClass:"language-javascript line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" modelMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"head"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("head "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Making various animation")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("h3",{attrs:{id:"group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#group"}},[t._v("#")]),t._v(" Group")]),t._v(" "),e("p",[t._v("We can get various group via "),e("code",[t._v('modelMap.get("xxx")')]),t._v(", the following are the functions that can be used to the obtained group.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleX(float rotateAngleX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleY(float rotateAngleY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setRotateAngleZ(float rotateAngleZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetX(float offsetX)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetY(float offsetY)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setOffsetZ(float offsetZ)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set the group's Z coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("setHidden(boolean hidden)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Set if the group is hidden")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Z angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization x rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization y rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getInitRotateAngleZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Get ModelRenderer's initialization z rotate angle")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetX()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's X coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetY()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("getOffsetZ()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("float")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Obtain the group's Y coordianate offset")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("isHidden()")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("boolean")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Check if the group is hidden")])])])]),t._v(" "),e("h3",{attrs:{id:"glwrapper"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#glwrapper"}},[t._v("#")]),t._v(" GlWrapper")]),t._v(" "),e("p",[t._v("On the top of the script we used a tool called "),e("code",[t._v("GlWrapper")]),t._v(", that can make various translation, rotation and scaling operations.")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[t._v("Function name")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Return value")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Note")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("translate(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Move the entity to coordiate x y z")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("rotate(float angle, float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Using a straight line"),e("code",[t._v("(0, 0, 0) (x, y, z)")]),t._v(" as axis, rotate it by "),e("code",[t._v("angle")]),t._v(" degree.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("code",[t._v("scale(float x, float y, float z)")])]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("None")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Scale entity on three axis by x y z times")])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/96.cd7f4f5e.js b/assets/js/96.cd7f4f5e.js
new file mode 100644
index 000000000..ac1b8047d
--- /dev/null
+++ b/assets/js/96.cd7f4f5e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{375:function(e,t,a){"use strict";a.r(t);var o=a(14),i=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"custom-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-model-pack"}},[e._v("#")]),e._v(" Custom Model Pack")]),e._v(" "),t("p",[e._v("Touhou Little Maid mod supports custom model packs, you can quickly make your favorite models through software like Blockbench. The game can read the model package in zip compressed file format, or directly read the folder.")]),e._v(" "),t("p",[e._v("The model packs compatible with the mod of "),t("code",[e._v("1.12.2")]),e._v(" and "),t("code",[e._v("1.16.5")]),e._v(" are exactly the same, just that the loading method is slightly different:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1.12.2")]),e._v(": The model package needs to be loaded like the vanilla resource package.")]),e._v(" "),t("li",[t("code",[e._v("1.16.5")]),e._v(": The model package needs to be placed in the "),t("code",[e._v("tlm_custom_pack")]),e._v(" folder under the game's directory.")])]),e._v(" "),t("p",[e._v("It is not difficult to make a custom model package from scratch, even if you are a novice. You only need the following free software:")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Blockbench: A software develped by "),t("code",[e._v("JannisX11")]),e._v(" specifically for Minecraft 3D modelling.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://blockbench.net/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("The mod only supports Bedrock Edition model format, and does not support Bedrock Edition animation files.")])]),e._v(" "),t("li",[t("p",[e._v("Visual Studio Code: An Integrated Development Environment made by Microsoft.")]),e._v(" "),t("p",[e._v("Official website: "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://code.visualstudio.com/"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("Mainly used to edit language files, optional.")])])]),e._v(" "),t("p",[e._v("In addition, I also wrote a blockbench plugin for exporting custom models, only applicable to Blockbench 4.0")]),e._v(" "),t("p",[e._v("Plugin site: "),t("a",{attrs:{href:"http://page.cfpa.team/TLM-Utils-Plugins/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://page.cfpa.team/TLM-Utils-Plugins/"),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"quick-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-start"}},[e._v("#")]),e._v(" Quick Start")]),e._v(" "),t("p",[e._v("First you need to understand how to use Blockbench, and second you need to install the "),t("code",[e._v("tlm-utils")]),e._v(" plugin."),t("br"),e._v("\nWhen everything is done, you can start to make a model package according to the instructions below.")]),e._v(" "),t("h2",{attrs:{id:"_1-create-a-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-create-a-default-model"}},[e._v("#")]),e._v(" 1. Create a default model")]),e._v(" "),t("p",[e._v("Create a default model, it will automatically create a default Bedrock Edition model, you can modify on this basis."),t("br"),e._v("\nIf you choose "),t("code",[e._v("chair")]),e._v(", there is no default model.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/h6ufpuS.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_2-modify-it-to-what-you-want-based-on-the-default-model"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_2-modify-it-to-what-you-want-based-on-the-default-model"}},[e._v("#")]),e._v(" 2. Modify it to what you want based on the default model")]),e._v(" "),t("p",[e._v("Need to pay attention to several points:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("The maid animation is automatically added based on the "),t("strong",[e._v("group name")]),e._v(", so please do not delete or rename at will.")]),e._v(" "),t("blockquote",[t("p",[e._v("Want to know what group names are available? Please see the "),t("RouterLink",{attrs:{to:"/preset_animation.html"}},[e._v("Preset Animation")]),e._v(" chapter.")],1)]),e._v(" "),t("blockquote",[t("p",[e._v("You can right-click in the outliner interface to open the preset animation menu"),t("br"),e._v(" "),t("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})])])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the parent-child relationship of the group.")])]),e._v(" "),t("li",[t("p",[e._v("Pay attention to the pivot point.")])])]),e._v(" "),t("h2",{attrs:{id:"_3-create-textures"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_3-create-textures"}},[e._v("#")]),e._v(" 3. Create textures")]),e._v(" "),t("p",[e._v("You can edit the textures directly in Blockbench, or you can edit the textures through other image editors.")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/4JOKLMd.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_4-create-a-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_4-create-a-model-pack"}},[e._v("#")]),e._v(" 4. Create a model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/RHq9zf1.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_5-export-the-model-into-model-pack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_5-export-the-model-into-model-pack"}},[e._v("#")]),e._v(" 5. Export the model into model pack")]),e._v(" "),t("p",[t("img",{attrs:{src:"https://i.imgur.com/Mux4TwJ.gif",alt:"img"}})]),e._v(" "),t("h2",{attrs:{id:"_6-load-the-model-pack-enjoy-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_6-load-the-model-pack-enjoy-it"}},[e._v("#")]),e._v(" 6. Load the model pack & enjoy it!")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/97.f78bac92.js b/assets/js/97.f78bac92.js
new file mode 100644
index 000000000..1cd35651c
--- /dev/null
+++ b/assets/js/97.f78bac92.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{376:function(t,s,e){"use strict";e.r(s);var a=e(14),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"maid-model-pack-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maid-model-pack-details"}},[t._v("#")]),t._v(" Maid Model Pack Details")]),t._v(" "),s("ul",[s("li",[t._v("This wiki applies to Touhou Little Maid mod in "),s("code",[t._v("1.12.2")]),t._v(" or "),s("code",[t._v("1.16.5")]),t._v(" latest version;")]),t._v(" "),s("li",[t._v("Requires understanding of vanilla Minecraft's resource pack structure;")]),t._v(" "),s("li",[t._v("Requires understanding of JSON format;")]),t._v(" "),s("li",[t._v("Currently only supports models for "),s("strong",[t._v("1.10.0 or 1.12.0 Bedrock Edition Model")]),t._v(".")]),t._v(" "),s("li",[t._v("For file editing software, we recommend "),s("code",[t._v("Visual Studio Code")]),t._v(", all related files requires to be saved using "),s("code",[t._v("UTF-8 without BOM")]),t._v(".")])]),t._v(" "),s("h2",{attrs:{id:"model-packs-structure"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-structure"}},[t._v("#")]),t._v(" Model Packs Structure")]),t._v(" "),s("p",[t._v("To better understand how to create model packs, we listed here the structure format for model packs")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("model pack folder\n│\n├─pack.mcmeta\n├─pack.png\n└─assets\n └─my_model_pack\n ├─maid_model.json\n ├─lang\n │ ├─en_us.lang\n │ └─zh_cn.lang\n ├─models\n │ └─entity\n │ ├─cirno.json\n │ └─daiyousei.json\n └─textures\n └─entity\n ├─cirno.png\n └─daiyousei.png\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br")])]),s("h2",{attrs:{id:"model-packs-description-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-packs-description-files"}},[t._v("#")]),t._v(" Model Packs Description Files")]),t._v(" "),s("p",[t._v("The file complete structure is as below, only the parts marked '(Required)' requires to be filled, you don't have to fill everything.")]),t._v(" "),s("p",[t._v("The model supports JSON files with comments, please use at your discretion.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Author list")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"author"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TartaricAcid"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SuccinicAcid"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Description for model packs")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Default Model Packs"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack version")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1.0.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Date creation for model pack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"date"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-07-14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack icon, without this, the model pack will have no icon")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"icon"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/maid_icon.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the model, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:models/entity/hakurei_reimu.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The path for the texture, use the full resource path")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"texture"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:textures/entity/hakurei_reimu.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The model size when rendering the item form, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_item_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The size when render the entity, range is between 0.2~2.0, default is 1.0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"render_entity_scale"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.75")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reimu Hakurei"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The description for the model")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Shrine Maiden of Hakurei"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Animation script reference, without this part, model will have some default animations")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// tlm-utils plugins can auto generate the correct animation reference based on the group name")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"animation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:animation/maid.default.js"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br"),s("span",{staticClass:"line-number"},[t._v("13")]),s("br"),s("span",{staticClass:"line-number"},[t._v("14")]),s("br"),s("span",{staticClass:"line-number"},[t._v("15")]),s("br"),s("span",{staticClass:"line-number"},[t._v("16")]),s("br"),s("span",{staticClass:"line-number"},[t._v("17")]),s("br"),s("span",{staticClass:"line-number"},[t._v("18")]),s("br"),s("span",{staticClass:"line-number"},[t._v("19")]),s("br"),s("span",{staticClass:"line-number"},[t._v("20")]),s("br"),s("span",{staticClass:"line-number"},[t._v("21")]),s("br"),s("span",{staticClass:"line-number"},[t._v("22")]),s("br"),s("span",{staticClass:"line-number"},[t._v("23")]),s("br"),s("span",{staticClass:"line-number"},[t._v("24")]),s("br"),s("span",{staticClass:"line-number"},[t._v("25")]),s("br"),s("span",{staticClass:"line-number"},[t._v("26")]),s("br"),s("span",{staticClass:"line-number"},[t._v("27")]),s("br"),s("span",{staticClass:"line-number"},[t._v("28")]),s("br"),s("span",{staticClass:"line-number"},[t._v("29")]),s("br"),s("span",{staticClass:"line-number"},[t._v("30")]),s("br"),s("span",{staticClass:"line-number"},[t._v("31")]),s("br"),s("span",{staticClass:"line-number"},[t._v("32")]),s("br"),s("span",{staticClass:"line-number"},[t._v("33")]),s("br"),s("span",{staticClass:"line-number"},[t._v("34")]),s("br"),s("span",{staticClass:"line-number"},[t._v("35")]),s("br"),s("span",{staticClass:"line-number"},[t._v("36")]),s("br"),s("span",{staticClass:"line-number"},[t._v("37")]),s("br"),s("span",{staticClass:"line-number"},[t._v("38")]),s("br"),s("span",{staticClass:"line-number"},[t._v("39")]),s("br"),s("span",{staticClass:"line-number"},[t._v("40")]),s("br"),s("span",{staticClass:"line-number"},[t._v("41")]),s("br"),s("span",{staticClass:"line-number"},[t._v("42")]),s("br"),s("span",{staticClass:"line-number"},[t._v("43")]),s("br"),s("span",{staticClass:"line-number"},[t._v("44")]),s("br"),s("span",{staticClass:"line-number"},[t._v("45")]),s("br")])]),s("p",[t._v("The example above listed all usable field, only the field with '(Required)' are needed, the rest can be omitted.")]),t._v(" "),s("p",[t._v("For simplicity, you could write a file like this:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model pack name (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Packs"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model list (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Model id, no duplication allowed (Required)")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br")])]),s("p",[t._v("If we do not fill the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", it will choose the default model and texture based on "),s("code",[t._v("model_id")]),t._v(".")]),t._v(" "),s("p",[t._v("For the example above, "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:hakurei_reimu")]),t._v(", then the model file will be "),s("code",[t._v("hakurei_reimu.json")]),t._v(" under "),s("code",[t._v("models/entity")]),t._v(" folder, the texture will be "),s("code",[t._v("hakurei_reimu.png")]),t._v(" under "),s("code",[t._v("textures/entity")]),t._v(" folder.")]),t._v(" "),s("p",[t._v("If we filled the field for "),s("code",[t._v("model")]),t._v(" or "),s("code",[t._v("texture")]),t._v(", then the content has no limit, and can even share a model or texture for multiple characters.")]),t._v(" "),s("h2",{attrs:{id:"animated-icon"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#animated-icon"}},[t._v("#")]),t._v(" Animated Icon")]),t._v(" "),s("p",[t._v("Icon does not have size limit, supports both static and animated icons.")]),t._v(" "),s("p",[t._v("Any icon with a scale of 1:1 will be interpreted as static icon. Any long icon that is not 1:1 scale, will be displayed slowly with a 0.1 second interval, which creates the animated effect.")]),t._v(" "),s("blockquote",[s("p",[t._v("The image below is the icon in the mod, left is static icon, and right is the animated icon.")])]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/VoulqpR.png",alt:"020"}})]),t._v(" "),s("h2",{attrs:{id:"model-files"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#model-files"}},[t._v("#")]),t._v(" Model Files")]),t._v(" "),s("ul",[s("li",[t._v("This mod is using JSON files in Bedrock "),s("code",[t._v("1.10.0")]),t._v(" or "),s("code",[t._v("1.12.0")]),t._v(" for model loading, the document can be exported via model building software "),s("a",{attrs:{href:"https://blockbench.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Blockbench"),s("OutboundLink")],1),t._v(", without additional edits.")]),t._v(" "),s("li",[t._v("There are many preset animations, you only need to name a specific group, and then the plugin will automatically generate the corresponding animation script reference when exporting the model. For all available names, please see the "),s("RouterLink",{attrs:{to:"/preset_animation.html"}},[t._v("Preset Animation")]),t._v(" chapter.")],1),t._v(" "),s("li",[t._v("Model also support JavaScript custom animations, you can find the introduction in the custom animation chapter.")])]),t._v(" "),s("h2",{attrs:{id:"internationlization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#internationlization"}},[t._v("#")]),t._v(" Internationlization")]),t._v(" "),s("p",[t._v("As a game that are facing internationlization, part of the contents of model packs also have internationalization compability.")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("pack_name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model packs support internationalization;")]),t._v(" "),s("li",[s("code",[t._v("name")]),t._v(" and "),s("code",[t._v("description")]),t._v(" field in model list support internationalization.")])]),t._v(" "),s("p",[t._v("The method of adding internationalization is pretty simple, just need to begin it using "),s("code",[t._v("{")]),t._v(" and end it using "),s("code",[t._v("}")]),t._v(", the middle section is the internationlization key, and then followed by the corresponding language file.")]),t._v(" "),s("p",[t._v("For example we wrote the description as follow (taking just a small section)")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.name}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{pack.vanilla_touhou_model.desc}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("and then under model pack namespace, in the "),s("code",[t._v("lang")]),t._v(" folder we create "),s("code",[t._v("en_us.lang")]),t._v(" file, and write the content below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Vanilla Touhou Model")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("Default Model Packs")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("We only added the English file, but if we want to support Chinese, we can create "),s("code",[t._v("zh_cn.lang")]),t._v(" file and write the content as below:")]),t._v(" "),s("div",{staticClass:"language-properties line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-properties"}},[s("code",[s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("原版东方资源包")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("pack.vanilla_touhou_model.desc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("默认的模型包")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("For the first example, if we did not fill the "),s("code",[t._v("name")]),t._v(" file, then the system will automatically create the local key based on "),s("code",[t._v("model_id")]),t._v(", for example "),s("code",[t._v("model_id")]),t._v(" is "),s("code",[t._v("touhou_little_maid:cushion")]),t._v(", then the generated language key is "),s("code",[t._v("model.touhou_little_maid.cushion.name")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v("description")]),t._v(" file is not generated by default, you will need to fill that in.")]),t._v(" "),s("h2",{attrs:{id:"compatibility-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#compatibility-issue"}},[t._v("#")]),t._v(" Compatibility Issue")]),t._v(" "),s("p",[t._v("Since models made by some authors are more unique, they may have some compability issues with maids' various addtional appearance parts. Here we address the issue with these non-standard models and how you can overcome it:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"center"}},[t._v("Issues")]),t._v(" "),s("th",{staticStyle:{"text-align":"center"}},[t._v("Solution")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Uncoordinated animation")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write a custom JavaScript animation script")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Hold items are in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Disable showing hold items")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("As long as "),s("code",[t._v("armLeft")]),t._v(" or "),s("code",[t._v("armRight")]),t._v(" group does not exist, then the corresponding hold items will not be shown")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack is in incorrect position")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Use positional group to define the position")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"center"}},[t._v("Backpack, trolley, vehicles, broom, custom head")]),t._v(" "),s("td",{staticStyle:{"text-align":"center"}},[t._v("Write some fields as shown in the example below to close it")])])])]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_backpack"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of backpack")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_custom_head"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of maid's custom heads")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"show_hata"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent displaying of hata sasimono, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_trolley"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevent maid to hold the trolley, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_hold_vehicle"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to hold the vehicle, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"can_riding_broom"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Prevent maid to riding the broom, deprecated in 1.16")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br"),s("span",{staticClass:"line-number"},[t._v("11")]),s("br"),s("span",{staticClass:"line-number"},[t._v("12")]),s("br")])]),s("h2",{attrs:{id:"пасхальные-яица-горничнои"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#пасхальные-яица-горничнои"}},[t._v("#")]),t._v(" Пасхальные яйца горничной")]),t._v(" "),s("p",[t._v("We added maid naming easter egg function, specially named maid can use special models.")]),t._v(" "),s("p",[t._v("Writing easter egg script is pretty simple, the model will automatically detect it as easter egg models, and it won't show in skin menu.")]),t._v(" "),s("h3",{attrs:{id:"normal-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#normal-easter-eggs"}},[t._v("#")]),t._v(" Normal Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for normal naming easter egg. Under normal naming easter egg, maid only need to be named as shown in the "),s("code",[t._v("tag")]),t._v(" field to use the model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IKUN~"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br")])]),s("h3",{attrs:{id:"encrypted-easter-eggs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#encrypted-easter-eggs"}},[t._v("#")]),t._v(" Encrypted Easter Eggs")]),t._v(" "),s("p",[t._v("Below is the script for encrypted naming easter egg. For encrypted naming easter egg, maid has to be specially named, the naming has to be the same as SHA-1 value in the "),s("code",[t._v("tag")]),t._v(" below to use the model.")]),t._v(" "),s("p",[t._v("As the script below, when maid is named "),s("code",[t._v("IKUN~")]),t._v(", because the characters' SHA-1 value is "),s("code",[t._v("6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511")]),t._v(", same as "),s("code",[t._v("tag")]),t._v(" field, it will use said model.")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("div",{staticClass:"highlight-lines"},[s("br"),s("br"),s("br"),s("br"),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("div",{staticClass:"highlighted"},[t._v(" ")]),s("br"),s("br"),s("br")]),s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"pack_name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Touhou Project Model Pack"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_list"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"model_id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"touhou_little_maid:hakurei_reimu"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"easter_egg"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"encrypt"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tag"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6dadb86d91cc4c0c2c7860e1cb16cec01e1b6511"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h2",{attrs:{id:"другие-вопросы"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#другие-вопросы"}},[t._v("#")]),t._v(" Другие вопросы")]),t._v(" "),s("h3",{attrs:{id:"z-fighting-issue"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#z-fighting-issue"}},[t._v("#")]),t._v(" Z-fighting Issue")]),t._v(" "),s("p",[t._v("This is an issue with OpenGL itself, during the process of creating models if we used flat or two coinciding solids, we will have this issue.")]),t._v(" "),s("p",[s("img",{attrs:{src:"https://i.imgur.com/daYk77e.png",alt:"004"}})]),t._v(" "),s("p",[t._v("For the issue of one flat cube, you can add texture to one of the sides and keep the others empty, it will solve the issue; for two coinciding cube, move the cube slightly, or delete the coinciding cube.")]),t._v(" "),s("h3",{attrs:{id:"uppercase-lowercase"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#uppercase-lowercase"}},[t._v("#")]),t._v(" Uppercase & Lowercase")]),t._v(" "),s("p",[t._v("In Minecraft, all the file names needs to be lowercase.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/98.444a3bec.js b/assets/js/98.444a3bec.js
new file mode 100644
index 000000000..824f925ca
--- /dev/null
+++ b/assets/js/98.444a3bec.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[98],{377:function(t,e,i){"use strict";i.r(e);var o=i(14),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"заготовленная-анимация"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#заготовленная-анимация"}},[t._v("#")]),t._v(" Заготовленная анимация")]),t._v(" "),e("p",[t._v("There are many default animations built in the mod, you only need:")]),t._v(" "),e("ol",[e("li",[t._v("Set the correct name for the group you want to animate in Blockbench.")]),t._v(" "),e("li",[t._v("Call the animation reference of the path in the "),e("code",[t._v("animation")]),t._v(" field of the "),e("code",[t._v("maid_model.json")]),t._v(" file.")])]),t._v(" "),e("blockquote",[e("p",[t._v("The "),e("code",[t._v("tlm-utils")]),t._v(" plugin can automatically call the animation script reference based on the group name, you just need to click the "),e("code",[t._v("Re-Analyze Animation")]),t._v(" button. "),e("img",{attrs:{src:"https://i.imgur.com/iyCKwMx.gif",alt:"img"}})])]),t._v(" "),e("p",[t._v("The Blockbench plugin provides all available preset animations, you can right-click in the outliner interface to open the preset animation menu"),e("br"),t._v(" "),e("img",{attrs:{src:"https://i.imgur.com/N17PbiE.gif",alt:"img"}})]),t._v(" "),e("h2",{attrs:{id:"positioning-group"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#positioning-group"}},[t._v("#")]),t._v(" Positioning Group")]),t._v(" "),e("p",[t._v("For rendering positioning, based on the pivot point of the group, can be empty.")]),t._v(" "),e("h3",{attrs:{id:"armleftpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armleftpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armLeftPositioningBone")])]),t._v(" "),e("p",[t._v("Position the left-handed item, its parent group must be "),e("code",[t._v("armLeft")])]),t._v(" "),e("h3",{attrs:{id:"armrightpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#armrightpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("armRightPositioningBone")])]),t._v(" "),e("p",[t._v("Position the right-handed item, its parent group must be "),e("code",[t._v("armRight")])]),t._v(" "),e("h3",{attrs:{id:"backpackpositioningbone"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#backpackpositioningbone"}},[t._v("#")]),t._v(" "),e("code",[t._v("backpackPositioningBone")])]),t._v(" "),e("p",[t._v("Позиция лямки рюкзака должна быть в корневой группе")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/99.3cb4e284.js b/assets/js/99.3cb4e284.js
new file mode 100644
index 000000000..370b465dd
--- /dev/null
+++ b/assets/js/99.3cb4e284.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{378:function(t,n,o){"use strict";o.r(n);var u=o(14),l=Object(u.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("blockquote",[t("p",[this._v("Kullandığınız Touhou Little Maid modunun güncel olduğuna emin olun.")])])])}),[],!1,null,null,null);n.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/app.0d214d66.js b/assets/js/app.0d214d66.js
new file mode 100644
index 000000000..4f28a7134
--- /dev/null
+++ b/assets/js/app.0d214d66.js
@@ -0,0 +1,16 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,i,l=t[0],s=t[1],c=t[2],p=0,d=[];p