diff --git a/app/jsnode/package.json b/app/jsnode/package.json index 5dd73d57..ba111c94 100644 --- a/app/jsnode/package.json +++ b/app/jsnode/package.json @@ -26,7 +26,7 @@ "access": "public" }, "dependencies": { - "@octokit/rest": "^18.5.2", + "@octokit/rest": "^19.0.13", "@rauschma/stringio": "^1.4.0", "axios": "^1.6.4", "commander": "^8.2.0", @@ -38,9 +38,8 @@ "pako": "^2.0.4", "esbuild-wasm": "^0.21.3", "threads": "^1.7.0", - "eslint": "^8.34.0", "js-md5": "^0.7.3", - "ajv": "^8.11.0", + "ajv": "^8.17.1", "localforage": "^1.9.0", "permessage-deflate": "^0.1.7", "ste-events": "^2.0.9" diff --git a/app/package-lock.json b/app/package-lock.json index 236a7761..c851f855 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -21,7 +21,7 @@ "@monaco-editor/react": "^4.6.0", "@npm/types": "^1.0.2", "@rauschma/stringio": "^1.4.0", - "ajv": "^8.11.0", + "ajv": "^8.17.1", "axios": "^1.6.4", "commander": "^8.2.0", "esbuild-wasm": "^0.21.5", @@ -69,16 +69,16 @@ "@babel/plugin-transform-private-methods": "^7.23.3", "@babel/preset-env": "^7.23.7", "@babel/preset-react": "^7.23.3", - "@minecraft/math": "^1.4.0", + "@minecraft/math": "^1.5.1", "@minecraft/server": "^1.15.0-beta.1.21.30-preview.25", "@minecraft/server-admin": "^1.0.0-beta.1.21.30-preview.25", "@minecraft/server-editor": "^0.1.0-beta.1.21.30-preview.25", "@minecraft/server-gametest": "^1.0.0-beta.1.21.30-preview.25", "@minecraft/server-net": "^1.0.0-beta.1.21.30-preview.25", "@minecraft/server-ui": "^1.4.0-beta.1.21.30-preview.25", - "@minecraft/vanilla-data": "^1.21.22", + "@minecraft/vanilla-data": "^1.21.50", "@npm/types": "^1.0.2", - "@octokit/rest": "^18.5.2", + "@octokit/rest": "^19.0.13", "@octokit/types": "^6.13.0", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^12.8.1", @@ -4040,12 +4040,13 @@ "dev": true }, "node_modules/@minecraft/math": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@minecraft/math/-/math-1.4.0.tgz", - "integrity": "sha512-syh24zBVPDIh/Xf+XxuPUUp98rvgcrycPjkNDdwcC7yWSLIGjyaBeaw88a2JsW3e8qoVQfjzTMQhRl5dJ01OkQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@minecraft/math/-/math-1.5.1.tgz", + "integrity": "sha512-62xtbpfNvcltT4AexCs7VazmgWrQXApXGH2/aPotKXAqbLLNAJdKtvK+eiF/cyondoGcUZF/fdu4Pri/qEPNpQ==", "dev": true, + "license": "MIT", "peerDependencies": { - "@minecraft/server": "^1.6.0" + "@minecraft/server": "^1.15.0" } }, "node_modules/@minecraft/server": { @@ -4107,10 +4108,11 @@ } }, "node_modules/@minecraft/vanilla-data": { - "version": "1.21.22", - "resolved": "https://registry.npmjs.org/@minecraft/vanilla-data/-/vanilla-data-1.21.22.tgz", - "integrity": "sha512-pkn0J419sxjdtyfnyZcRO7epJ0RYklPyrqVWQysemV6GMF39YjVpXN/eTYgEF0XJ8Uk+7qBed/B+4EPPb00gZQ==", - "dev": true + "version": "1.21.50", + "resolved": "https://registry.npmjs.org/@minecraft/vanilla-data/-/vanilla-data-1.21.50.tgz", + "integrity": "sha512-4tOzFRGyMxuFLJPo/tN68/FKQwTAxINxFVz4frRcSBliVbAq6hDsDcRcUykWCRFbIU59HG73r6DxwqDOc3Z3wQ==", + "dev": true, + "license": "MIT" }, "node_modules/@monaco-editor/loader": { "version": "1.4.0", @@ -4175,38 +4177,81 @@ "dev": true }, "node_modules/@octokit/auth-token": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", - "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" + "license": "MIT", + "engines": { + "node": ">= 14" } }, "node_modules/@octokit/core": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.3.1.tgz", - "integrity": "sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.4.12", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/endpoint": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz", - "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^6.0.3", + "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/endpoint/node_modules/is-plain-object": { @@ -4214,19 +4259,41 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@octokit/graphql": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.1.tgz", - "integrity": "sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/request": "^5.3.0", - "@octokit/types": "^6.0.3", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/openapi-types": { @@ -4236,64 +4303,147 @@ "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz", - "integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^6.11.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" }, "peerDependencies": { - "@octokit/core": ">=2" + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/plugin-request-log": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", - "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, + "license": "MIT", "peerDependencies": { "@octokit/core": ">=3" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.0.0.tgz", - "integrity": "sha512-Jc7CLNUueIshXT+HWt6T+M0sySPjF32mSFQAK7UfAg8qGeRI6OM1GSBxDLwbXjkqy2NVdnqCedJcP1nC785JYg==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^6.13.0", - "deprecation": "^2.3.1" + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" }, "peerDependencies": { "@octokit/core": ">=3" } }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@octokit/request": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz", - "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^6.7.1", - "deprecation": "^2.0.0", + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", + "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" } }, "node_modules/@octokit/request-error": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz", - "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^6.0.3", + "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/request/node_modules/is-plain-object": { @@ -4301,22 +4451,34 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@octokit/rest": { - "version": "18.5.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.5.2.tgz", - "integrity": "sha512-Kz03XYfKS0yYdi61BkL9/aJ0pP2A/WK5vF/syhu9/kY30J8He3P68hv9GRpn8bULFx2K0A9MEErn4v3QEdbZcw==", + "version": "19.0.13", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", + "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/core": "^3.2.3", - "@octokit/plugin-paginate-rest": "^2.6.2", - "@octokit/plugin-request-log": "^1.0.2", - "@octokit/plugin-rest-endpoint-methods": "5.0.0" + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" } }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true, + "license": "MIT" + }, "node_modules/@octokit/types": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.13.0.tgz", @@ -5827,14 +5989,15 @@ } }, "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -6781,10 +6944,11 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "node_modules/before-after-hook": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.0.tgz", - "integrity": "sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==", - "dev": true + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/bfj": { "version": "7.0.2", @@ -9873,7 +10037,8 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/destroy": { "version": "1.2.0", @@ -11977,6 +12142,12 @@ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.4.tgz", "integrity": "sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==" }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", @@ -27023,10 +27194,11 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" }, "node_modules/universalify": { "version": "2.0.0", @@ -31375,9 +31547,9 @@ "dev": true }, "@minecraft/math": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@minecraft/math/-/math-1.4.0.tgz", - "integrity": "sha512-syh24zBVPDIh/Xf+XxuPUUp98rvgcrycPjkNDdwcC7yWSLIGjyaBeaw88a2JsW3e8qoVQfjzTMQhRl5dJ01OkQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@minecraft/math/-/math-1.5.1.tgz", + "integrity": "sha512-62xtbpfNvcltT4AexCs7VazmgWrQXApXGH2/aPotKXAqbLLNAJdKtvK+eiF/cyondoGcUZF/fdu4Pri/qEPNpQ==", "dev": true, "requires": {} }, @@ -31440,9 +31612,9 @@ } }, "@minecraft/vanilla-data": { - "version": "1.21.22", - "resolved": "https://registry.npmjs.org/@minecraft/vanilla-data/-/vanilla-data-1.21.22.tgz", - "integrity": "sha512-pkn0J419sxjdtyfnyZcRO7epJ0RYklPyrqVWQysemV6GMF39YjVpXN/eTYgEF0XJ8Uk+7qBed/B+4EPPb00gZQ==", + "version": "1.21.50", + "resolved": "https://registry.npmjs.org/@minecraft/vanilla-data/-/vanilla-data-1.21.50.tgz", + "integrity": "sha512-4tOzFRGyMxuFLJPo/tN68/FKQwTAxINxFVz4frRcSBliVbAq6hDsDcRcUykWCRFbIU59HG73r6DxwqDOc3Z3wQ==", "dev": true }, "@monaco-editor/loader": { @@ -31491,40 +31663,69 @@ "dev": true }, "@octokit/auth-token": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", - "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - } + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true }, "@octokit/core": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.3.1.tgz", - "integrity": "sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.4.12", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/endpoint": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz", - "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", "dev": true, "requires": { - "@octokit/types": "^6.0.3", + "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -31534,14 +31735,31 @@ } }, "@octokit/graphql": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.1.tgz", - "integrity": "sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, "requires": { - "@octokit/request": "^5.3.0", - "@octokit/types": "^6.0.3", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/openapi-types": { @@ -31551,47 +31769,94 @@ "dev": true }, "@octokit/plugin-paginate-rest": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz", - "integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, "requires": { - "@octokit/types": "^6.11.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/plugin-request-log": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", - "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.0.0.tgz", - "integrity": "sha512-Jc7CLNUueIshXT+HWt6T+M0sySPjF32mSFQAK7UfAg8qGeRI6OM1GSBxDLwbXjkqy2NVdnqCedJcP1nC785JYg==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", "dev": true, "requires": { - "@octokit/types": "^6.13.0", - "deprecation": "^2.3.1" + "@octokit/types": "^10.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/request": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz", - "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", "dev": true, "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^6.7.1", - "deprecation": "^2.0.0", + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", + "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -31601,28 +31866,51 @@ } }, "@octokit/request-error": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz", - "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, "requires": { - "@octokit/types": "^6.0.3", + "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/rest": { - "version": "18.5.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.5.2.tgz", - "integrity": "sha512-Kz03XYfKS0yYdi61BkL9/aJ0pP2A/WK5vF/syhu9/kY30J8He3P68hv9GRpn8bULFx2K0A9MEErn4v3QEdbZcw==", + "version": "19.0.13", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", + "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", "dev": true, "requires": { - "@octokit/core": "^3.2.3", - "@octokit/plugin-paginate-rest": "^2.6.2", - "@octokit/plugin-request-log": "^1.0.2", - "@octokit/plugin-rest-endpoint-methods": "5.0.0" + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" } }, + "@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, "@octokit/types": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.13.0.tgz", @@ -32820,14 +33108,14 @@ } }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-formats": { @@ -33539,9 +33827,9 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "before-after-hook": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.0.tgz", - "integrity": "sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true }, "bfj": { @@ -37401,6 +37689,11 @@ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.4.tgz", "integrity": "sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==" }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" + }, "fastest-levenshtein": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", @@ -48492,9 +48785,9 @@ } }, "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true }, "universalify": { diff --git a/app/package.json b/app/package.json index ddc8bd0d..1b46ab64 100644 --- a/app/package.json +++ b/app/package.json @@ -24,7 +24,7 @@ "@monaco-editor/react": "^4.6.0", "@npm/types": "^1.0.2", "@rauschma/stringio": "^1.4.0", - "ajv": "^8.11.0", + "ajv": "^8.17.1", "axios": "^1.6.4", "commander": "^8.2.0", "esbuild-wasm": "^0.21.5", @@ -110,16 +110,16 @@ "@babel/plugin-transform-private-methods": "^7.23.3", "@babel/preset-env": "^7.23.7", "@babel/preset-react": "^7.23.3", - "@minecraft/math": "^1.4.0", + "@minecraft/math": "^1.5.1", "@minecraft/server": "^1.15.0-beta.1.21.30-preview.25", "@minecraft/server-admin": "^1.0.0-beta.1.21.30-preview.25", "@minecraft/server-editor": "^0.1.0-beta.1.21.30-preview.25", "@minecraft/server-gametest": "^1.0.0-beta.1.21.30-preview.25", "@minecraft/server-net": "^1.0.0-beta.1.21.30-preview.25", "@minecraft/server-ui": "^1.4.0-beta.1.21.30-preview.25", - "@minecraft/vanilla-data": "^1.21.22", + "@minecraft/vanilla-data": "^1.21.50", "@npm/types": "^1.0.2", - "@octokit/rest": "^18.5.2", + "@octokit/rest": "^19.0.13", "@octokit/types": "^6.13.0", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^12.8.1", diff --git a/app/reslist/packs-preview.resources.json b/app/reslist/packs-preview.resources.json index 48fde650..6cc3f801 100644 --- a/app/reslist/packs-preview.resources.json +++ b/app/reslist/packs-preview.resources.json @@ -6,7 +6,6 @@ "scripts/", "ui/", "gui/", - "painting/", "persona_thumbnails/", "trading/", "pack_icon.png", diff --git a/app/reslist/packs.resources.json b/app/reslist/packs.resources.json index 9e9caa5b..1a1ec059 100644 --- a/app/reslist/packs.resources.json +++ b/app/reslist/packs.resources.json @@ -6,7 +6,6 @@ "scripts/", "ui/", "gui/", - "painting/", "persona_thumbnails/", "trading/", "pack_icon.png", diff --git a/app/src/UX/AudioManager.tsx b/app/src/UX/AudioManager.tsx index 7b242528..a250fbde 100644 --- a/app/src/UX/AudioManager.tsx +++ b/app/src/UX/AudioManager.tsx @@ -826,11 +826,11 @@ export default class AudioManager extends Component
{audioItemProps} diff --git a/app/src/UX/ProjectEditorUtilities.ts b/app/src/UX/ProjectEditorUtilities.ts index ab359036..384aba53 100644 --- a/app/src/UX/ProjectEditorUtilities.ts +++ b/app/src/UX/ProjectEditorUtilities.ts @@ -6,6 +6,7 @@ import ProjectItemUtilities from "../app/ProjectItemUtilities"; import ProjectUtilities from "../app/ProjectUtilities"; import Utilities from "../core/Utilities"; import BlockbenchModel from "../integrations/BlockbenchModel"; +import MinecraftDefinitions from "../minecraft/MinecraftDefinitions"; import { PackType } from "../minecraft/Pack"; import FileSystemFolder from "../storage/FileSystemFolder"; import FileSystemStorage from "../storage/FileSystemStorage"; @@ -540,7 +541,7 @@ export default class ProjectEditorUtilities { const relPath = contentFile.getFolderRelativePath(project.projectFolder as IFolder); if (relPath !== undefined) { - project.ensureItemByProjectPath( + const item = project.ensureItemByProjectPath( relPath, ProjectItemStorageType.singleFile, file.name, @@ -548,6 +549,8 @@ export default class ProjectEditorUtilities { undefined, ProjectItemCreationType.normal ); + + await MinecraftDefinitions.ensureFoundationalDependencies(item); } await project.carto.notifyOperationEnded(operId, "New audio file '" + file.name + "' added"); diff --git a/app/src/UX/ProjectInfoDisplay.tsx b/app/src/UX/ProjectInfoDisplay.tsx index 44f15a9e..ba1cb5a7 100644 --- a/app/src/UX/ProjectInfoDisplay.tsx +++ b/app/src/UX/ProjectInfoDisplay.tsx @@ -73,7 +73,7 @@ export enum ProjectInfoDisplayMenuState { exportMenu, } -export const SuiteTitles = ["All", "Current Platform Versions", "Add-On Best Practices"]; +export const SuiteTitles = ["All", "Current Platform Versions", "Cooperative Add-On Best Practices"]; export enum InfoItemCommand { itemSelect, @@ -107,7 +107,7 @@ export default class ProjectInfoDisplay extends Component | React.KeyboardEvent | null, data: DropdownProps ) { - let targetedSuite = ProjectInfoSuite.allExceptAddOn; + let targetedSuite = ProjectInfoSuite.default; if (data.value === SuiteTitles[1]) { targetedSuite = ProjectInfoSuite.currentPlatformVersions; } else if (data.value === SuiteTitles[2]) { - targetedSuite = ProjectInfoSuite.addOn; + targetedSuite = ProjectInfoSuite.cooperativeAddOn; } if (targetedSuite !== this.props.carto.preferredSuite) { diff --git a/app/src/app/Project.ts b/app/src/app/Project.ts index ee84f7eb..3c7b682b 100644 --- a/app/src/app/Project.ts +++ b/app/src/app/Project.ts @@ -236,7 +236,7 @@ export default class Project { public get infoSet() { if (!this.#infoSet) { - this.#infoSet = new ProjectInfoSet(this, ProjectInfoSuite.allExceptAddOn); + this.#infoSet = new ProjectInfoSet(this, ProjectInfoSuite.default); } return this.#infoSet; @@ -2361,11 +2361,6 @@ export default class Project { folderPathLower.indexOf("/attachables/") >= 0 ) { newJsonType = ProjectItemType.attachableResourceJson; - } else if ( - folderContext === FolderContext.resourcePack && - (folderPathLower.indexOf("/entities/") >= 0 || folderPathLower.indexOf("/entity/") >= 0) - ) { - newJsonType = ProjectItemType.entityTypeResource; } else if (folderContext === FolderContext.resourcePack && folderPathLower.indexOf("/fogs/") >= 0) { newJsonType = ProjectItemType.fogResourceJson; } else if (folderContext === FolderContext.resourcePack && folderPathLower.indexOf("/particles/") >= 0) { @@ -2475,15 +2470,6 @@ export default class Project { newJsonType = ProjectItemType.packageLockJson; } else if (baseName === ".prettierrc") { newJsonType = ProjectItemType.prettierRcJson; - } else if ( - folderContext === FolderContext.behaviorPack && - (folderPathLower.indexOf("/entities/") >= 0 || folderPathLower.indexOf("/entity/") >= 0) - ) { - newJsonType = ProjectItemType.entityTypeBehavior; - } else if (folderContext === FolderContext.behaviorPack && folderPathLower.indexOf("/items/") >= 0) { - newJsonType = ProjectItemType.itemTypeBehavior; - } else if (folderContext === FolderContext.behaviorPack && folderPathLower.indexOf("/blocks/") >= 0) { - newJsonType = ProjectItemType.blockTypeBehavior; } else if (folderContext === FolderContext.docs && baseName === "info") { newJsonType = ProjectItemType.docInfoJson; this.role = ProjectRole.documentation; @@ -2523,6 +2509,22 @@ export default class Project { } else if (folderContext === FolderContext.typeDefs && folderPathLower.indexOf("/engine_modules") >= 0) { newJsonType = ProjectItemType.engineOrderingJson; this.role = ProjectRole.documentation; + } + // these need to be near the bottom since URL segments like /items/, /blocks/, /entities etc. could theoretically be used in loot_tables, etc. and that should take precedence in detection + else if (folderContext === FolderContext.behaviorPack && folderPathLower.indexOf("/items/") >= 0) { + newJsonType = ProjectItemType.itemTypeBehavior; + } else if (folderContext === FolderContext.behaviorPack && folderPathLower.indexOf("/blocks/") >= 0) { + newJsonType = ProjectItemType.blockTypeBehavior; + } else if ( + folderContext === FolderContext.resourcePack && + (folderPathLower.indexOf("/entities/") >= 0 || folderPathLower.indexOf("/entity/") >= 0) + ) { + newJsonType = ProjectItemType.entityTypeResource; + } else if ( + folderContext === FolderContext.behaviorPack && + (folderPathLower.indexOf("/entities/") >= 0 || folderPathLower.indexOf("/entity/") >= 0) + ) { + newJsonType = ProjectItemType.entityTypeBehavior; } else { // Log.debugAlert("General JSON file found: " + projectPath); } diff --git a/app/src/app/ProjectItemUtilities.ts b/app/src/app/ProjectItemUtilities.ts index 2c4d7c59..4b3f4a8e 100644 --- a/app/src/app/ProjectItemUtilities.ts +++ b/app/src/app/ProjectItemUtilities.ts @@ -120,10 +120,13 @@ export default class ProjectItemUtilities { case ProjectItemType.itemTypeBehavior: return 1853; + case ProjectItemType.recipeBehavior: return 1860; + case ProjectItemType.particleJson: return 1870; + case ProjectItemType.tickJson: return 903; diff --git a/app/src/cli/TaskWorker.ts b/app/src/cli/TaskWorker.ts index 69b995ab..2a6185b2 100644 --- a/app/src/cli/TaskWorker.ts +++ b/app/src/cli/TaskWorker.ts @@ -219,7 +219,7 @@ async function validateAndDisposeProject( const isAddon = await ProjectUtilities.getIsAddon(project); if (isAddon) { - pis = new ProjectInfoSet(project, ProjectInfoSuite.addOn); + pis = new ProjectInfoSet(project, ProjectInfoSuite.cooperativeAddOn); await pis.generateForProject(); @@ -229,7 +229,7 @@ async function validateAndDisposeProject( projectName: project.name, projectTitle: project.title, infoSetData: pis.getDataObject(), - suite: ProjectInfoSuite.addOn, + suite: ProjectInfoSuite.cooperativeAddOn, }; metaStates.push(projectSet); diff --git a/app/src/cli/index.ts b/app/src/cli/index.ts index 1db7041d..5a933003 100644 --- a/app/src/cli/index.ts +++ b/app/src/cli/index.ts @@ -1213,7 +1213,7 @@ async function aggregateReports() { } if (baseName.endsWith("addon")) { - suite = ProjectInfoSuite.addOn; + suite = ProjectInfoSuite.cooperativeAddOn; baseName = baseName.substring(0, baseName.length - 6); } @@ -1381,7 +1381,7 @@ async function saveAggregatedReports(projectList: IProjectMetaState[]) { sampleProjectInfoSets[suiteName] = pis; - if (projectSet.suite === undefined || projectSet.suite === ProjectInfoSuite.allExceptAddOn) { + if (projectSet.suite === undefined || projectSet.suite === ProjectInfoSuite.default) { if (projectSet.infoSetData.info) { for (const memberName in projectSet.infoSetData.info) { if (ProjectInfoSet.isAggregableFieldName(memberName)) { diff --git a/app/src/core/ContentIndex.ts b/app/src/core/ContentIndex.ts index fc6b6f1f..b80be090 100644 --- a/app/src/core/ContentIndex.ts +++ b/app/src/core/ContentIndex.ts @@ -158,6 +158,12 @@ export default class ContentIndex implements IContentIndex { hasPathMatches(pathEnd: string) { pathEnd = pathEnd.toLowerCase(); + const lastPeriodEnd = pathEnd.lastIndexOf("."); + + if (lastPeriodEnd >= 0) { + pathEnd = pathEnd.substring(0, lastPeriodEnd); + } + for (let path of this.data.items) { if (path.startsWith("/")) { const lastPeriod = path.lastIndexOf("."); diff --git a/app/src/info/AnimationResourceInfoGenerator.ts b/app/src/info/AnimationResourceInfoGenerator.ts index fbe0d5fc..b6abb462 100644 --- a/app/src/info/AnimationResourceInfoGenerator.ts +++ b/app/src/info/AnimationResourceInfoGenerator.ts @@ -9,6 +9,12 @@ import IProjectInfoGenerator from "./IProjectInfoGenerator"; import Project from "../app/Project"; import ContentIndex from "../core/ContentIndex"; import AnimationResourceDefinition from "../minecraft/AnimationResourceDefinition"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum AnimationResourceInfoGeneratorTest { + animations = 1, + bones = 2, +} export default class AnimationResourceInfoGenerator implements IProjectInfoGenerator { id = "RESOURCEANIMATION"; @@ -17,16 +23,9 @@ export default class AnimationResourceInfoGenerator implements IProjectInfoGener performAddOnValidations = false; getTopicData(topicId: number) { - switch (topicId) { - case 1: - return { title: "Animations" }; - - case 2: - return { title: "Bones" }; - - default: - return { title: topicId.toString() }; - } + return { + title: ProjectInfoUtilities.getTitleFromEnum(AnimationResourceInfoGeneratorTest, topicId), + }; } summarize(info: any, infoSet: ProjectInfoSet) { @@ -36,10 +35,26 @@ export default class AnimationResourceInfoGenerator implements IProjectInfoGener async generate(project: Project, contentIndex: ContentIndex): Promise { const items: ProjectInfoItem[] = []; - const animationCountPi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 1, "Animations"); + const animationCountPi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + AnimationResourceInfoGeneratorTest.animations, + ProjectInfoUtilities.getTitleFromEnum( + AnimationResourceInfoGeneratorTest, + AnimationResourceInfoGeneratorTest.animations + ) + ); items.push(animationCountPi); - const boneCountPi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 2, "Bones"); + const boneCountPi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + AnimationResourceInfoGeneratorTest.bones, + ProjectInfoUtilities.getTitleFromEnum( + AnimationResourceInfoGeneratorTest, + AnimationResourceInfoGeneratorTest.bones + ) + ); items.push(boneCountPi); const itemsCopy = project.getItemsCopy(); diff --git a/app/src/info/AddOnItemRequirementsGenerator.ts b/app/src/info/CooperativeAddOnItemRequirementsGenerator.ts similarity index 73% rename from app/src/info/AddOnItemRequirementsGenerator.ts rename to app/src/info/CooperativeAddOnItemRequirementsGenerator.ts index b6bd5660..2ec92365 100644 --- a/app/src/info/AddOnItemRequirementsGenerator.ts +++ b/app/src/info/CooperativeAddOnItemRequirementsGenerator.ts @@ -8,10 +8,9 @@ import IProjectInfoItemGenerator from "./IProjectItemInfoGenerator"; import ProjectInfoSet from "./ProjectInfoSet"; import { ProjectItemType } from "../app/IProjectItemData"; import { InfoItemType } from "./IInfoItemData"; -import AddOnRequirementsGenerator from "./AddOnRequirementsGenerator"; +import CooperativeAddOnRequirementsGenerator from "./CooperativeAddOnRequirementsGenerator"; import RenderControllerSetDefinition from "../minecraft/RenderControllerSetDefinition"; import ResourceManifestDefinition from "../minecraft/ResourceManifestDefinition"; -import BehaviorManifestDefinition from "../minecraft/BehaviorManifestDefinition"; import ModelGeometryDefinition from "../minecraft/ModelGeometryDefinition"; import Material from "../minecraft/Material"; import ContentIndex from "../core/ContentIndex"; @@ -20,14 +19,36 @@ import AnimationBehaviorDefinition from "../minecraft/AnimationBehaviorDefinitio import AnimationControllerBehaviorDefinition from "../minecraft/AnimationControllerBehaviorDefinition"; import AnimationControllerResourceDefinition from "../minecraft/AnimationControllerResourceDefinition"; import MinecraftDefinitions from "../minecraft/MinecraftDefinitions"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +// rule name/check. For validation errors, name should be a terse description of "your problem" +export enum CooperativeAddOnItemRequirementsGeneratorTest { + BehaviorAnimationControllerIdNotInExpectedForm = 100, + BehaviorAnimationControllerNameNotInExpectedForm = 101, + BehaviorAnimationIdNotInExpectedForm = 110, + BehaviorAnimationNameNotInExpectedForm = 111, + JsonIdentifierNotInExpectedForm = 112, + ResourceAnimationControllerIdNotInExpectedForm = 120, + ResourceAnimationControllerNameNotInExpectedForm = 121, + ResourceAnimationIdNotInExpectedForm = 130, + ResourceAnimationNameNotInExpectedForm = 131, + RenderControllerIdNotInExpectedForm = 140, + RenderControllerNameNotInExpectedForm = 141, + GeometryIdNotInExpectedForm = 150, + GeometryNameNotInExpectedForm = 151, + MaterialsIdentifierNotInExpectedForm = 160, + MaterialsFirstSegmentNotInExpectedForm = 161, + ResourcePackDoesNotHavePackScopeWorld = 170, + NoDimensionJson = 191, +} -export default class AddOnItemRequirementsGenerator implements IProjectInfoItemGenerator { - id = "ADDONIREQ"; - title = "Addon Item Requirements Generator"; +export default class CooperativeAddOnItemRequirementsGenerator implements IProjectInfoItemGenerator { + id = "CADDONIREQ"; + title = "Cooperative Add-On Item Requirements Generator"; getTopicData(topicId: number) { return { - title: topicId.toString(), + title: ProjectInfoUtilities.getTitleFromEnum(CooperativeAddOnItemRequirementsGeneratorTest, topicId), }; } @@ -37,11 +58,12 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG const items: ProjectInfoItem[] = []; if (projectItem.itemType === ProjectItemType.dimensionJson) { + // CADDONIREQ191 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 191, + CooperativeAddOnItemRequirementsGeneratorTest.NoDimensionJson, `Dimension definition resources are not permitted in an add-on targeted behavior pack`, projectItem ) @@ -56,49 +78,17 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG await rpManifest.load(); if (!rpManifest.packScope) { + // CADDONIREQ170 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 140, + CooperativeAddOnItemRequirementsGeneratorTest.ResourcePackDoesNotHavePackScopeWorld, `Resource pack manifest does not specify that header/pack_scope that should be 'world'`, projectItem ) ); } - if (!rpManifest.productType) { - items.push( - new ProjectInfoItem( - InfoItemType.testCompleteFail, - this.id, - 141, - `Resource pack manifest does not specify a metadata/product_type that should be 'addon'`, - projectItem - ) - ); - } - } - } - } else if (projectItem.itemType === ProjectItemType.behaviorPackManifestJson) { - await projectItem.ensureFileStorage(); - - if (projectItem.file) { - const bpManifest = await BehaviorManifestDefinition.ensureOnFile(projectItem.file); - - if (bpManifest) { - await bpManifest.load(); - - if (!bpManifest.productType) { - items.push( - new ProjectInfoItem( - InfoItemType.testCompleteFail, - this.id, - 142, - `Behavior pack manifest does not specify a metadata/product_type that should be 'addon'`, - projectItem - ) - ); - } } } } else if (projectItem.itemType === ProjectItemType.animationControllerBehaviorJson) { @@ -112,22 +102,24 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG let bacNameBreak = bacName.split("."); if (bacNameBreak.length < 3 || bacNameBreak[0] !== "controller" || bacNameBreak[1] !== "animation") { + // CADDONIREQ100 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 100, + CooperativeAddOnItemRequirementsGeneratorTest.BehaviorAnimationControllerIdNotInExpectedForm, `Behavior pack animation controller identifier is not in expected form of controller.animation.xyz`, projectItem, bacName ) ); - } else if (!AddOnRequirementsGenerator.isNamespacedString(bacNameBreak[2])) { + } else if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(bacNameBreak[2])) { + // CADDONIREQ101 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 101, + CooperativeAddOnItemRequirementsGeneratorTest.BehaviorAnimationControllerNameNotInExpectedForm, `Behavior pack animation controller name section is not in expected form of controller.animation.creatorshortname_projectshortname`, projectItem, bacName @@ -148,22 +140,24 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG let baNameBreak = aName.split("."); if (baNameBreak.length < 2 || baNameBreak[0] !== "animation") { + // CADDONIREQ110 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 110, + CooperativeAddOnItemRequirementsGeneratorTest.BehaviorAnimationIdNotInExpectedForm, `Behavior animation identifier is not in expected form of animation.xyz.animation_name`, projectItem, aName ) ); - } else if (!AddOnRequirementsGenerator.isNamespacedString(baNameBreak[1])) { + } else if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(baNameBreak[1])) { + // CADDONIREQ111 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 111, + CooperativeAddOnItemRequirementsGeneratorTest.BehaviorAnimationControllerNameNotInExpectedForm, `Behavior pack animation name section is not in expected form of animation.creatorshortname_projectshortname.animation_name`, projectItem, aName @@ -184,22 +178,24 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG let racNameBreak = racName.split("."); if (racNameBreak.length < 3 || racNameBreak[0] !== "controller" || racNameBreak[1] !== "animation") { + // CADDONIREQ120 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 120, + CooperativeAddOnItemRequirementsGeneratorTest.ResourceAnimationControllerIdNotInExpectedForm, `Resource pack animation controller identifier is not in expected form of controller.animation.xyz`, projectItem, racName ) ); - } else if (!AddOnRequirementsGenerator.isNamespacedString(racNameBreak[2])) { + } else if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(racNameBreak[2])) { + // CADDONIREQ121 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 121, + CooperativeAddOnItemRequirementsGeneratorTest.ResourceAnimationControllerNameNotInExpectedForm, `Resource pack animation controller name section is not in expected form of controller.animation.creatorshortname_projectshortname`, projectItem, racName @@ -220,22 +216,24 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG let raNameBreak = aName.split("."); if (raNameBreak.length < 2 || raNameBreak[0] !== "animation") { + // CADDONIREQ130 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 130, + CooperativeAddOnItemRequirementsGeneratorTest.ResourceAnimationIdNotInExpectedForm, `Resource animation identifier is not in expected form of animation.xyz.animation_name`, projectItem, aName ) ); - } else if (!AddOnRequirementsGenerator.isNamespacedString(raNameBreak[1])) { + } else if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(raNameBreak[1])) { + // CADDONIREQ131 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 131, + CooperativeAddOnItemRequirementsGeneratorTest.ResourceAnimationNameNotInExpectedForm, `Resource animation name section is not in expected form of animation.creatorshortname_projectshortname.animation_name`, projectItem, aName @@ -256,22 +254,24 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG let racNameBreak = rrcName.split("."); if (racNameBreak.length < 3 || racNameBreak[0] !== "controller" || racNameBreak[1] !== "render") { + // CADDONIREQ140 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 140, + CooperativeAddOnItemRequirementsGeneratorTest.RenderControllerIdNotInExpectedForm, `Resource pack render controller identifier is not in expected form of controller.render.creatorshortname_projectshortname.other`, projectItem, rrcName ) ); - } else if (!AddOnRequirementsGenerator.isNamespacedString(racNameBreak[2])) { + } else if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(racNameBreak[2])) { + // CADDONIREQ141 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 141, + CooperativeAddOnItemRequirementsGeneratorTest.RenderControllerNameNotInExpectedForm, `Resource pack render controller name section is not in expected form of controller.render.creatorshortname_projectshortname`, projectItem, rrcName @@ -293,22 +293,24 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG let modGeoBreaks = modId.split("."); if (modGeoBreaks.length < 2 || modGeoBreaks[0] !== "geometry") { + // CADDONIREQ150 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 150, + CooperativeAddOnItemRequirementsGeneratorTest.GeometryIdNotInExpectedForm, `Geometry is not in expected form of geometry.creatorshortname_projectshortname.other`, projectItem, modId ) ); - } else if (!AddOnRequirementsGenerator.isNamespacedString(modGeoBreaks[1])) { + } else if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(modGeoBreaks[1])) { + // CADDONIREQ151 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 151, + CooperativeAddOnItemRequirementsGeneratorTest.GeometryNameNotInExpectedForm, `Geometry identifier section is not in expected form of geometry.creatorshortname_projectshortname`, projectItem, modId @@ -331,12 +333,13 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG const projectItemDef = await MinecraftDefinitions.get(projectItem); if (projectItemDef && projectItemDef.id) { - if (!AddOnRequirementsGenerator.isNamespacedString(projectItemDef.id)) { + if (!CooperativeAddOnRequirementsGenerator.isNamespacedString(projectItemDef.id)) { + // CADDONIREQ112 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 112, + CooperativeAddOnItemRequirementsGeneratorTest.JsonIdentifierNotInExpectedForm, `JSON namespaced identifier is not in expected form of creatorshortname_projectshortname:myitem`, projectItem, projectItemDef.id @@ -354,13 +357,13 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG if (mat && mat.definition && mat.definition.materials) { for (const modId in mat.definition.materials) { let modIdBreaks = modId.split(":"); - + // CADDONIREQ160 if (modIdBreaks.length < 1) { items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 160, + CooperativeAddOnItemRequirementsGeneratorTest.MaterialsIdentifierNotInExpectedForm, `Materials section identifier is not in expected form of creatorshortname_projectshortname:other`, projectItem, modId @@ -368,14 +371,15 @@ export default class AddOnItemRequirementsGenerator implements IProjectInfoItemG ); } else if ( modIdBreaks[0] !== "version" && - (!AddOnRequirementsGenerator.isNamespacedString(modIdBreaks[0]) || - AddOnRequirementsGenerator.isCommonMaterialName(modIdBreaks[0])) + (!CooperativeAddOnRequirementsGenerator.isNamespacedString(modIdBreaks[0]) || + CooperativeAddOnRequirementsGenerator.isCommonMaterialName(modIdBreaks[0])) ) { + // CADDONIREQ161 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 161, + CooperativeAddOnItemRequirementsGeneratorTest.MaterialsFirstSegmentNotInExpectedForm, `First segment of a Materials section identifier is not in the expected form of creatorshortname_projectshortname_materialname or creatorshortname_projectshortname_materialname:baseitem`, projectItem, modId diff --git a/app/src/info/AddOnRequirementsGenerator.ts b/app/src/info/CooperativeAddOnRequirementsGenerator.ts similarity index 81% rename from app/src/info/AddOnRequirementsGenerator.ts rename to app/src/info/CooperativeAddOnRequirementsGenerator.ts index 7ec9d960..23ccaebc 100644 --- a/app/src/info/AddOnRequirementsGenerator.ts +++ b/app/src/info/CooperativeAddOnRequirementsGenerator.ts @@ -14,6 +14,7 @@ import ProjectItem from "../app/ProjectItem"; import Utilities from "../core/Utilities"; import ResourceManifestDefinition from "../minecraft/ResourceManifestDefinition"; import ContentIndex from "../core/ContentIndex"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; const UniqueRegEx = new RegExp(/[a-zA-Z0-9]{2,}_[a-zA-Z0-9]{2,}:[\w]+/); @@ -186,12 +187,35 @@ const GenericTermList = [ "axolotl", ]; -export default class AddOnRequirementsGenerator implements IProjectInfoGenerator { - id = "ADDONREQ"; - title = "AddOn Requirements"; +// rule name/check. For validation errors, name should be a terse description of "your problem" +export enum CooperativeAddOnRequirementsGeneratorTest { + NoLooseFileInTypeFolder = 101, + NoCommonNamesInCreatorFolderName = 102, + NoLooseFileInCreatorFolder = 104, + MoreThanOneFolderInCreatorFolderBesidesMaybeCommon = 108, + NoUnsupportedFolderNameInTypeFolder = 109, + MoreThanOneFolderInTypeFolder = 110, + NoLooseFilesInTypeFolder = 111, + NoDimensionElements = 131, + NoUiElements = 133, + NotOneBehaviorPackManifest = 160, + NotOneResourcePackManifest = 161, + BehaviorPackManifestNotValid = 163, + ResourcePackManifestNotValid = 164, + NotOneDependencyFromBehaviorPackToResourcePack = 165, + DependencyFromBehaviorPackToResourcePackNotValid = 166, + NotOneDependencyFromResourcePackToBehaviorPack = 168, + DependencyFromResourcePackToBehaviorPackNotValid = 169, +} + +export default class CooperativeAddOnRequirementsGenerator implements IProjectInfoGenerator { + id = "CADDONREQ"; + title = "Cooperative Add-On Requirements"; getTopicData(topicId: number) { - return { title: topicId.toString() }; + return { + title: ProjectInfoUtilities.getTitleFromEnum(CooperativeAddOnRequirementsGeneratorTest, topicId), + }; } async generate(project: Project, contentIndex: ContentIndex): Promise { @@ -208,13 +232,13 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator if (projectItem.file) { if (projectItem.itemType === ProjectItemType.behaviorPackManifestJson) { if (behaviorPackManifest) { - // ADDONREQ160 + // CADDONREQ160 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 160, - `Found more than one behavior pack manifest, which is not supported`, + CooperativeAddOnRequirementsGeneratorTest.NotOneBehaviorPackManifest, + `Found more than one behavior pack manifest in a cooperative add-on, which is not a best practice`, projectItem ) ); @@ -226,13 +250,13 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator await behaviorPackManifest?.load(); } else if (projectItem.itemType === ProjectItemType.resourcePackManifestJson) { if (resourcePackManifest) { - // ADDONREQ161 + // CADDONREQ161 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 161, - `Found more than one resource pack manifest, which is not supported`, + CooperativeAddOnRequirementsGeneratorTest.NotOneResourcePackManifest, + `Found more than one resource pack manifest in a cooperative add-on, which is not a best practice`, projectItem ) ); @@ -247,12 +271,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator } if (!behaviorPackManifest || !behaviorPackManifest.definition) { + // CADDONREQ163 items.push( - // ADDONREQ163 new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 163, + CooperativeAddOnRequirementsGeneratorTest.BehaviorPackManifestNotValid, `Did not find a valid behavior pack manifest.`, undefined ) @@ -260,12 +284,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator } if (!resourcePackManifest || !resourcePackManifest.definition) { - //ADDONREQ164 + //CADDONREQ164 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 164, + CooperativeAddOnRequirementsGeneratorTest.ResourcePackManifestNotValid, `Did not find a valid resource pack manifest.`, undefined ) @@ -284,12 +308,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator !behaviorPackManifest.definition.dependencies || behaviorPackManifest.getNonScriptModuleDependencyCount() !== 1 ) { - // ADDONREQ165 + // CADDONREQ165 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 165, + CooperativeAddOnRequirementsGeneratorTest.NotOneDependencyFromBehaviorPackToResourcePack, `Did not find exactly one dependency on the corresponding resource pack in the behavior pack manifest.`, behaviorPackItem, behaviorPackManifest.getNonScriptModuleDependencyCount() @@ -300,12 +324,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator !bpNonInternalDependency.uuid || !Utilities.uuidEqual(bpNonInternalDependency.uuid, resourcePackManifest.definition.header.uuid) ) { - // ADDONREQ167 + // CADDONREQ166 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 167, + CooperativeAddOnRequirementsGeneratorTest.DependencyFromBehaviorPackToResourcePackNotValid, `Behavior pack manifest does not have a proper dependency on the resource pack identifier.`, behaviorPackItem ) @@ -313,12 +337,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator } if (!resourcePackManifest.definition.dependencies || resourcePackManifest.definition.dependencies.length !== 1) { - // ADDONREQ168 + // CADDONREQ168 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 168, + CooperativeAddOnRequirementsGeneratorTest.NotOneDependencyFromResourcePackToBehaviorPack, `Did not find exactly one dependency on the corresponding behavior pack in the resource pack manifest.`, resourcePackItem ) @@ -330,12 +354,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator behaviorPackManifest.definition.header.uuid ) ) { - // ADDONREQ169 + // CADDONREQ169 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 169, + CooperativeAddOnRequirementsGeneratorTest.DependencyFromResourcePackToBehaviorPackNotValid, `Resource pack manifest does not have a proper dependency on the behavior pack identifier.`, behaviorPackItem ) @@ -369,13 +393,13 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator const folderNameCanon = StorageUtilities.canonicalizeName(folderName); if (folderNameCanon === "dimensions") { - // ADDONREQ131 + // CADDONREQ131 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 131, - `Found dimensions in an add-on, which is not supported`, + CooperativeAddOnRequirementsGeneratorTest.NoDimensionElements, + `Found dimensions in a cooperative add-on, which is not a best practice.`, undefined ) ); @@ -414,12 +438,13 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator const folderNameCanon = StorageUtilities.canonicalizeName(folderName); if (folderNameCanon === "ui") { + // CADDONREQ133 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 133, - `Found ui elements in an add-on, which is not supported`, + CooperativeAddOnRequirementsGeneratorTest.NoUiElements, + `Found ui elements in a cooperative add-on, which is not supported`, undefined ) ); @@ -494,6 +519,7 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator return UniqueRegEx.test(name); } + async generateFromFirstLevelFolderCreator_Game(project: Project, folder: IFolder, items: ProjectInfoItem[]) { await folder.load(); @@ -503,12 +529,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator const projectItem = file?.extendedPath ? project.getItemByExtendedOrProjectPath(file?.extendedPath) : undefined; - // ADDONREQ111 + // CADDONREQ111 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 111, + CooperativeAddOnRequirementsGeneratorTest.NoLooseFilesInTypeFolder, `Found a loose file in the ${folder.name} folder. Should only see files in the folder ${folder.name}\\creatorshortname_gamename\\`, projectItem, fileName @@ -522,13 +548,13 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator const folderNameCanon = StorageUtilities.canonicalizeName(folderName); folderCount++; - if (AddOnRequirementsGenerator.isUniqueNamespaceOrShortName(folderNameCanon)) { - // ADDONREQ109 + if (CooperativeAddOnRequirementsGenerator.isUniqueNamespaceOrShortName(folderNameCanon)) { + // CADDONREQ109 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 109, + CooperativeAddOnRequirementsGeneratorTest.NoUnsupportedFolderNameInTypeFolder, `Found an add-on-blocked folder '${folderName}' in a parent folder pack\\${folder.name}. Should be named 'creatorshortname' and not a common term`, undefined, folderName @@ -538,12 +564,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator } if (folderCount > 1) { - // ADDONREQ110 + // CADDONREQ110 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 110, + CooperativeAddOnRequirementsGeneratorTest.MoreThanOneFolderInTypeFolder, `Folder '${folder.name}' has more than one subfolder, which is not supported. There should only be one folder in pack\\${folder.name}\\_`, undefined, folder.name @@ -587,12 +613,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator const projectItem = file?.extendedPath ? project.getItemByExtendedOrProjectPath(file?.extendedPath) : undefined; - // ADDONREQ101 + // CADDONREQ101 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 101, + CooperativeAddOnRequirementsGeneratorTest.NoLooseFileInTypeFolder, `Found a loose file in the ${folder.name} folder. Should only see files in the folder ${folder.name}\\creatorshortname\\gamename\\`, projectItem, fileName @@ -603,14 +629,14 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator for (const folderName in folder.folders) { const folderNameCanon = StorageUtilities.canonicalizeName(folderName); - if (AddOnRequirementsGenerator.isNameGenericTerm(folderNameCanon)) { - // ADDONREQ102 + if (CooperativeAddOnRequirementsGenerator.isNameGenericTerm(folderNameCanon)) { + // CADDONREQ102 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 102, - `Found an add-on-blocked folder '${folderName}' in a parent folder pack\\${folder.name}. Should be named 'creatorshortname' and not a common term`, + CooperativeAddOnRequirementsGeneratorTest.NoCommonNamesInCreatorFolderName, + `Found an cooperative add-on common name folder '${folderName}' in a parent folder pack\\${folder.name}. Should be named 'creatorshortname' and not a common term`, undefined, folderName ) @@ -638,11 +664,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator const projectItem = file?.extendedPath ? project.getItemByExtendedOrProjectPath(file.extendedPath) : undefined; + // CADDONREQ104 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 104, + CooperativeAddOnRequirementsGeneratorTest.NoLooseFileInCreatorFolder, `Found a loose file '${fileName}' in ${parentFolderName}\\${folder.name}. Files should only be in the folder ${parentFolderName}\\${folder.name}\\`, projectItem, fileName @@ -661,11 +688,12 @@ export default class AddOnRequirementsGenerator implements IProjectInfoGenerator } if (folderCount > 1) { + // CADDONREQ108 items.push( new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 108, + CooperativeAddOnRequirementsGeneratorTest.MoreThanOneFolderInCreatorFolderBesidesMaybeCommon, `Secondary folder '${folder.name}' in ${parentFolderName} has more than one subfolder (besides 'common'), which is not supported. There should only be one folder (plus optionally 'common') in pack\\${parentFolderName}\\${folder.name}\\`, undefined, folder.name diff --git a/app/src/info/GeneratorRegistrations.ts b/app/src/info/GeneratorRegistrations.ts index bdbb5257..03431411 100644 --- a/app/src/info/GeneratorRegistrations.ts +++ b/app/src/info/GeneratorRegistrations.ts @@ -7,12 +7,12 @@ import MinEngineVersionManager from "../manager/MinEngineVersionManager"; import BaseGameVersionManager from "../manager/BaseGameVersionManager"; import BehaviorPackEntityTypeManager from "../manager/BehaviorPackEntityTypeManager"; import PackMetaDataInformationGenerator from "./PackMetaDataInfoGenerator"; -import AddOnRequirementsGenerator from "./AddOnRequirementsGenerator"; +import CooperativeAddOnRequirementsGenerator from "./CooperativeAddOnRequirementsGenerator"; import StrictPlatformInfoGenerator from "./StrictPlatformInfoGenerator"; -import AddOnItemRequirementsGenerator from "./AddOnItemRequirementsGenerator"; +import CooperativeAddOnItemRequirementsGenerator from "./CooperativeAddOnItemRequirementsGenerator"; import PathLengthFileGenerator from "./PathLengthFileGenerator"; import ItemCountsInfoGenerator from "./ItemCountsInfoGenerator"; -import PackInformationGenerator from "./PackInfoGenerator"; +import PackInfoGenerator from "./PackInfoGenerator"; import LineSizeInfoGenerator from "./LineSizeInfoGenerator"; import SchemaItemInfoGenerator from "./SchemaItemInfoGenerator"; import UnknownItemGenerator from "./UnknownItemGenerator"; @@ -38,7 +38,7 @@ export default class GeneratorRegistrations { new ItemCountsInfoGenerator(), new LineSizeInfoGenerator(), new PackSizeInfoGenerator(), - new PackInformationGenerator(), + new PackInfoGenerator(), new JsonFileTagsInfoGenerator(), new ScriptModuleManager(), new VsCodeFileManager(), @@ -49,7 +49,7 @@ export default class GeneratorRegistrations { new AnimationResourceInfoGenerator(), new BehaviorPackEntityTypeManager(), new BehaviorPackItemTypeManager(), - new AddOnRequirementsGenerator(), + new CooperativeAddOnRequirementsGenerator(), new StrictPlatformInfoGenerator(), new TextureInfoGenerator(), new TextureImageInfoGenerator(), @@ -60,7 +60,7 @@ export default class GeneratorRegistrations { new SchemaItemInfoGenerator(), new WorldItemInfoGenerator(), new WorldDataInfoGenerator(), - new AddOnItemRequirementsGenerator(), + new CooperativeAddOnItemRequirementsGenerator(), new UnlinkedItemInfoGenerator(), ]; @@ -74,7 +74,7 @@ export default class GeneratorRegistrations { | IProjectInfoGeneratorBase, suite: ProjectInfoSuite ) { - if (suite === ProjectInfoSuite.addOn) { + if (suite === ProjectInfoSuite.cooperativeAddOn) { if (generator.id === "WORLDDATA") { (generator as WorldDataInfoGenerator).performAddOnValidations = true; } else if (generator.id === "TEXTURE") { diff --git a/app/src/info/IProjectInfoData.ts b/app/src/info/IProjectInfoData.ts index ba73dc0b..d4924ced 100644 --- a/app/src/info/IProjectInfoData.ts +++ b/app/src/info/IProjectInfoData.ts @@ -6,9 +6,9 @@ import IInfoItemData from "./IInfoItemData"; import IProjectInfo from "./IProjectInfo"; export enum ProjectInfoSuite { - allExceptAddOn = 0, + default = 0, currentPlatformVersions = 1, - addOn = 2, + cooperativeAddOn = 2, } export default interface IProjectInfoData { diff --git a/app/src/info/ItemCountsInfoGenerator.ts b/app/src/info/ItemCountsInfoGenerator.ts index 0254d4fa..f2ec7deb 100644 --- a/app/src/info/ItemCountsInfoGenerator.ts +++ b/app/src/info/ItemCountsInfoGenerator.ts @@ -11,14 +11,16 @@ import ProjectInfoSet from "./ProjectInfoSet"; import ProjectItemUtilities from "../app/ProjectItemUtilities"; import ContentIndex from "../core/ContentIndex"; +const TopicTestIdBase = 100; + export default class ItemCountsInfoGenerator implements IProjectInfoGenerator { id = "ITEMS"; title = "Minimum Definition of a Pack"; getTopicData(topicId: number) { - if (topicId > 100 && topicId < 100 + MaxItemTypes) { + if (topicId > TopicTestIdBase && topicId < TopicTestIdBase + MaxItemTypes) { return { - title: ProjectItemUtilities.getDescriptionForType(topicId - 100) + " count", + title: ProjectItemUtilities.getDescriptionForType(topicId - TopicTestIdBase) + " count", }; } return { @@ -28,29 +30,44 @@ export default class ItemCountsInfoGenerator implements IProjectInfoGenerator { summarize(info: any, infoSet: ProjectInfoSet) { info.behaviorPackManifestCount = infoSet.getFirstNumberValue( - "ITEMS", - 100 + ProjectItemType.behaviorPackManifestJson + this.id, + TopicTestIdBase + ProjectItemType.behaviorPackManifestJson + ); + info.unknownJsonCount = infoSet.getFirstNumberValue(this.id, TopicTestIdBase + ProjectItemType.json); + info.entityTypeManifestCount = infoSet.getFirstNumberValue( + this.id, + TopicTestIdBase + ProjectItemType.entityTypeBehavior + ); + info.itemTypeManifestCount = infoSet.getFirstNumberValue( + this.id, + TopicTestIdBase + ProjectItemType.itemTypeBehavior + ); + info.blockTypeManifestCount = infoSet.getFirstNumberValue( + this.id, + TopicTestIdBase + ProjectItemType.blockTypeBehavior ); - info.unknownJsonCount = infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.json); - info.entityTypeManifestCount = infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.entityTypeBehavior); - info.itemTypeManifestCount = infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.itemTypeBehavior); - info.blockTypeManifestCount = infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.blockTypeBehavior); info.resourcePackManifestCount = infoSet.getFirstNumberValue( - "ITEMS", - 100 + ProjectItemType.resourcePackManifestJson + this.id, + TopicTestIdBase + ProjectItemType.resourcePackManifestJson ); info.worldCount = - infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.MCWorld) + - infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.worldFolder); + infoSet.getFirstNumberValue(this.id, TopicTestIdBase + ProjectItemType.MCWorld) + + infoSet.getFirstNumberValue(this.id, TopicTestIdBase + ProjectItemType.worldFolder); - info.entityTypeResourceCount = infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.entityTypeResource); + info.entityTypeResourceCount = infoSet.getFirstNumberValue( + this.id, + TopicTestIdBase + ProjectItemType.entityTypeResource + ); - info.behaviorPackAnimationCount = infoSet.getFirstNumberValue("ITEMS", 100 + ProjectItemType.animationBehaviorJson); + info.behaviorPackAnimationCount = infoSet.getFirstNumberValue( + this.id, + TopicTestIdBase + ProjectItemType.animationBehaviorJson + ); info.behaviorPackAnimationControllerCount = infoSet.getFirstNumberValue( - "ITEMS", - 100 + ProjectItemType.animationControllerBehaviorJson + this.id, + TopicTestIdBase + ProjectItemType.animationControllerBehaviorJson ); } @@ -82,7 +99,7 @@ export default class ItemCountsInfoGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 100 + i, + TopicTestIdBase + i, ProjectItemUtilities.getDescriptionForType(i) + " item count", undefined, typeCounts[i] diff --git a/app/src/info/JsonFileTagsInfoGenerator.ts b/app/src/info/JsonFileTagsInfoGenerator.ts index 0c356c22..5b723558 100644 --- a/app/src/info/JsonFileTagsInfoGenerator.ts +++ b/app/src/info/JsonFileTagsInfoGenerator.ts @@ -11,35 +11,31 @@ import IFile from "../storage/IFile"; import ZipStorage from "../storage/ZipStorage"; import ProjectInfoSet from "./ProjectInfoSet"; import ContentIndex, { AnnotationCategories } from "../core/ContentIndex"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; const tagAllowList = ["render_method", "min_difficulty", "cause", "effect_name", "entity_type", "event_name"]; const numericAllowList: string[] = ["max_stack_size"]; const boolAllowList: string[] = ["fire_immune", "burns_in_daylight", "hand_equipped", "stacked_by_data"]; +export enum JsonFileTagsInfoGeneratorTest { + entityType = 1, + blockType = 2, + itemType = 3, + terrainTexture = 4, + itemTexture = 5, + soundDefinition = 6, + musicDefinition = 7, + sound = 8, +} + export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator { id = "JSONTAGS"; title = "JSON Tags"; getTopicData(topicId: number) { - switch (topicId) { - case 1: - return { title: "Entity Type" }; - case 2: - return { title: "Block Type" }; - case 3: - return { title: "Item Type" }; - case 4: - return { title: "Terrain Type" }; - case 5: - return { title: "Item Type" }; - case 6: - return { title: "Sound definitions" }; - case 7: - return { title: "Music definitions" }; - case 8: - return { title: "Sounds" }; - } - return { title: topicId.toString() }; + return { + title: ProjectInfoUtilities.getTitleFromEnum(JsonFileTagsInfoGeneratorTest, topicId), + }; } async generate(project: Project, contentIndex: ContentIndex): Promise { @@ -100,7 +96,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 1, + JsonFileTagsInfoGeneratorTest.entityType, "Entity file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -145,7 +141,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 3, + JsonFileTagsInfoGeneratorTest.itemType, "Item file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -170,7 +166,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 2, + JsonFileTagsInfoGeneratorTest.blockType, "Block file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -246,7 +242,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 4, + JsonFileTagsInfoGeneratorTest.terrainTexture, "Terrrain texture file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -265,7 +261,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 5, + JsonFileTagsInfoGeneratorTest.itemTexture, "Item texture file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -284,7 +280,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 6, + JsonFileTagsInfoGeneratorTest.soundDefinition, "Sound definitions file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -307,7 +303,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 7, + JsonFileTagsInfoGeneratorTest.musicDefinition, "Music definitions file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath @@ -326,7 +322,7 @@ export default class JsonFileTagsInfoGenerator implements IProjectInfoGenerator const pi = new ProjectInfoItem( InfoItemType.info, this.id, - 8, + JsonFileTagsInfoGeneratorTest.sound, "Sounds file", project.getItemByProjectPath(file.storageRelativePath), file.storageRelativePath diff --git a/app/src/info/LineSizeInfoGenerator.ts b/app/src/info/LineSizeInfoGenerator.ts index b45d6000..7f1c7ad9 100644 --- a/app/src/info/LineSizeInfoGenerator.ts +++ b/app/src/info/LineSizeInfoGenerator.ts @@ -12,14 +12,16 @@ import ProjectInfoSet from "./ProjectInfoSet"; import ProjectItemUtilities from "../app/ProjectItemUtilities"; import ContentIndex from "../core/ContentIndex"; +const TopicTestIdBase = 100; + export default class LineSizeInfoGenerator implements IProjectInfoGenerator { id = "LINESIZE"; title = "File Line/Size Information"; getTopicData(topicId: number) { - if (topicId >= 100) { + if (topicId >= TopicTestIdBase) { return { - title: ProjectItemUtilities.getDescriptionForType(topicId - 100), + title: ProjectItemUtilities.getDescriptionForType(topicId - TopicTestIdBase), }; } @@ -53,7 +55,13 @@ export default class LineSizeInfoGenerator implements IProjectInfoGenerator { " file " + (ProjectItemUtilities.isBinaryType(pi.itemType) ? "size" : "lines"); - projInfoItem = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 100 + pi.itemType, name, pi); + projInfoItem = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + TopicTestIdBase + pi.itemType, + name, + pi + ); itemsByType[pi.itemType] = projInfoItem; items.push(projInfoItem); } diff --git a/app/src/info/PackInfoGenerator.ts b/app/src/info/PackInfoGenerator.ts index 346913db..74b15060 100644 --- a/app/src/info/PackInfoGenerator.ts +++ b/app/src/info/PackInfoGenerator.ts @@ -12,8 +12,31 @@ import ContentIndex from "../core/ContentIndex"; import StorageUtilities from "../storage/StorageUtilities"; import Utilities from "../core/Utilities"; import MinecraftUtilities from "../minecraft/MinecraftUtilities"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +const MemoryTierBase = 40; + +export enum PackInfoGeneratorTest { + behaviorPackMinEngineVersion = 1, + behaviorPackUuid = 2, + behaviorPackManfiest = 3, + behaviorPackName = 4, + behaviorPackDescription = 5, + behaviorPackId = 6, + resourcePackMinEngineVersion = 11, + resourcePackUuid = 12, + resourcePackManifest = 13, + resourcePackName = 14, + resourcePackDescription = 15, + resourcePackId = 16, + resourcePackFormatVersion = 17, + subPacks = 18, + resourcePackIcon = 21, + behaviorPackIcon = 22, + skinPackIcon = 23, +} -export default class PackInformationGenerator implements IProjectInfoGenerator { +export default class PackInfoGenerator implements IProjectInfoGenerator { id = "PACK"; title = "General info"; @@ -24,31 +47,44 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { } summarize(info: any, infoSet: ProjectInfoSet) { - info.defaultBehaviorPackUuid = infoSet.getFirstStringValue("PACK", 2); - info.defaultIcon = infoSet.getFirstStringValue("PACK", 21); + info.defaultBehaviorPackUuid = infoSet.getFirstStringValue(this.id, PackInfoGeneratorTest.behaviorPackUuid); + + info.defaultIcon = infoSet.getFirstStringValue(this.id, 21); if (info.defaultIcon === undefined) { - info.defaultIcon = infoSet.getFirstStringValue("PACK", 22); + info.defaultIcon = infoSet.getFirstStringValue(this.id, 22); } // because it's heavy, remove pack icon from this list of issues. Though the summarize op is probably // the wrong place to do this. - infoSet.removeItems("PACK", [21, 22]); - - info.defaultBehaviorPackMinEngineVersion = infoSet.getFirstNumberArrayValue("PACK", 1); - info.defaultBehaviorPackName = infoSet.getFirstNumberArrayValue("PACK", 4); - info.defaultBehaviorPackDescription = infoSet.getFirstNumberArrayValue("PACK", 5); - info.defaultResourcePackUuid = infoSet.getFirstStringValue("PACK", 12); - info.defaultResourcePackMinEngineVersion = infoSet.getFirstNumberArrayValue("PACK", 11); - info.defaultResourcePackName = infoSet.getFirstNumberArrayValue("PACK", 14); - info.defaultResourcePackDescription = infoSet.getFirstNumberArrayValue("PACK", 15); - - info.subpackCount = infoSet.getFirstNumberValue("PACK", 18); - - info.subpackTier1Count = infoSet.getCount("PACK", 41); - info.subpackTier2Count = infoSet.getCount("PACK", 42); - info.subpackTier3Count = infoSet.getCount("PACK", 43); - info.subpackTier4Count = infoSet.getCount("PACK", 44); + infoSet.removeItems(this.id, [21, 22]); + + info.defaultBehaviorPackMinEngineVersion = infoSet.getFirstNumberArrayValue( + this.id, + PackInfoGeneratorTest.behaviorPackMinEngineVersion + ); + info.defaultBehaviorPackName = infoSet.getFirstNumberArrayValue(this.id, PackInfoGeneratorTest.behaviorPackName); + info.defaultBehaviorPackDescription = infoSet.getFirstNumberArrayValue( + this.id, + PackInfoGeneratorTest.behaviorPackDescription + ); + info.defaultResourcePackUuid = infoSet.getFirstStringValue(this.id, PackInfoGeneratorTest.resourcePackUuid); + info.defaultResourcePackMinEngineVersion = infoSet.getFirstNumberArrayValue( + this.id, + PackInfoGeneratorTest.resourcePackMinEngineVersion + ); + info.defaultResourcePackName = infoSet.getFirstNumberArrayValue(this.id, PackInfoGeneratorTest.resourcePackName); + info.defaultResourcePackDescription = infoSet.getFirstNumberArrayValue( + this.id, + PackInfoGeneratorTest.resourcePackDescription + ); + + info.subpackCount = infoSet.getFirstNumberValue(this.id, 18); + + info.subpackTier1Count = infoSet.getCount(this.id, 41); + info.subpackTier2Count = infoSet.getCount(this.id, 42); + info.subpackTier3Count = infoSet.getCount(this.id, 43); + info.subpackTier4Count = infoSet.getCount(this.id, 44); } async generate(project: Project, contentIndex: ContentIndex): Promise { @@ -68,15 +104,12 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { await pi.file.loadContent(false); if (pi.file.content && typeof pi.file.content !== "string") { - let index = 21; - let description = "Resource pack icon"; + let index = PackInfoGeneratorTest.resourcePackIcon; if (MinecraftUtilities.pathLooksLikeBehaviorPackName(pi.file.storageRelativePath)) { - index = 22; - description = "Behavior pack icon"; + index = PackInfoGeneratorTest.behaviorPackIcon; } else if (MinecraftUtilities.pathLooksLikeSkinPackName(pi.file.storageRelativePath)) { - index = 23; - description = "Skin pack icon"; + index = PackInfoGeneratorTest.skinPackIcon; } items.push( @@ -84,7 +117,7 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { InfoItemType.info, this.id, index, - description, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, index), pi, Utilities.uint8ArrayToBase64(pi.file.content) ) @@ -96,17 +129,45 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { const obj = (await pi.getJsonObject()) as IAddonManifest; if (obj) { - items.push(new ProjectInfoItem(InfoItemType.info, this.id, 3, "Behavior pack manifest", pi, obj)); + items.push( + new ProjectInfoItem( + InfoItemType.info, + this.id, + PackInfoGeneratorTest.behaviorPackManfiest, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.behaviorPackManfiest), + pi, + obj + ) + ); if (obj.format_version) { items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 1, "Behavior pack format version", pi, obj.format_version) + new ProjectInfoItem( + InfoItemType.info, + this.id, + PackInfoGeneratorTest.behaviorPackMinEngineVersion, + ProjectInfoUtilities.getTitleFromEnum( + PackInfoGeneratorTest, + PackInfoGeneratorTest.behaviorPackMinEngineVersion + ), + pi, + obj.format_version + ) ); } if (obj.header) { if (obj.header.uuid) { - items.push(new ProjectInfoItem(InfoItemType.info, this.id, 2, "Behavior pack UUID", pi, obj.header.uuid)); + items.push( + new ProjectInfoItem( + InfoItemType.info, + this.id, + PackInfoGeneratorTest.behaviorPackUuid, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.behaviorPackUuid), + pi, + obj.header.uuid + ) + ); } if (obj.header.uuid && obj.header.version) { @@ -115,8 +176,8 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 6, - "Behavior pack Id", + PackInfoGeneratorTest.behaviorPackId, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.behaviorPackId), pi, obj.header.uuid + "|" + @@ -135,8 +196,8 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 4, - "Behavior pack name", + PackInfoGeneratorTest.behaviorPackName, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.behaviorPackName), pi, project.loc.getExpandedValue(obj.header.name) ) @@ -148,8 +209,11 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 5, - "Behavior pack description", + PackInfoGeneratorTest.behaviorPackDescription, + ProjectInfoUtilities.getTitleFromEnum( + PackInfoGeneratorTest, + PackInfoGeneratorTest.behaviorPackDescription + ), pi, project.loc.getExpandedValue(obj.header.description) ) @@ -161,8 +225,11 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 1, - "Behavior pack min_engine version", + PackInfoGeneratorTest.behaviorPackMinEngineVersion, + ProjectInfoUtilities.getTitleFromEnum( + PackInfoGeneratorTest, + PackInfoGeneratorTest.behaviorPackMinEngineVersion + ), pi, obj.header.min_engine_version ) @@ -174,7 +241,16 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { const obj = (await pi.getJsonObject()) as IResourcePackManifest; if (obj) { - items.push(new ProjectInfoItem(InfoItemType.info, this.id, 13, "Resource pack manifest", pi, obj)); + items.push( + new ProjectInfoItem( + InfoItemType.info, + this.id, + PackInfoGeneratorTest.resourcePackManifest, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.resourcePackManifest), + pi, + obj + ) + ); if (obj.subpacks) { if (Array.isArray(obj.subpacks)) { @@ -186,8 +262,8 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 40 + sp.memory_tier, - "Subpack Memory Tier", + MemoryTierBase + sp.memory_tier, + "Subpack Memory Tier " + sp.memory_tier, pi, sp.name ) @@ -202,8 +278,11 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 10, - "Resource pack format version", + PackInfoGeneratorTest.resourcePackFormatVersion, + ProjectInfoUtilities.getTitleFromEnum( + PackInfoGeneratorTest, + PackInfoGeneratorTest.resourcePackFormatVersion + ), pi, obj.format_version ) @@ -213,7 +292,14 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { if (obj.header) { if (obj.header.uuid) { items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 12, "Resource pack UUID", pi, obj.header.uuid) + new ProjectInfoItem( + InfoItemType.info, + this.id, + PackInfoGeneratorTest.resourcePackUuid, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.resourcePackUuid), + pi, + obj.header.uuid + ) ); } if (obj.header.uuid && obj.header.version) { @@ -222,8 +308,8 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 16, - "Resource pack Id", + PackInfoGeneratorTest.resourcePackId, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.resourcePackId), pi, obj.header.uuid + "|" + @@ -242,8 +328,8 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 14, - "Resource pack name", + PackInfoGeneratorTest.resourcePackName, + ProjectInfoUtilities.getTitleFromEnum(PackInfoGeneratorTest, PackInfoGeneratorTest.resourcePackName), pi, project.loc.getExpandedValue(obj.header.name) ) @@ -255,8 +341,11 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 15, - "Resource pack description", + PackInfoGeneratorTest.resourcePackDescription, + ProjectInfoUtilities.getTitleFromEnum( + PackInfoGeneratorTest, + PackInfoGeneratorTest.resourcePackDescription + ), pi, project.loc.getExpandedValue(obj.header.description) ) @@ -268,8 +357,11 @@ export default class PackInformationGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.info, this.id, - 11, - "Behavior pack min_engine version", + PackInfoGeneratorTest.resourcePackMinEngineVersion, + ProjectInfoUtilities.getTitleFromEnum( + PackInfoGeneratorTest, + PackInfoGeneratorTest.resourcePackMinEngineVersion + ), pi, obj.header.min_engine_version ) diff --git a/app/src/info/PackSizeInfoGenerator.ts b/app/src/info/PackSizeInfoGenerator.ts index 738491ce..516f2f74 100644 --- a/app/src/info/PackSizeInfoGenerator.ts +++ b/app/src/info/PackSizeInfoGenerator.ts @@ -9,6 +9,18 @@ import ProjectInfoSet from "./ProjectInfoSet"; import ContentIndex from "../core/ContentIndex"; import IFolder from "../storage/IFolder"; import StorageUtilities from "../storage/StorageUtilities"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum PackSizeInfoGeneratorTest { + overallSize = 1, + fileCount = 2, + folderCount = 3, + contentSize = 4, + contentFileCount = 5, + contentFolderCount = 6, + exceedsRecommendedAddonSize = 401, + exceedsRecommendedPackageSize = 402, +} export interface IPackSizeInfoGeneratorResults { size: number; @@ -26,45 +38,18 @@ export default class PackSizeInfoGenerator implements IProjectInfoGenerator { performAddOnValidations = false; getTopicData(topicId: number) { - switch (topicId) { - case 1: - return { - title: "Overall Size", - }; - case 2: - return { - title: "Overall File Count", - }; - case 3: - return { - title: "Overall Folder Count", - }; - case 4: - return { - title: "Content Size", - }; - case 5: - return { - title: "Content File Count", - }; - case 6: - return { - title: "Content Folder Count", - }; - } - return { - title: topicId.toString(), + title: ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, topicId), }; } summarize(info: any, infoSet: ProjectInfoSet) { - info.overallSize = infoSet.getFirstNumberValue(this.id, 1); - info.fileCounts = infoSet.getFirstNumberValue(this.id, 2); - info.folderCounts = infoSet.getFirstNumberValue(this.id, 3); - info.contentSize = infoSet.getFirstNumberValue(this.id, 4); - info.contentFileCounts = infoSet.getFirstNumberValue(this.id, 5); - info.contentFolderCounts = infoSet.getFirstNumberValue(this.id, 6); + info.overallSize = infoSet.getFirstNumberValue(this.id, PackSizeInfoGeneratorTest.overallSize); + info.fileCounts = infoSet.getFirstNumberValue(this.id, PackSizeInfoGeneratorTest.fileCount); + info.folderCounts = infoSet.getFirstNumberValue(this.id, PackSizeInfoGeneratorTest.folderCount); + info.contentSize = infoSet.getFirstNumberValue(this.id, PackSizeInfoGeneratorTest.contentSize); + info.contentFileCounts = infoSet.getFirstNumberValue(this.id, PackSizeInfoGeneratorTest.contentFileCount); + info.contentFolderCounts = infoSet.getFirstNumberValue(this.id, PackSizeInfoGeneratorTest.contentFolderCount); } async generate(project: Project, contentIndex: ContentIndex): Promise { @@ -81,27 +66,55 @@ export default class PackSizeInfoGenerator implements IProjectInfoGenerator { await this.processFolder(project, await project.ensureProjectFolder(), genItems, contentIndex, results, 0, false); genItems.push( - new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 1, "Overall Size", undefined, results.size) + new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + PackSizeInfoGeneratorTest.overallSize, + ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, PackSizeInfoGeneratorTest.overallSize), + undefined, + results.size + ) ); genItems.push( - new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 2, "File Counts", undefined, results.fileCounts) + new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + PackSizeInfoGeneratorTest.fileCount, + ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, PackSizeInfoGeneratorTest.fileCount), + undefined, + results.fileCounts + ) ); genItems.push( - new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 3, "Folder Counts", undefined, results.folderCounts) + new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + PackSizeInfoGeneratorTest.folderCount, + ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, PackSizeInfoGeneratorTest.folderCount), + undefined, + results.folderCounts + ) ); genItems.push( - new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 4, "Content Size", undefined, results.contentSize) + new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + PackSizeInfoGeneratorTest.contentSize, + ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, PackSizeInfoGeneratorTest.contentSize), + undefined, + results.contentSize + ) ); genItems.push( new ProjectInfoItem( InfoItemType.featureAggregate, this.id, - 5, - "Content File Counts", + PackSizeInfoGeneratorTest.contentFileCount, + ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, PackSizeInfoGeneratorTest.contentFileCount), undefined, results.contentFileCounts ) @@ -111,8 +124,8 @@ export default class PackSizeInfoGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.featureAggregate, this.id, - 6, - "Content Folder Counts", + PackSizeInfoGeneratorTest.contentFolderCount, + ProjectInfoUtilities.getTitleFromEnum(PackSizeInfoGeneratorTest, PackSizeInfoGeneratorTest.contentFolderCount), undefined, results.contentFolderCounts ) @@ -123,8 +136,11 @@ export default class PackSizeInfoGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.error, this.id, - 401, - "Exceeds recommended addon size", + PackSizeInfoGeneratorTest.exceedsRecommendedAddonSize, + ProjectInfoUtilities.getTitleFromEnum( + PackSizeInfoGeneratorTest, + PackSizeInfoGeneratorTest.exceedsRecommendedAddonSize + ), undefined, results.contentSize ) @@ -134,8 +150,11 @@ export default class PackSizeInfoGenerator implements IProjectInfoGenerator { new ProjectInfoItem( InfoItemType.error, this.id, - 402, - "Exceeds recommended package size", + PackSizeInfoGeneratorTest.exceedsRecommendedPackageSize, + ProjectInfoUtilities.getTitleFromEnum( + PackSizeInfoGeneratorTest, + PackSizeInfoGeneratorTest.exceedsRecommendedPackageSize + ), undefined, results.contentSize ) diff --git a/app/src/info/PathLengthFileGenerator.ts b/app/src/info/PathLengthFileGenerator.ts index a8d0dd36..e5aac1d4 100644 --- a/app/src/info/PathLengthFileGenerator.ts +++ b/app/src/info/PathLengthFileGenerator.ts @@ -9,6 +9,11 @@ import ProjectInfoSet from "./ProjectInfoSet"; import Project from "../app/Project"; import ContentIndex from "../core/ContentIndex"; +export enum PathLengthFileGeneratorTest { + filePathExceeds8DirectorySegments = 2, + filePathExceeds80Characters = 3, +} + export default class PathLengthFileGenerator implements IProjectFileInfoGenerator { id = "PATHLENGTH"; title = "Path Length"; @@ -65,7 +70,7 @@ export default class PathLengthFileGenerator implements IProjectFileInfoGenerato new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 2, + PathLengthFileGeneratorTest.filePathExceeds8DirectorySegments, `File path contains 8 or more directory segments, and may not run on all devices`, project.getItemByExtendedOrProjectPath(file.extendedPath), path @@ -78,7 +83,7 @@ export default class PathLengthFileGenerator implements IProjectFileInfoGenerato new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 3, + PathLengthFileGeneratorTest.filePathExceeds80Characters, `File path contains more than 80 characters, and may not run on all devices`, project.getItemByExtendedOrProjectPath(file.extendedPath), path diff --git a/app/src/info/ProjectInfoSet.ts b/app/src/info/ProjectInfoSet.ts index bd824b2d..31faf905 100644 --- a/app/src/info/ProjectInfoSet.ts +++ b/app/src/info/ProjectInfoSet.ts @@ -40,19 +40,19 @@ export default class ProjectInfoSet { switch (suiteName.toLowerCase()) { case "addon": case "addons": - return ProjectInfoSuite.addOn; + return ProjectInfoSuite.cooperativeAddOn; case "currentplatform": return ProjectInfoSuite.currentPlatformVersions; default: - return ProjectInfoSuite.allExceptAddOn; + return ProjectInfoSuite.default; // default is all except cooperative add-on } } static getSuiteString(suite: ProjectInfoSuite) { switch (suite) { - case ProjectInfoSuite.addOn: + case ProjectInfoSuite.cooperativeAddOn: return "addon"; case ProjectInfoSuite.currentPlatformVersions: @@ -167,7 +167,7 @@ export default class ProjectInfoSet { if (suite) { this.suite = suite; } else { - this.suite = ProjectInfoSuite.allExceptAddOn; + this.suite = ProjectInfoSuite.default; } if (index) { @@ -232,7 +232,7 @@ export default class ProjectInfoSet { matchesSuite( generator: IProjectFileInfoGenerator | IProjectInfoGenerator | IProjectItemInfoGenerator | IProjectInfoGeneratorBase ) { - if (this.suite === ProjectInfoSuite.allExceptAddOn && generator.id.indexOf("ADDON") < 0) { + if (this.suite === ProjectInfoSuite.default && generator.id.indexOf("CADDON") < 0) { return true; } @@ -247,9 +247,9 @@ export default class ProjectInfoSet { } } - if (this.suite === ProjectInfoSuite.addOn) { + if (this.suite === ProjectInfoSuite.cooperativeAddOn) { if ( - generator.id.indexOf("ADDON") >= 0 || + generator.id.indexOf("CADDON") >= 0 || generator.id === "PACKSIZE" || generator.id === "STRICT" || generator.id === "TEXTURE" || diff --git a/app/src/info/ProjectInfoUtilities.ts b/app/src/info/ProjectInfoUtilities.ts new file mode 100644 index 00000000..6b98e2f8 --- /dev/null +++ b/app/src/info/ProjectInfoUtilities.ts @@ -0,0 +1,11 @@ +import Utilities from "../core/Utilities"; + +export default class ProjectInfoUtilities { + static getTitleFromEnum(categoryEnum: { [name: number]: string }, topicId: number) { + if (categoryEnum[topicId]) { + return Utilities.humanifyJsName(categoryEnum[topicId]); + } + + return "General Item " + topicId; + } +} diff --git a/app/src/info/SchemaItemInfoGenerator.ts b/app/src/info/SchemaItemInfoGenerator.ts index 4c185b9c..a48ce972 100644 --- a/app/src/info/SchemaItemInfoGenerator.ts +++ b/app/src/info/SchemaItemInfoGenerator.ts @@ -17,6 +17,13 @@ import ContentIndex from "../core/ContentIndex"; import MinecraftDefinitions from "../minecraft/MinecraftDefinitions"; import ProjectItemUtilities from "../app/ProjectItemUtilities"; +const JsonSchemaErrorBase = 100; +const NotCurrentFormatVersionBase = 1100; + +export enum SchemaItemInfoGeneratorTest { + couldNotParseJson = 1, +} + export default class SchemaItemInfoGenerator implements IProjectInfoItemGenerator { id = "JSON"; title = "JSON Schema Validation"; @@ -101,7 +108,13 @@ export default class SchemaItemInfoGenerator implements IProjectInfoItemGenerato } items.push( - new ProjectInfoItem(InfoItemType.error, this.id, 1, "Could not parse JSON - " + errorMess, projectItem) + new ProjectInfoItem( + InfoItemType.error, + this.id, + SchemaItemInfoGeneratorTest.couldNotParseJson, + "Could not parse JSON - " + errorMess, + projectItem + ) ); } @@ -130,7 +143,7 @@ export default class SchemaItemInfoGenerator implements IProjectInfoItemGenerato new ProjectInfoItem( InfoItemType.info, this.id, - 1100 + projectItem.itemType, + NotCurrentFormatVersionBase + projectItem.itemType, ProjectItemUtilities.getDescriptionForType(projectItem.itemType) + " is not at a current format version" + fvStr, @@ -177,6 +190,10 @@ export default class SchemaItemInfoGenerator implements IProjectInfoItemGenerato errorContent = serial; } + if (errorContent && errorContent.length > 100) { + errorContent = errorContent.substring(0, 99); + } + let data = undefined; if (error.params) { @@ -202,7 +219,9 @@ export default class SchemaItemInfoGenerator implements IProjectInfoItemGenerato data += " "; } - data += "(" + key + ": " + val + ")"; + if (data.length < 100 && val.length < 100 && key.length < 100) { + data += "(" + key + ": " + val + ")"; + } } } } @@ -211,7 +230,7 @@ export default class SchemaItemInfoGenerator implements IProjectInfoItemGenerato new ProjectInfoItem( InfoItemType.warning, this.id, - 100 + projectItem.itemType, + JsonSchemaErrorBase + projectItem.itemType, message, projectItem, data, diff --git a/app/src/info/StrictPlatformInfoGenerator.ts b/app/src/info/StrictPlatformInfoGenerator.ts index 7c971ab5..a50b5a80 100644 --- a/app/src/info/StrictPlatformInfoGenerator.ts +++ b/app/src/info/StrictPlatformInfoGenerator.ts @@ -6,30 +6,25 @@ import Project from "../app/Project"; import IProjectInfoGenerator from "./IProjectInfoGenerator"; import { ProjectItemType } from "../app/IProjectItemData"; import { InfoItemType } from "./IInfoItemData"; -import { IProjectInfoTopicData } from "./IProjectInfoGeneratorBase"; import EntityTypeDefinition from "../minecraft/EntityTypeDefinition"; import ProjectInfoSet from "./ProjectInfoSet"; import ContentIndex from "../core/ContentIndex"; import ItemTypeBehaviorDefinition from "../minecraft/ItemTypeBehaviorDefinition"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum StrictPlatformInfoGeneratorTest { + entityTypeUsesAMinecraftIdentifier = 100, + entityTypeUsesAMinecraftRuntimeIdentifier = 101, + itemTypeUsesAMinecraftIdentifier = 104, +} export default class StrictPlatformInfoGenerator implements IProjectInfoGenerator { id = "STRICT"; title = "Strict Platform Info Generator"; - getTopicData(topicId: number): IProjectInfoTopicData | undefined { - switch (topicId) { - case 100: - return { - title: "Uses a minecraft identifier", - }; - - case 101: - return { - title: "Uses a minecraft runtime identifier", - }; - } + getTopicData(topicId: number) { return { - title: topicId.toString(), + title: ProjectInfoUtilities.getTitleFromEnum(StrictPlatformInfoGeneratorTest, topicId), }; } @@ -60,7 +55,7 @@ export default class StrictPlatformInfoGenerator implements IProjectInfoGenerato new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 100, + StrictPlatformInfoGeneratorTest.entityTypeUsesAMinecraftIdentifier, `Uses a minecraft: identifier override`, pi, desc.identifier @@ -77,7 +72,7 @@ export default class StrictPlatformInfoGenerator implements IProjectInfoGenerato new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 101, + StrictPlatformInfoGeneratorTest.entityTypeUsesAMinecraftRuntimeIdentifier, `Uses a runtime_identifier override`, pi, desc.runtime_identifier @@ -104,7 +99,7 @@ export default class StrictPlatformInfoGenerator implements IProjectInfoGenerato new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 104, + StrictPlatformInfoGeneratorTest.itemTypeUsesAMinecraftIdentifier, `Uses a minecraft: identifier override`, pi, desc.identifier diff --git a/app/src/info/TextureImageInfoGenerator.ts b/app/src/info/TextureImageInfoGenerator.ts index dded487b..7df9dae2 100644 --- a/app/src/info/TextureImageInfoGenerator.ts +++ b/app/src/info/TextureImageInfoGenerator.ts @@ -11,6 +11,12 @@ import Database from "../minecraft/Database"; import StorageUtilities from "../storage/StorageUtilities"; import ContentIndex from "../core/ContentIndex"; import { Exifr } from "exifr"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum TextureImageInfoGeneratorTest { + textureImages = 1, + imageProcessingError = 401, +} export default class TextureImageInfoGenerator implements IProjectInfoGenerator { id = "TEXTUREIMAGE"; @@ -19,16 +25,9 @@ export default class TextureImageInfoGenerator implements IProjectInfoGenerator performAddOnValidations = false; getTopicData(topicId: number) { - switch (topicId) { - case 1: - return { title: "Texture Images" }; - - case 401: - return { title: "Image Processing Error" }; - - default: - return { title: topicId.toString() }; - } + return { + title: ProjectInfoUtilities.getTitleFromEnum(TextureImageInfoGeneratorTest, topicId), + }; } summarize(info: any, infoSet: ProjectInfoSet) { @@ -38,7 +37,13 @@ export default class TextureImageInfoGenerator implements IProjectInfoGenerator async generate(project: Project, contentIndex: ContentIndex): Promise { const items: ProjectInfoItem[] = []; - const textureImagePi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 1, "Texture Images"); + const textureImagePi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + TextureImageInfoGeneratorTest.textureImages, + "Texture Images" + ); + items.push(textureImagePi); const itemsCopy = project.getItemsCopy(); @@ -65,41 +70,41 @@ export default class TextureImageInfoGenerator implements IProjectInfoGenerator textureImagePi.incrementFeature("Custom Texture"); } - await projectItem.file.loadContent(); + if (projectItem.file.type !== "tga") { + await projectItem.file.loadContent(); - if ( - projectItem.file.content && - projectItem.file.content instanceof Uint8Array && - projectItem.file.type !== "tga" - ) { - const exifr = new Exifr({}); + if (projectItem.file.content && projectItem.file.content instanceof Uint8Array) { + const exifr = new Exifr({}); - try { - await exifr.read(projectItem.file.content); + try { + await exifr.read(projectItem.file.content); - const results = await exifr.parse(); + const results = await exifr.parse(); - if (results.ImageWidth && results.ImageHeight) { - textureImagePi.spectrumIntFeature("ImageWidth", results.ImageWidth); - textureImagePi.spectrumIntFeature("ImageHeight", results.ImageHeight); - textureImagePi.spectrumIntFeature("ImageSize", results.ImageWidth * results.ImageHeight); + if (results.ImageWidth && results.ImageHeight) { + textureImagePi.spectrumIntFeature("ImageWidth", results.ImageWidth); + textureImagePi.spectrumIntFeature("ImageHeight", results.ImageHeight); + textureImagePi.spectrumIntFeature("ImageSize", results.ImageWidth * results.ImageHeight); - if (!isVanilla) { - textureImagePi.spectrumIntFeature("NonVanillaImageSize", results.ImageWidth * results.ImageHeight); + if (!isVanilla) { + textureImagePi.spectrumIntFeature("NonVanillaImageSize", results.ImageWidth * results.ImageHeight); + } } + } catch (e: any) { + items.push( + new ProjectInfoItem( + InfoItemType.error, + this.id, + TextureImageInfoGeneratorTest.imageProcessingError, + `Error processing image`, + projectItem, + e.toString() + ) + ); } - } catch (e: any) { - items.push( - new ProjectInfoItem( - InfoItemType.error, - this.id, - 401, - `Error processing image`, - projectItem, - e.toString() - ) - ); } + + projectItem.file.unload(); } } } diff --git a/app/src/info/TextureInfoGenerator.ts b/app/src/info/TextureInfoGenerator.ts index 4ee8fbe7..2b9b7d8d 100644 --- a/app/src/info/TextureInfoGenerator.ts +++ b/app/src/info/TextureInfoGenerator.ts @@ -18,6 +18,11 @@ import Database from "../minecraft/Database"; import JsonUIResourceDefinition from "../minecraft/JsonUIResourceDefinition"; import { IJsonUIControl } from "../minecraft/IJsonUIScreen"; import ContentIndex from "../core/ContentIndex"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum TextureInfoGeneratorTest { + textures = 1, +} export default class TextureInfoGenerator implements IProjectInfoGenerator { id = "TEXTURE"; @@ -26,17 +31,13 @@ export default class TextureInfoGenerator implements IProjectInfoGenerator { performAddOnValidations = false; getTopicData(topicId: number) { - switch (topicId) { - case 1: - return { title: "Textures" }; - - default: - return { title: topicId.toString() }; - } + return { + title: ProjectInfoUtilities.getTitleFromEnum(TextureInfoGeneratorTest, topicId), + }; } summarize(info: any, infoSet: ProjectInfoSet) { - info.textureCount = infoSet.getSummedNumberValue("TEXTURE", 1); + info.textureCount = infoSet.getSummedNumberValue("TEXTURE", TextureInfoGeneratorTest.textures); } async generate(project: Project, contentIndex: ContentIndex): Promise { diff --git a/app/src/info/UnknownFileGenerator.ts b/app/src/info/UnknownFileGenerator.ts index e3b90735..c6fdb7cf 100644 --- a/app/src/info/UnknownFileGenerator.ts +++ b/app/src/info/UnknownFileGenerator.ts @@ -10,6 +10,10 @@ import ProjectInfoSet from "./ProjectInfoSet"; import Project from "../app/Project"; import ContentIndex from "../core/ContentIndex"; +export enum UnknownFileGeneratorTest { + unknownTypeFileFound = 2, +} + export default class UnknownFileGenerator implements IProjectFileInfoGenerator { id = "UNKFILE"; title = "Unknown files"; @@ -32,8 +36,8 @@ export default class UnknownFileGenerator implements IProjectFileInfoGenerator { new ProjectInfoItem( InfoItemType.testCompleteFail, this.id, - 2, - `Unknown type ${ext} file ${file.storageRelativePath} found`, + UnknownFileGeneratorTest.unknownTypeFileFound, + `Unknown type ${ext} file found`, project.getItemByExtendedOrProjectPath(file.extendedPath), file.extendedPath ) diff --git a/app/src/info/UnknownItemGenerator.ts b/app/src/info/UnknownItemGenerator.ts index cce716ba..72a4744e 100644 --- a/app/src/info/UnknownItemGenerator.ts +++ b/app/src/info/UnknownItemGenerator.ts @@ -5,6 +5,11 @@ import { ProjectItemType } from "../app/IProjectItemData"; import { InfoItemType } from "./IInfoItemData"; import ProjectInfoSet from "./ProjectInfoSet"; import ContentIndex from "../core/ContentIndex"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum UnknownItemGeneratorTest { + unknownItemTypeFound, +} export default class UnknownFileGenerator implements IProjectInfoItemGenerator { id = "UNKJSON"; @@ -12,7 +17,7 @@ export default class UnknownFileGenerator implements IProjectInfoItemGenerator { getTopicData(topicId: number) { return { - title: topicId.toString(), + title: ProjectInfoUtilities.getTitleFromEnum(UnknownItemGeneratorTest, topicId), }; } @@ -23,7 +28,13 @@ export default class UnknownFileGenerator implements IProjectInfoItemGenerator { if (projectItem.itemType === ProjectItemType.json) { items.push( - new ProjectInfoItem(InfoItemType.testCompleteFail, this.id, 0, "Unknown JSON file found", projectItem) + new ProjectInfoItem( + InfoItemType.testCompleteFail, + this.id, + UnknownItemGeneratorTest.unknownItemTypeFound, + "Unknown JSON file found", + projectItem + ) ); } diff --git a/app/src/info/WorldDataInfoGenerator.ts b/app/src/info/WorldDataInfoGenerator.ts index 28ec82bd..54902f40 100644 --- a/app/src/info/WorldDataInfoGenerator.ts +++ b/app/src/info/WorldDataInfoGenerator.ts @@ -14,11 +14,31 @@ import CommandStructure from "../app/CommandStructure"; import ProjectInfoSet from "./ProjectInfoSet"; import CommandRegistry from "../app/CommandRegistry"; import Dialogue from "../minecraft/Dialogue"; -import ProjectItemUtilities from "../app/ProjectItemUtilities"; import ContentIndex, { AnnotationCategories } from "../core/ContentIndex"; import { NbtTagType } from "../minecraft/NbtBinaryTag"; import AnimationControllerBehaviorDefinition from "../minecraft/AnimationControllerBehaviorDefinition"; import AnimationBehaviorDefinition from "../minecraft/AnimationBehaviorDefinition"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum WorldDataInfoGeneratorTest { + blocks = 1, + blockData = 2, + command = 3, + executeSubCommand = 4, + levelDat = 5, + levelDatExperiments = 6, + subchunklessChunks = 7, + chunks = 8, + unexpectedCommandInMCFunction = 101, + minX = 103, + minZ = 104, + maxX = 105, + maxZ = 106, + unexpectedCommandInCommandBlock = 102, + containsWorldImpactingCommand = 112, + commandIsFromOlderMinecraftVersion = 212, + errorProcessingWorld = 400, +} export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator { id = "WORLDDATA"; @@ -30,40 +50,23 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator performPlatformVersionValidations: boolean = false; getTopicData(topicId: number) { - switch (topicId) { - case 1: - return { title: "Block" }; - case 2: - return { title: "Block Data" }; - case 3: - return { title: "Command" }; - case 4: - return { title: "Execute Sub Command" }; - case 5: - return { title: "Level.dat" }; - case 6: - return { title: "Level.dat Experiments" }; - case 7: - return { title: "Subchunkless Chunks" }; - case 101: - return { title: "Unexpected command in MCFunction" }; - case 102: - return { title: "Unexpected command in Command Block" }; - case 400: - return { title: "Error processing world" }; - } - return { - title: topicId.toString(), + title: ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, topicId), }; } summarize(info: any, infoSet: ProjectInfoSet) { - info.chunkCount = infoSet.getSummedNumberValue("WORLDDATA", 101); + info.chunkCount = infoSet.getSummedNumberValue( + "WORLDDATA", + WorldDataInfoGeneratorTest.unexpectedCommandInMCFunction + ); - info.subchunkLessChunkCount = infoSet.getSummedNumberValue("WORLDDATA", 107); + info.subchunkLessChunkCount = infoSet.getSummedNumberValue( + "WORLDDATA", + WorldDataInfoGeneratorTest.subchunklessChunks + ); - info.worldLoadErrors = infoSet.getCount("WORLDDATA", 400); + info.worldLoadErrors = infoSet.getCount("WORLDDATA", WorldDataInfoGeneratorTest.errorProcessingWorld); } processListOfCommands( @@ -84,7 +87,7 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.warning, this.id, - 112, + WorldDataInfoGeneratorTest.containsWorldImpactingCommand, "Contains command '" + command.name + "' which is impacts the state of the entire world, and generally shouldn't be used in an add-on", @@ -130,44 +133,67 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator const items: ProjectInfoItem[] = []; if ( - projectItem.itemType === ProjectItemType.MCAddon || - projectItem.itemType === ProjectItemType.MCPack || - projectItem.itemType === ProjectItemType.MCProject || - projectItem.itemType === ProjectItemType.js || - projectItem.itemType === ProjectItemType.ts || - projectItem.itemType === ProjectItemType.testJs || - projectItem.itemType === ProjectItemType.structure || - ProjectItemUtilities.isImageType(projectItem.itemType) + projectItem.itemType !== ProjectItemType.MCWorld && + projectItem.itemType !== ProjectItemType.MCTemplate && + projectItem.itemType !== ProjectItemType.worldFolder && + projectItem.itemType !== ProjectItemType.dialogueBehaviorJson && + projectItem.itemType !== ProjectItemType.animationControllerBehaviorJson && + projectItem.itemType !== ProjectItemType.animationBehaviorJson && + projectItem.itemType !== ProjectItemType.MCFunction ) { return items; } - const blocksPi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 1, "Blocks", projectItem); + const blocksPi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + WorldDataInfoGeneratorTest.blocks, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.blocks), + projectItem + ); items.push(blocksPi); - const blockActorsPi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 2, "Block Data", projectItem); + const blockActorsPi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + WorldDataInfoGeneratorTest.blockData, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.blockData), + projectItem + ); items.push(blockActorsPi); - const commandsPi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 3, "Commands", projectItem); + const commandsPi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + WorldDataInfoGeneratorTest.command, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.command), + projectItem + ); items.push(commandsPi); const subCommandsPi = new ProjectInfoItem( InfoItemType.featureAggregate, this.id, - 4, - "Execute Sub Commands", + WorldDataInfoGeneratorTest.executeSubCommand, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.executeSubCommand), projectItem ); items.push(subCommandsPi); - const nbtPi = new ProjectInfoItem(InfoItemType.featureAggregate, this.id, 5, "NBT Tags", projectItem); + const nbtPi = new ProjectInfoItem( + InfoItemType.featureAggregate, + this.id, + WorldDataInfoGeneratorTest.levelDat, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.levelDat), + projectItem + ); items.push(nbtPi); const nbtExperimentsPi = new ProjectInfoItem( InfoItemType.featureAggregate, this.id, - 6, - "NBT Experiment Tags", + WorldDataInfoGeneratorTest.levelDatExperiments, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.levelDatExperiments), projectItem ); items.push(nbtExperimentsPi); @@ -271,8 +297,11 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.error, this.id, - 400, - "World processing error", + WorldDataInfoGeneratorTest.errorProcessingWorld, + ProjectInfoUtilities.getTitleFromEnum( + WorldDataInfoGeneratorTest, + WorldDataInfoGeneratorTest.errorProcessingWorld + ), projectItem, err.message + (err.context ? " - " + err.context : ""), mcworld.name @@ -342,7 +371,15 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator } items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 101, "Chunks", projectItem, mcworld.chunkCount, mcworld.name) + new ProjectInfoItem( + InfoItemType.info, + this.id, + WorldDataInfoGeneratorTest.chunks, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.chunks), + projectItem, + mcworld.chunkCount, + mcworld.name + ) ); let blockCount = 0; @@ -398,7 +435,7 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.recommendation, this.id, - 212, + WorldDataInfoGeneratorTest.commandIsFromOlderMinecraftVersion, "Command '" + cba.command + "' is from an older Minecraft version (" + cba.version + ") ", projectItem, "(Command at location " + cba.x + ", " + cba.y + ", " + cba.z + ")", @@ -417,7 +454,7 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.warning, this.id, - 112, + WorldDataInfoGeneratorTest.containsWorldImpactingCommand, "Contains command '" + command.name + "' which is impacts the state of the entire world, and generally shouldn't be used in an add-on", @@ -447,7 +484,7 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.error, this.id, - 102, + WorldDataInfoGeneratorTest.unexpectedCommandInCommandBlock, "Unexpected command '" + command.name + "'", projectItem, command.name, @@ -489,22 +526,54 @@ export default class WorldDataInfoGenerator implements IProjectInfoItemGenerator blocksPi.data = blockCount; items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 103, "Min X", projectItem, mcworld.minX, mcworld.name) + new ProjectInfoItem( + InfoItemType.info, + this.id, + WorldDataInfoGeneratorTest.minX, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.minX), + projectItem, + mcworld.minX, + mcworld.name + ) ); items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 104, "Min Z", projectItem, mcworld.minZ, mcworld.name) + new ProjectInfoItem( + InfoItemType.info, + this.id, + WorldDataInfoGeneratorTest.minZ, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.minZ), + projectItem, + mcworld.minZ, + mcworld.name + ) ); items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 105, "Max X", projectItem, mcworld.maxX, mcworld.name) + new ProjectInfoItem( + InfoItemType.info, + this.id, + WorldDataInfoGeneratorTest.maxX, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.maxX), + projectItem, + mcworld.maxX, + mcworld.name + ) ); items.push( - new ProjectInfoItem(InfoItemType.info, this.id, 106, "Max Z", projectItem, mcworld.maxZ, mcworld.name) + new ProjectInfoItem( + InfoItemType.info, + this.id, + WorldDataInfoGeneratorTest.maxZ, + ProjectInfoUtilities.getTitleFromEnum(WorldDataInfoGeneratorTest, WorldDataInfoGeneratorTest.maxZ), + projectItem, + mcworld.maxZ, + mcworld.name + ) ); items.push( new ProjectInfoItem( InfoItemType.info, this.id, - 107, + WorldDataInfoGeneratorTest.subchunklessChunks, "Subchunkless Chunks", projectItem, subchunkLessChunkCount, diff --git a/app/src/info/WorldItemInfoGenerator.ts b/app/src/info/WorldItemInfoGenerator.ts index f13b68e5..dbb08378 100644 --- a/app/src/info/WorldItemInfoGenerator.ts +++ b/app/src/info/WorldItemInfoGenerator.ts @@ -9,6 +9,15 @@ import MCWorld from "../minecraft/MCWorld"; import Log from "../core/Log"; import { InfoItemType } from "./IInfoItemData"; import ProjectInfoSet from "./ProjectInfoSet"; +import ProjectInfoUtilities from "./ProjectInfoUtilities"; + +export enum WorldItemInfoGeneratorTest { + betaApisExperiment = 101, + dataDrivenItemsExperiment = 102, + deferredTechnicalPreviewExperiment = 103, + worldName = 108, + worldDescription = 109, +} export default class WorldItemInfoGenerator implements IProjectInfoItemGenerator { id = "WORLD"; @@ -45,8 +54,11 @@ export default class WorldItemInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.info, this.id, - 101, - "Beta APIs experiment", + WorldItemInfoGeneratorTest.betaApisExperiment, + ProjectInfoUtilities.getTitleFromEnum( + WorldItemInfoGeneratorTest, + WorldItemInfoGeneratorTest.betaApisExperiment + ), projectItem, mcworld.betaApisExperiment, mcworld.name @@ -57,8 +69,11 @@ export default class WorldItemInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.info, this.id, - 102, - "Data Driven Items experiment", + WorldItemInfoGeneratorTest.dataDrivenItemsExperiment, + ProjectInfoUtilities.getTitleFromEnum( + WorldItemInfoGeneratorTest, + WorldItemInfoGeneratorTest.dataDrivenItemsExperiment + ), projectItem, mcworld.dataDrivenItemsExperiment, mcworld.name @@ -69,8 +84,11 @@ export default class WorldItemInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.info, this.id, - 103, - "Deferred Technical Preview experiment", + WorldItemInfoGeneratorTest.deferredTechnicalPreviewExperiment, + ProjectInfoUtilities.getTitleFromEnum( + WorldItemInfoGeneratorTest, + WorldItemInfoGeneratorTest.deferredTechnicalPreviewExperiment + ), projectItem, mcworld.deferredTechnicalPreviewExperiment, mcworld.name @@ -94,8 +112,8 @@ export default class WorldItemInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.info, "WORLD", - 108, - "Name", + WorldItemInfoGeneratorTest.worldName, + ProjectInfoUtilities.getTitleFromEnum(WorldItemInfoGeneratorTest, WorldItemInfoGeneratorTest.worldName), projectItem, mcworld.manifest.header.name, mcworld.name @@ -106,8 +124,11 @@ export default class WorldItemInfoGenerator implements IProjectInfoItemGenerator new ProjectInfoItem( InfoItemType.info, "WORLD", - 109, - "Description", + WorldItemInfoGeneratorTest.worldDescription, + ProjectInfoUtilities.getTitleFromEnum( + WorldItemInfoGeneratorTest, + WorldItemInfoGeneratorTest.worldDescription + ), projectItem, mcworld.manifest.header.description, mcworld.name diff --git a/app/src/integrations/BlockbenchModel.ts b/app/src/integrations/BlockbenchModel.ts index 853c30d8..af06e8f0 100644 --- a/app/src/integrations/BlockbenchModel.ts +++ b/app/src/integrations/BlockbenchModel.ts @@ -107,7 +107,7 @@ export default class BlockbenchModel { return { uv: [0, 0], uv_size: [1, 1] }; } - async updateGeometryFromModel(geo: IGeometry) { + async updateGeometryFromModel(geo: IGeometry, formatVersion: number[]) { if (this.data?.resolution) { geo.textureheight = this.data.resolution.height; geo.texturewidth = this.data.resolution.width; @@ -131,7 +131,21 @@ export default class BlockbenchModel { let uvTarg: number[] | IGeometryUVFaces | undefined = undefined; if (elt.box_uv) { - uvTarg = elt.uv_offset; + if (!elt.uv_offset) { + if ( + elt.faces && + elt.faces.east && + elt.faces.east.uv && + elt.faces.east.uv.length >= 1 && + elt.faces.down && + elt.faces.down.uv && + elt.faces.down.uv.length >= 1 + ) { + uvTarg = [elt.faces.east.uv[0], elt.faces.down.uv[1]]; + } + } else { + uvTarg = elt.uv_offset; + } } else if (elt.faces) { uvTarg = { north: this.getMinecraftUVFace(elt.faces.north), @@ -153,6 +167,8 @@ export default class BlockbenchModel { uv: uvTarg as number[] | IGeometryUVFaces, }; + (cube as any).name = elt.name; + if (elt.rotation && elt.rotation.length === 3) { cube.rotation = [-elt.rotation[0], -elt.rotation[1], -elt.rotation[2]]; } @@ -170,7 +186,7 @@ export default class BlockbenchModel { } if (this.data?.outliner) { - this.processOutlineItems(this.data.outliner, bonesByName, cubesById, locatorsById); + this.processOutlineItems(this.data.outliner, bonesByName, cubesById, locatorsById, formatVersion); } for (const boneName in bonesByName) { @@ -185,6 +201,7 @@ export default class BlockbenchModel { bonesByName: { [name: string]: IGeometryBone }, cubesById: { [name: string]: IGeometryBoneCube }, locatorsById: { [name: string]: IBlockbenchElement }, + formatVersion: number[], parent?: IGeometryBone ) { for (const outlineItem of outlineItems) { @@ -229,7 +246,122 @@ export default class BlockbenchModel { } if (outlineItem.children) { - this.processOutlineItems(outlineItem.children, bonesByName, cubesById, locatorsById, bone); + this.processOutlineItems(outlineItem.children, bonesByName, cubesById, locatorsById, formatVersion, bone); + } + + if (bone.cubes) { + // geo fv of 1.8 uses bind_pose_rotation at the bone level rather than per-cube rotation + // also it manages pivot at the bone level + // so "pull up" rotation -> bind_pose_rotation or create new bones + if (formatVersion[0] === 1 && formatVersion[1] === 8 && bone.cubes) { + const newCubesPivot: IGeometryBoneCube[] = []; + let i = 0; + + // promote cubes to their own bones if they have a separate pivot than the governing bone + for (const cube of bone.cubes) { + i++; + let addCube = true; + + if (cube.pivot && bone.pivot && cube.pivot.length === 3 && bone.pivot.length === 3) { + if ( + cube.pivot[0] === bone.pivot[0] && + cube.pivot[1] === bone.pivot[1] && + cube.pivot[2] === bone.pivot[2] + ) { + cube.pivot = undefined; + } else { + addCube = false; + + const newBone: IGeometryBone = { + pivot: cube.pivot, + bind_pose_rotation: cube.rotation, + cubes: [cube], + name: (cube as any).name ? (cube as any).name : bone.name + i.toString(), + parent: bone.parent, + }; + + (cube as any).name = undefined; + cube.pivot = undefined; + cube.rotation = undefined; + + bonesByName[newBone.name] = newBone; + } + } + + if (addCube) { + newCubesPivot.push(cube); + } + } + + i = 0; + const newCubesRotation: IGeometryBoneCube[] = []; + for (const cube of newCubesPivot) { + i++; + let addCube = true; + + if (cube.rotation) { + if (bone.bind_pose_rotation) { + if ( + cube.rotation.length !== 3 || + bone.bind_pose_rotation.length !== 3 || + cube.rotation[0] !== bone.bind_pose_rotation[0] || + cube.rotation[1] !== bone.bind_pose_rotation[1] || + cube.rotation[2] !== bone.bind_pose_rotation[2] + ) { + addCube = false; + + const newBone: IGeometryBone = { + pivot: bone.pivot, + bind_pose_rotation: cube.rotation, + cubes: [cube], + name: (cube as any).name ? (cube as any).name : bone.name + i.toString(), + parent: bone.parent, + }; + + cube.rotation = undefined; + (cube as any).name = undefined; + + bonesByName[newBone.name] = newBone; + } + } else { + bone.bind_pose_rotation = cube.rotation; + cube.rotation = undefined; + } + } else { + if ( + // if the parent has a nontrivial bind pose rotation and this cube has no rotation, put it under its own bone + bone.bind_pose_rotation && + bone.bind_pose_rotation.length === 3 && + (bone.bind_pose_rotation[0] !== 0 || + bone.bind_pose_rotation[1] !== 0 || + bone.bind_pose_rotation[2] !== 0) + ) { + addCube = false; + + const newBone: IGeometryBone = { + pivot: bone.pivot, + cubes: [cube], + name: (cube as any).name ? (cube as any).name : bone.name + i.toString(), + parent: bone.parent, + }; + + (cube as any).name = undefined; + + bonesByName[newBone.name] = newBone; + } + } + + if (addCube) { + newCubesRotation.push(cube); + } + } + + bone.cubes = newCubesRotation; + } + + for (const cube of bone.cubes) { + (cube as any).name = undefined; + } } } } @@ -240,6 +372,7 @@ export default class BlockbenchModel { if (modelId) { let geoToUpdate: IGeometry | undefined = undefined; + let modelGeometryDefinitionToUpdate: ModelGeometryDefinition | undefined = undefined; for (const item of project.items) { if (item.itemType === ProjectItemType.modelGeometryJson && geoToUpdate === undefined) { @@ -250,6 +383,7 @@ export default class BlockbenchModel { if (modelDefOuter && modelDefOuter.definitions) { geoToUpdate = modelDefOuter.getById(modelId); + modelGeometryDefinitionToUpdate = modelDefOuter; } } } else if (item.itemType === ProjectItemType.entityTypeResource) { @@ -330,13 +464,19 @@ export default class BlockbenchModel { if (modelGen.definitions.length >= 0) { geoToUpdate = modelGen.definitions[0]; + + modelGeometryDefinitionToUpdate = modelGen; } } } } - if (geoToUpdate) { - this.updateGeometryFromModel(geoToUpdate); + if (geoToUpdate && modelGeometryDefinitionToUpdate) { + const fv = modelGeometryDefinitionToUpdate?.getFormatVersion(); + + this.updateGeometryFromModel(geoToUpdate, fv); + + modelGeometryDefinitionToUpdate?.persist(); } } @@ -531,7 +671,7 @@ export default class BlockbenchModel { } } - if (!model || model.identifiers.length === 0 || !model.file || !model.wrapper || model.definitions.length === 0) { + if (!model || model.identifiers.length === 0 || !model.file || !model.data || model.definitions.length === 0) { return undefined; } @@ -838,7 +978,7 @@ export default class BlockbenchModel { if (Array.isArray(cube.uv)) { uv = cube.uv; - } else if (cube.uv.east) { + } else if (cube.uv && cube.uv.east) { uv = cube.uv.east.uv; } else { Log.unexpectedContentState("BBMGEB"); @@ -853,7 +993,7 @@ export default class BlockbenchModel { if (Array.isArray(cube.uv)) { uv = cube.uv; - } else if (cube.uv.north) { + } else if (cube.uv && cube.uv.north) { uv = cube.uv.north.uv; } else { Log.unexpectedContentState("BBMGNB"); @@ -873,7 +1013,7 @@ export default class BlockbenchModel { if (Array.isArray(cube.uv)) { uv = cube.uv; - } else if (cube.uv.west) { + } else if (cube.uv && cube.uv.west) { uv = cube.uv.west.uv; } else { Log.unexpectedContentState("BBMGWB"); @@ -893,7 +1033,7 @@ export default class BlockbenchModel { if (Array.isArray(cube.uv)) { uv = cube.uv; - } else if (cube.uv.south) { + } else if (cube.uv && cube.uv.south) { uv = cube.uv.south.uv; } else { Log.unexpectedContentState("BBMGWB"); diff --git a/app/src/local/JsEslintInfoGenerator.ts b/app/src/local/JsEslintInfoGenerator.ts deleted file mode 100644 index 18d6276c..00000000 --- a/app/src/local/JsEslintInfoGenerator.ts +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import Project from "../app/Project"; -import IFolder from "../storage/IFolder"; -import StorageUtilities from "../storage/StorageUtilities"; -import IFile from "../storage/IFile"; -import ZipStorage from "../storage/ZipStorage"; -import { ESLint } from "eslint"; -import ProjectInfoItem from "../info/ProjectInfoItem"; -import IProjectInfoGenerator from "../info/IProjectInfoGenerator"; -import { InfoItemType } from "../info/IInfoItemData"; -import ProjectInfoSet from "../info/ProjectInfoSet"; -import ContentIndex from "../core/ContentIndex"; - -export default class JsEslintInfoGenerator implements IProjectInfoGenerator { - id = "ESLINT"; - title = "JavaScript Lint"; - - getTopicData(topicId: number) { - switch (topicId) { - case 100: - return { title: "ESLint Error" }; - } - return { - title: topicId.toString(), - }; - } - - summarize(info: any, infoSet: ProjectInfoSet) {} - - async generate(project: Project, contentIndex: ContentIndex): Promise { - const items: ProjectInfoItem[] = []; - var foundError = false; - - if (project.projectFolder) { - foundError = await this.generateFromFolder(project, project.projectFolder, items); - } - - if (foundError) { - items.push(new ProjectInfoItem(InfoItemType.testCompleteFail, this.id, 261, "JS ESLint check fails.")); - } else if (foundError) { - items.push(new ProjectInfoItem(InfoItemType.testCompleteSuccess, this.id, 262, "JS ESLint check passes.")); - } - - return items; - } - - async generateFromFolder(project: Project, folder: IFolder, items: ProjectInfoItem[]) { - await folder.load(); - var foundError = false; - - for (const fileName in folder.files) { - const baseType = StorageUtilities.getTypeFromName(fileName); - const file = folder.files[fileName]; - - if ((baseType === "js" || baseType === "mjs" || baseType === "ts") && file) { - if (await this.generateFromFile(project, file, items)) { - foundError = true; - } - } else if (StorageUtilities.isContainerFile(fileName) && file) { - await file.loadContent(); - - if (file.content && file.content instanceof Uint8Array) { - if (!file.fileContainerStorage) { - const zipStorage = new ZipStorage(); - - zipStorage.storagePath = file.storageRelativePath + "#"; - - await zipStorage.loadFromUint8Array(file.content, file.name); - - file.fileContainerStorage = zipStorage; - } - - if (file.fileContainerStorage) { - await this.generateFromFolder(project, file.fileContainerStorage.rootFolder, items); - } - } - } - } - - for (const folderName in folder.folders) { - const childFolder = folder.folders[folderName]; - - if (childFolder && !folder.errorStatus) { - if (await this.generateFromFolder(project, childFolder, items)) { - foundError = true; - } - } - } - - return foundError; - } - - async generateFromFile(project: Project, file: IFile, items: ProjectInfoItem[]) { - const srPath = file.storageRelativePath.toLowerCase(); - var foundErrors = false; - - if (srPath) { - const pi = new ProjectInfoItem(InfoItemType.info, this.id, 1, "JS file: " + file.storageRelativePath); - - await file.loadContent(false); - - const fileContent = file.content; - - if (fileContent && typeof fileContent === "string") { - const eslint = new ESLint({ - useEslintrc: false, - overrideConfig: { - extends: ["eslint:recommended"], - parserOptions: { - sourceType: "module", - ecmaVersion: "latest", - }, - env: { - es2022: true, - node: true, - }, - }, - }); - - const results = await eslint.lintText(fileContent); - - for (const result of results) { - for (const message of result.messages) { - items.push( - new ProjectInfoItem( - InfoItemType.error, - this.id, - 100, - message.message, - undefined, - undefined, - undefined, - JSON.stringify(message) - ) - ); - foundErrors = true; - } - } - } - - items.push(pi); - } - - return foundErrors; - } - - addSubTags(pi: ProjectInfoItem, suffix: string, rootTag?: object) { - if (!rootTag) { - return; - } - - for (const obj in rootTag) { - if (obj) { - pi.incrementFeature(obj + " " + suffix); - } - } - } -} diff --git a/app/src/local/LocalEnvironment.ts b/app/src/local/LocalEnvironment.ts index 40422553..39ec5860 100644 --- a/app/src/local/LocalEnvironment.ts +++ b/app/src/local/LocalEnvironment.ts @@ -11,8 +11,6 @@ import Utilities from "../core/Utilities"; import * as crypto from "crypto"; import { threadId } from "worker_threads"; import Log, { LogItem, LogItemLevel } from "../core/Log"; -import JsEslintInfoGenerator from "./JsEslintInfoGenerator"; -import GeneratorRegistrations from "../info/GeneratorRegistrations"; export const consoleText_reset = "\x1b[0m"; export const consoleText_bright = "\x1b[1m"; @@ -246,8 +244,6 @@ export default class LocalEnvironment { this.utilities = new LocalUtilities(); - GeneratorRegistrations.projectGenerators.push(new JsEslintInfoGenerator()); - this.handleNewLogMessage = this.handleNewLogMessage.bind(this); if (subscribeToLog) { diff --git a/app/src/minecraft/AnimationControllerBehaviorDefinition.ts b/app/src/minecraft/AnimationControllerBehaviorDefinition.ts index 1f3139da..5d27cc38 100644 --- a/app/src/minecraft/AnimationControllerBehaviorDefinition.ts +++ b/app/src/minecraft/AnimationControllerBehaviorDefinition.ts @@ -94,6 +94,7 @@ export default class AnimationControllerBehaviorDefinition implements IDefinitio return states; } + public getFormatVersion(): number[] | undefined { if (!this.data || !this.data.format_version) { return undefined; diff --git a/app/src/minecraft/AudioFileDefinition.ts b/app/src/minecraft/AudioFileDefinition.ts new file mode 100644 index 00000000..f1f177a8 --- /dev/null +++ b/app/src/minecraft/AudioFileDefinition.ts @@ -0,0 +1,116 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import IFile from "../storage/IFile"; +import { EventDispatcher, IEventHandler } from "ste-events"; +import IDefinition from "./IDefinition"; +import ProjectItemManager from "../app/ProjectItemManager"; +import Project from "../app/Project"; + +export default class AudioFileDefinition implements IDefinition { + private _file?: IFile; + private _id?: string; + private _isLoaded: boolean = false; + + private _onLoaded = new EventDispatcher(); + + public get isLoaded() { + return this._isLoaded; + } + + public get file() { + return this._file; + } + + public get onLoaded() { + return this._onLoaded.asEvent(); + } + + public set file(newFile: IFile | undefined) { + this._file = newFile; + } + + public get id() { + if (this._file) { + return this._file.name; + } + + return this._id; + } + + public set id(newId: string | undefined) { + this._id = newId; + } + + static async ensureOnFile(file: IFile, loadHandler?: IEventHandler) { + let afd: AudioFileDefinition | undefined; + + if (file.manager === undefined) { + afd = new AudioFileDefinition(); + + afd.file = file; + + file.manager = afd; + } + + if (file.manager !== undefined && file.manager instanceof AudioFileDefinition) { + afd = file.manager as AudioFileDefinition; + + if (!afd.isLoaded && loadHandler) { + afd.onLoaded.subscribe(loadHandler); + } + + await afd.load(); + } + + return afd; + } + + persist() { + if (this._file === undefined) { + return; + } + } + + async ensureSoundDefinitionsForFile(project: Project) { + if (!this._file) { + return; + } + + let soundDefinitionCat = await ProjectItemManager.ensureSoundDefinitionCatalogDefinition(project); + + if (this._file && soundDefinitionCat) { + let matches = soundDefinitionCat.getSoundDefinitionMatchesByPath(this._file); + + if (matches) { + let keyCount = 0; + + for (const key in matches) { + if (key) { + keyCount++; + } + } + + if (keyCount === 0) { + soundDefinitionCat.ensureDefintionForFile(project, this._file); + } + } + + soundDefinitionCat.persist(); + } + } + + async load() { + if (this._file === undefined || this._isLoaded) { + return; + } + + await this._file.loadContent(); + + if (this._file.content === null || this._file.content instanceof Uint8Array) { + return; + } + + this._isLoaded = true; + } +} diff --git a/app/src/minecraft/Database.ts b/app/src/minecraft/Database.ts index dbc7f77a..747c7b5a 100644 --- a/app/src/minecraft/Database.ts +++ b/app/src/minecraft/Database.ts @@ -865,6 +865,26 @@ export default class Database { result = await Database.isVanillaToken(path); } + if (!result) { + if (!path.startsWith("/resource_pack/") && path.startsWith("/")) { + result = Database.vanillaContentIndex.hasPathMatches("/resource_pack" + path); + + if (!result) { + result = await Database.isVanillaToken("/resource_pack" + path); + + if (!result) { + if (!path.startsWith("/behavior_pack/")) { + result = Database.vanillaContentIndex.hasPathMatches("/behavior_pack" + path); + + if (!result) { + result = await Database.isVanillaToken("/behavior_pack" + path); + } + } + } + } + } + } + return result; } diff --git a/app/src/minecraft/MinecraftDefinitions.ts b/app/src/minecraft/MinecraftDefinitions.ts index b5cde679..e576589a 100644 --- a/app/src/minecraft/MinecraftDefinitions.ts +++ b/app/src/minecraft/MinecraftDefinitions.ts @@ -4,6 +4,7 @@ import AnimationBehaviorDefinition from "./AnimationBehaviorDefinition"; import AnimationControllerBehaviorDefinition from "./AnimationControllerBehaviorDefinition"; import AnimationControllerResourceDefinition from "./AnimationControllerResourceDefinition"; import AnimationResourceDefinition from "./AnimationResourceDefinition"; +import AudioFileDefinition from "./AudioFileDefinition"; import BehaviorManifestDefinition from "./BehaviorManifestDefinition"; import BlockTypeBehaviorDefinition from "./BlockTypeBehaviorDefinition"; import EntityTypeDefinition from "./EntityTypeDefinition"; @@ -69,6 +70,20 @@ export default class MinecraftDefinitions { return undefined; } + static async ensureFoundationalDependencies(item: ProjectItem) { + if (item.itemType === ProjectItemType.audio) { + await item.ensureStorage(); + + if (item.file) { + const audioFile = await AudioFileDefinition.ensureOnFile(item.file); + + if (audioFile) { + await audioFile.ensureSoundDefinitionsForFile(item.project); + } + } + } + } + static async formatVersionIsCurrent(projectItem: ProjectItem) { const def = await MinecraftDefinitions.get(projectItem); diff --git a/app/src/minecraft/MinecraftUtilities.ts b/app/src/minecraft/MinecraftUtilities.ts index ed636730..3774a4db 100644 --- a/app/src/minecraft/MinecraftUtilities.ts +++ b/app/src/minecraft/MinecraftUtilities.ts @@ -244,7 +244,11 @@ export default class MinecraftUtilities { static getVersionArrayFrom(ver: string | number | number[] | undefined) { if (typeof ver === "number") { - return [ver]; + return [ver, 0, 0]; + } + + if (ver === undefined) { + return [0, 0, 0]; } if (typeof ver === "string") { @@ -256,13 +260,17 @@ export default class MinecraftUtilities { const num = parseInt(fvArr[i]); if (isNaN(num)) { - return undefined; + return [0, 0, 0]; } fvArrInt.push(num); } catch (e) {} } + while (fvArrInt.length < 3) { + fvArrInt.push(0); + } + return fvArrInt; } diff --git a/app/src/minecraft/ModelGeometryDefinition.ts b/app/src/minecraft/ModelGeometryDefinition.ts index c48c878b..a1d5efc1 100644 --- a/app/src/minecraft/ModelGeometryDefinition.ts +++ b/app/src/minecraft/ModelGeometryDefinition.ts @@ -13,13 +13,21 @@ export default class ModelGeometryDefinition { private _file?: IFile; private _isLoaded: boolean = false; - public wrapper?: IModelGeometry; + private _data?: IModelGeometry; public definitions: IGeometry[] = []; private _identifiers: string[] = []; private _onLoaded = new EventDispatcher(); + public get data() { + return this._data; + } + + public get formatVersion() { + return this._data?.format_version; + } + public get isLoaded() { return this._isLoaded; } @@ -42,10 +50,10 @@ export default class ModelGeometryDefinition { } if ( - !this.wrapper || - !this.wrapper["minecraft:geometry"] || - this.wrapper["minecraft:geometry"].length !== 1 || - !this.wrapper["minecraft:geometry"][0].description + !this._data || + !this._data["minecraft:geometry"] || + this._data["minecraft:geometry"].length !== 1 || + !this._data["minecraft:geometry"][0].description ) { return []; } @@ -64,7 +72,7 @@ export default class ModelGeometryDefinition { public getById(id: string): IGeometry | undefined { Log.assert(id !== "minecraft:geometry"); - let model = (this.wrapper as any)[id]; + let model = (this._data as any)[id]; if (model) { return model as IGeometry; @@ -144,8 +152,8 @@ export default class ModelGeometryDefinition { } public ensureDefault(id: string) { - if (!this.wrapper) { - this.wrapper = { + if (!this._data) { + this._data = { format_version: "1.12.0", "minecraft:geometry": [ { @@ -221,12 +229,12 @@ export default class ModelGeometryDefinition { return await Database.isRecentVersionFromVersionArray(fv); } - public getFormatVersion(): number[] | undefined { - if (!this.wrapper || !this.wrapper.format_version) { - return undefined; + public getFormatVersion(): number[] { + if (!this._data || !this._data.format_version) { + return [0, 0, 0]; } - return MinecraftUtilities.getVersionArrayFrom(this.wrapper.format_version); + return MinecraftUtilities.getVersionArrayFrom(this._data.format_version); } persist() { @@ -234,14 +242,14 @@ export default class ModelGeometryDefinition { return; } - const pjString = JSON.stringify(this.wrapper, null, 2); + const pjString = JSON.stringify(this._data, null, 2); this._file.setContent(pjString); } public ensureDefinition(name: string) { - if (!this.wrapper) { - this.wrapper = { + if (!this._data) { + this._data = { format_version: "1.12.0", "minecraft:geometry": [ { @@ -274,26 +282,26 @@ export default class ModelGeometryDefinition { this.definitions = []; this._identifiers = []; - if (this.wrapper && this.wrapper["minecraft:geometry"]) { - for (const def of this.wrapper["minecraft:geometry"]) { + if (this._data && this._data["minecraft:geometry"]) { + for (const def of this._data["minecraft:geometry"]) { if (def.description && def.description.identifier) { this._identifiers.push(def.description.identifier); } this.definitions.push(def); } - } else if (this.wrapper) { + } else if (this._data) { // look for 1.8.0 style geometries: // { // "format_version": ... // "geometry.foobar": {} // } - for (const elt in this.wrapper) { - if (elt !== "format_version" && elt.startsWith("geometry.") && (this.wrapper as any)[elt]) { + for (const elt in this._data) { + if (elt !== "format_version" && elt.startsWith("geometry.") && (this._data as any)[elt]) { this._identifiers.push(elt); - this.definitions.push((this.wrapper as any)[elt]); + this.definitions.push((this._data as any)[elt]); } } } @@ -309,7 +317,7 @@ export default class ModelGeometryDefinition { return; } - this.wrapper = StorageUtilities.getJsonObject(this._file); + this._data = StorageUtilities.getJsonObject(this._file); this.populateDefsAndIds(); diff --git a/app/src/storage/FileBase.ts b/app/src/storage/FileBase.ts index 9fb1d620..655536c8 100644 --- a/app/src/storage/FileBase.ts +++ b/app/src/storage/FileBase.ts @@ -162,9 +162,15 @@ export default abstract class FileBase implements IFile { return md5.base64(this._content); } + unload() { + this._content = null; + this.lastLoadedOrSaved = null; + } + dispose() { this.manager = undefined; this._content = null; + this.lastLoadedOrSaved = null; this.isDisposed = true; } diff --git a/app/src/storage/IFile.ts b/app/src/storage/IFile.ts index 64f32da4..50e46143 100644 --- a/app/src/storage/IFile.ts +++ b/app/src/storage/IFile.ts @@ -26,6 +26,7 @@ export default interface IFile extends IStorageObject { type: string; dispose(): void; + unload(): void; getHash(): Promise; getRelativePathFor(file: IFile): string | undefined; diff --git a/app/src/test/CartoTest.ts b/app/src/test/CartoTest.ts index 0b432a83..38cea289 100644 --- a/app/src/test/CartoTest.ts +++ b/app/src/test/CartoTest.ts @@ -161,7 +161,7 @@ describe("simple", async () => { it("report file matches", async () => { const project = await _loadProject("simple"); - const pis = new ProjectInfoSet(project, ProjectInfoSuite.allExceptAddOn, ["JSON"]); // don't do schema tests as results may change via network'ed schema def changes over time. + const pis = new ProjectInfoSet(project, ProjectInfoSuite.default); await pis.generateForProject(); diff --git a/app/src/test/CommandLineTest.ts b/app/src/test/CommandLineTest.ts index b5a534ac..66eb98bb 100644 --- a/app/src/test/CommandLineTest.ts +++ b/app/src/test/CommandLineTest.ts @@ -320,9 +320,9 @@ describe("createCommandAddonStarter", async () => { // exclude eslint because we know the .ts comes with some warnings due to // the starter TS having some unused variables. - allProjectInfoSet = new ProjectInfoSet(project, ProjectInfoSuite.allExceptAddOn, ["ESLINT"]); + allProjectInfoSet = new ProjectInfoSet(project, ProjectInfoSuite.default, ["ESLINT"]); - addonProjectInfoSet = new ProjectInfoSet(project, ProjectInfoSuite.addOn); + addonProjectInfoSet = new ProjectInfoSet(project, ProjectInfoSuite.cooperativeAddOn); project.autoDeploymentMode = ProjectAutoDeploymentMode.noAutoDeployment; project.localFolderPath = __dirname + "/../../test/results/createCommandAddonStarter/"; diff --git a/app/test/scenarios/serveCommandValidate/report.json b/app/test/scenarios/serveCommandValidate/report.json index 9a7d9f89..304ed8cd 100644 --- a/app/test/scenarios/serveCommandValidate/report.json +++ b/app/test/scenarios/serveCommandValidate/report.json @@ -325,7 +325,7 @@ "minecraft:is_sheared": 1, "minecraft:behavior.melee_attack": 1 }, - "Sounds Entity sounds": { + "Sound Entity sounds": { "entities": 1 }, "Animations Resource": { @@ -601,77 +601,73 @@ "title": "Overall Size" }, "2": { - "title": "Overall File Count", - "defaultMessage": "File Counts" + "title": "File Count" }, "3": { - "title": "Overall Folder Count", - "defaultMessage": "Folder Counts" + "title": "Folder Count" }, "4": { "title": "Content Size" }, "5": { - "title": "Content File Count", - "defaultMessage": "Content File Counts" + "title": "Content File Count" }, "6": { - "title": "Content Folder Count", - "defaultMessage": "Content Folder Counts" + "title": "Content Folder Count" } }, "PACK": { "1": { "title": "1", - "defaultMessage": "Behavior pack format version" + "defaultMessage": "Behavior Pack Min Engine Version" }, "2": { "title": "2", - "defaultMessage": "Behavior pack UUID" + "defaultMessage": "Behavior Pack Uuid" }, "3": { "title": "3", - "defaultMessage": "Behavior pack manifest" + "defaultMessage": "Behavior Pack Manfiest" }, "4": { "title": "4", - "defaultMessage": "Behavior pack name" + "defaultMessage": "Behavior Pack Name" }, "5": { "title": "5", - "defaultMessage": "Behavior pack description" + "defaultMessage": "Behavior Pack Description" }, "6": { "title": "6", - "defaultMessage": "Behavior pack Id" - }, - "10": { - "title": "10", - "defaultMessage": "Resource pack format version" + "defaultMessage": "Behavior Pack Id" }, "11": { "title": "11", - "defaultMessage": "Behavior pack min_engine version" + "defaultMessage": "Resource Pack Min Engine Version" }, "12": { "title": "12", - "defaultMessage": "Resource pack UUID" + "defaultMessage": "Resource Pack Uuid" }, "13": { "title": "13", - "defaultMessage": "Resource pack manifest" + "defaultMessage": "Resource Pack Manifest" }, "14": { "title": "14", - "defaultMessage": "Resource pack name" + "defaultMessage": "Resource Pack Name" }, "15": { "title": "15", - "defaultMessage": "Resource pack description" + "defaultMessage": "Resource Pack Description" }, "16": { "title": "16", - "defaultMessage": "Resource pack Id" + "defaultMessage": "Resource Pack Id" + }, + "17": { + "title": "17", + "defaultMessage": "Resource Pack Format Version" } }, "JSONTAGS": { @@ -680,7 +676,7 @@ "defaultMessage": "Entity file" }, "8": { - "title": "Sounds", + "title": "Sound", "defaultMessage": "Sounds file" } }, @@ -761,33 +757,6 @@ "title": "Texture Images" } }, - "ESLINT": { - "1": { - "title": "1", - "defaultMessage": "JS file: /Content/behavior_packs/aop_mobsbp/scripts/main.js" - } - }, - "WORLDDATA": { - "1": { - "defaultMessage": "Blocks", - "testCompleteSuccesses": 1 - }, - "2": { - "defaultMessage": "Block Data" - }, - "3": { - "defaultMessage": "Commands" - }, - "4": { - "defaultMessage": "Execute Sub Commands" - }, - "5": { - "defaultMessage": "NBT Tags" - }, - "6": { - "defaultMessage": "NBT Experiment Tags" - } - }, "JSON": { "1": { "defaultMessage": "Test JSON Schema Validation completed successfully.", @@ -815,6 +784,27 @@ "defaultMessage": "Animation is not at a current format version (is at 1.8.0)" } }, + "WORLDDATA": { + "1": { + "defaultMessage": "Blocks", + "testCompleteSuccesses": 1 + }, + "2": { + "defaultMessage": "Block Data" + }, + "3": { + "defaultMessage": "Command" + }, + "4": { + "defaultMessage": "Execute Sub Command" + }, + "5": { + "defaultMessage": "Level Dat" + }, + "6": { + "defaultMessage": "Level Dat Experiments" + } + }, "UNKFILE": { "1": { "defaultMessage": "Test Unknown files completed successfully.", @@ -1487,7 +1477,6 @@ "iTp": 2, "gId": "PACK", "gIx": 1, - "m": "Behavior pack min_engine version", "p": "/Content/behavior_packs/aop_mobsbp/manifest.json", "d": [ 1, @@ -1534,7 +1523,7 @@ { "iTp": 2, "gId": "PACK", - "gIx": 10, + "gIx": 17, "p": "/Content/resource_packs/aop_mobsrp/manifest.json", "d": 2 }, @@ -2002,78 +1991,6 @@ } } }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, { "iTp": 7, "gId": "WORLDDATA", @@ -2154,942 +2071,6 @@ "gIx": 6, "p": "/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json" }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, { "iTp": 0, "gId": "UNKFILE", diff --git a/app/test/scenarios/simple/report.json b/app/test/scenarios/simple/report.json index b958e805..1e63b7ee 100644 --- a/app/test/scenarios/simple/report.json +++ b/app/test/scenarios/simple/report.json @@ -92,7 +92,7 @@ "errorCount": 0, "internalProcessingErrorCount": 0, "warningCount": 0, - "testSuccessCount": 10, + "testSuccessCount": 11, "testFailCount": 1, "errorSummary": "", "internalProcessingErrorSummary": "", @@ -159,49 +159,45 @@ "title": "Overall Size" }, "2": { - "title": "Overall File Count", - "defaultMessage": "File Counts" + "title": "File Count" }, "3": { - "title": "Overall Folder Count", - "defaultMessage": "Folder Counts" + "title": "Folder Count" }, "4": { "title": "Content Size" }, "5": { - "title": "Content File Count", - "defaultMessage": "Content File Counts" + "title": "Content File Count" }, "6": { - "title": "Content Folder Count", - "defaultMessage": "Content Folder Counts" + "title": "Content Folder Count" } }, "PACK": { "1": { "title": "1", - "defaultMessage": "Behavior pack format version" + "defaultMessage": "Behavior Pack Min Engine Version" }, "2": { "title": "2", - "defaultMessage": "Behavior pack UUID" + "defaultMessage": "Behavior Pack Uuid" }, "3": { "title": "3", - "defaultMessage": "Behavior pack manifest" + "defaultMessage": "Behavior Pack Manfiest" }, "4": { "title": "4", - "defaultMessage": "Behavior pack name" + "defaultMessage": "Behavior Pack Name" }, "5": { "title": "5", - "defaultMessage": "Behavior pack description" + "defaultMessage": "Behavior Pack Description" }, "6": { "title": "6", - "defaultMessage": "Behavior pack Id" + "defaultMessage": "Behavior Pack Id" } }, "SCRIPTMODULE": { @@ -272,33 +268,6 @@ "title": "Texture Images" } }, - "ESLINT": { - "1": { - "title": "1", - "defaultMessage": "JS file: /behavior_packs/StarterTestsTutorial/scripts/index.js" - } - }, - "WORLDDATA": { - "1": { - "defaultMessage": "Blocks", - "testCompleteSuccesses": 1 - }, - "2": { - "defaultMessage": "Block Data" - }, - "3": { - "defaultMessage": "Commands" - }, - "4": { - "defaultMessage": "Execute Sub Commands" - }, - "5": { - "defaultMessage": "NBT Tags" - }, - "6": { - "defaultMessage": "NBT Experiment Tags" - } - }, "PATHLENGTH": { "3": { "defaultMessage": "File path contains more than 80 characters, and may not run on all devices", @@ -317,12 +286,24 @@ "testCompleteSuccesses": 1 } }, + "JSON": { + "1": { + "defaultMessage": "Test JSON Schema Validation completed successfully.", + "testCompleteSuccesses": 1 + } + }, "WORLD": { "1": { "defaultMessage": "Test World Validation completed successfully.", "testCompleteSuccesses": 1 } }, + "WORLDDATA": { + "1": { + "defaultMessage": "Test World Data Validation completed successfully.", + "testCompleteSuccesses": 1 + } + }, "UNLINK": { "1": { "defaultMessage": "Test Unlinked item info generator completed successfully.", @@ -578,7 +559,6 @@ "iTp": 2, "gId": "PACK", "gIx": 1, - "m": "Behavior pack min_engine version", "p": "/behavior_packs/StarterTestsTutorial/manifest.json", "d": [ 1, @@ -656,136 +636,6 @@ "gId": "TEXTUREIMAGE", "gIx": 1 }, - { - "iTp": 2, - "gId": "ESLINT", - "gIx": 1 - }, - { - "iTp": 2, - "gId": "ESLINT", - "gIx": 1, - "m": "JS file: /behavior_packs/StarterTestsTutorial/scripts/starttests.js" - }, - { - "iTp": 2, - "gId": "ESLINT", - "gIx": 1 - }, - { - "iTp": 2, - "gId": "ESLINT", - "gIx": 1, - "m": "JS file: /behavior_packs/StarterTestsTutorial/scripts/starttests.js" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/behavior_packs/StarterTestsTutorial/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/behavior_packs/StarterTestsTutorial/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/behavior_packs/StarterTestsTutorial/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/behavior_packs/StarterTestsTutorial/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/behavior_packs/StarterTestsTutorial/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/behavior_packs/StarterTestsTutorial/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/behavior_packs/StarterTestsTutorial/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/behavior_packs/StarterTestsTutorial/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/behavior_packs/StarterTestsTutorial/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/behavior_packs/StarterTestsTutorial/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/behavior_packs/StarterTestsTutorial/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/behavior_packs/StarterTestsTutorial/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/behavior_packs/StarterTestsTutorial/scripts/index.js" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/behavior_packs/StarterTestsTutorial/scripts/index.js" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/behavior_packs/StarterTestsTutorial/scripts/index.js" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/behavior_packs/StarterTestsTutorial/scripts/index.js" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/behavior_packs/StarterTestsTutorial/scripts/index.js" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/behavior_packs/StarterTestsTutorial/scripts/index.js" - }, { "iTp": 1, "gId": "PATHLENGTH", @@ -802,6 +652,11 @@ "gId": "UNKJSON", "gIx": 1 }, + { + "iTp": 0, + "gId": "JSON", + "gIx": 1 + }, { "iTp": 0, "gId": "WORLD", @@ -810,8 +665,7 @@ { "iTp": 0, "gId": "WORLDDATA", - "gIx": 1, - "m": "Test World Data Validation completed successfully." + "gIx": 1 }, { "iTp": 0, diff --git a/app/test/scenarios/validateAddons1WellFormedCommand/content1.csv b/app/test/scenarios/validateAddons1WellFormedCommand/content1.csv index cd0f5c9e..24180866 100644 --- a/app/test/scenarios/validateAddons1WellFormedCommand/content1.csv +++ b/app/test/scenarios/validateAddons1WellFormedCommand/content1.csv @@ -1,6 +1,6 @@ Test,TestId,Type,Item,Message,Data,Path -ADDONREQ,102,Test fail,,"Found an add-on-blocked folder 'entities' in a parent folder pack\loot_tables. Should be named 'creatorshortname' and not a common term","entities",, -ADDONREQ,104,Test fail,,"Found a loose file 'sheepomelon.json' in loot_tables\entities. Files should only be in the folder loot_tables\entities\","sheepomelon.json",, -ADDONREQ,104,Test fail,,"Found a loose file 'sheepomelon_shear.json' in loot_tables\entities. Files should only be in the folder loot_tables\entities\","sheepomelon_shear.json",, +CADDONREQ,102,Test fail,,"Found an cooperative add-on common name folder 'entities' in a parent folder pack\loot_tables. Should be named 'creatorshortname' and not a common term","entities",, +CADDONREQ,104,Test fail,,"Found a loose file 'sheepomelon.json' in loot_tables\entities. Files should only be in the folder loot_tables\entities\","sheepomelon.json",, +CADDONREQ,104,Test fail,,"Found a loose file 'sheepomelon_shear.json' in loot_tables\entities. Files should only be in the folder loot_tables\entities\","sheepomelon_shear.json",, WORLDDATA,1,Test success,,"Test World Data Validation completed successfully.",,, -ADDONIREQ,1,Test success,,"Test Addon Item Requirements Generator completed successfully.",,, \ No newline at end of file +CADDONIREQ,1,Test success,,"Test Cooperative Add-On Item Requirements Generator completed successfully.",,, \ No newline at end of file diff --git a/app/test/scenarios/validateAddons1WellFormedCommand/content1.mcr.json b/app/test/scenarios/validateAddons1WellFormedCommand/content1.mcr.json index 81d4e6a9..e57f5caf 100644 --- a/app/test/scenarios/validateAddons1WellFormedCommand/content1.mcr.json +++ b/app/test/scenarios/validateAddons1WellFormedCommand/content1.mcr.json @@ -68,40 +68,36 @@ "testFailCount": 3, "errorSummary": "", "internalProcessingErrorSummary": "", - "testFailSummary": "TESTFAIL: [ADDONREQ102] Found an add-on-blocked folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term: entities\r\nTESTFAIL: [ADDONREQ104] Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon.json\r\nTESTFAIL: [ADDONREQ104] Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon_shear.json", + "testFailSummary": "TESTFAIL: [CADDONREQ102] Found an cooperative add-on common name folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term: entities\r\nTESTFAIL: [CADDONREQ104] Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon.json\r\nTESTFAIL: [CADDONREQ104] Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon_shear.json", "summary": { "PACKSIZE": { "1": { "title": "Overall Size" }, "2": { - "title": "Overall File Count", - "defaultMessage": "File Counts" + "title": "File Count" }, "3": { - "title": "Overall Folder Count", - "defaultMessage": "Folder Counts" + "title": "Folder Count" }, "4": { "title": "Content Size" }, "5": { - "title": "Content File Count", - "defaultMessage": "Content File Counts" + "title": "Content File Count" }, "6": { - "title": "Content Folder Count", - "defaultMessage": "Content Folder Counts" + "title": "Content Folder Count" } }, - "ADDONREQ": { + "CADDONREQ": { "102": { - "title": "102", - "defaultMessage": "Found an add-on-blocked folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term", + "title": "No Common Names In Creator Folder Name", + "defaultMessage": "Found an cooperative add-on common name folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term", "testCompleteFails": 1 }, "104": { - "title": "104", + "title": "No Loose File In Creator Folder", "defaultMessage": "Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\", "testCompleteFails": 2 } @@ -120,21 +116,21 @@ "defaultMessage": "Block Data" }, "3": { - "defaultMessage": "Commands" + "defaultMessage": "Command" }, "4": { - "defaultMessage": "Execute Sub Commands" + "defaultMessage": "Execute Sub Command" }, "5": { - "defaultMessage": "NBT Tags" + "defaultMessage": "Level Dat" }, "6": { - "defaultMessage": "NBT Experiment Tags" + "defaultMessage": "Level Dat Experiments" } }, - "ADDONIREQ": { + "CADDONIREQ": { "1": { - "defaultMessage": "Test Addon Item Requirements Generator completed successfully.", + "defaultMessage": "Test Cooperative Add-On Item Requirements Generator completed successfully.", "testCompleteSuccesses": 1 } } @@ -179,19 +175,19 @@ }, { "iTp": 1, - "gId": "ADDONREQ", + "gId": "CADDONREQ", "gIx": 102, "d": "entities" }, { "iTp": 1, - "gId": "ADDONREQ", + "gId": "CADDONREQ", "gIx": 104, "d": "sheepomelon.json" }, { "iTp": 1, - "gId": "ADDONREQ", + "gId": "CADDONREQ", "gIx": 104, "m": "Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\", "d": "sheepomelon_shear.json" @@ -230,78 +226,6 @@ } } }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/manifest.json" - }, { "iTp": 7, "gId": "WORLDDATA", @@ -382,978 +306,6 @@ "gIx": 6, "p": "/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json" }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/behavior_packs/aop_mobsbp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/manifest.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/sounds.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/materials/entity.material" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/materials/entity.material" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/materials/entity.material" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/materials/entity.material" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/materials/entity.material" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/materials/entity.material" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/texts/en_US.lang" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 1, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 2, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 3, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 4, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 5, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, - { - "iTp": 7, - "gId": "WORLDDATA", - "gIx": 6, - "p": "/Content/resource_packs/aop_mobsrp/texts/languages.json" - }, { "iTp": 0, "gId": "WORLDDATA", @@ -1362,7 +314,7 @@ }, { "iTp": 0, - "gId": "ADDONIREQ", + "gId": "CADDONIREQ", "gIx": 1 } ], diff --git a/app/test/scenarios/validateAddons1WellFormedCommand/content1.report.html b/app/test/scenarios/validateAddons1WellFormedCommand/content1.report.html index 4667e4df..689ec4ef 100644 --- a/app/test/scenarios/validateAddons1WellFormedCommand/content1.report.html +++ b/app/test/scenarios/validateAddons1WellFormedCommand/content1.report.html @@ -6,7 +6,7 @@ _reportObjects.push(data); } -_addReportJson({"info":{"behaviorPackManifestCount":0,"unknownJsonCount":0,"entityTypeManifestCount":0,"itemTypeManifestCount":0,"blockTypeManifestCount":0,"resourcePackManifestCount":0,"worldCount":0,"entityTypeResourceCount":0,"behaviorPackAnimationCount":0,"behaviorPackAnimationControllerCount":0,"overallSize":50944,"fileCounts":36,"folderCounts":23,"contentSize":50944,"contentFileCounts":36,"contentFolderCounts":18,"subpackCount":0,"subpackTier1Count":0,"subpackTier2Count":0,"subpackTier3Count":0,"subpackTier4Count":0,"animationCount":0,"textureCount":0,"chunkCount":0,"subchunkLessChunkCount":0,"worldLoadErrors":0,"featureSets":{"Textures Entity Resource Count":{"Count":3},"Textures Texture References":{"Count":3},"Textures Entity References":{"Count":3},"Textures File Count":{"Count":3},"Textures Unique Texture Handles (estimated)":{"Count":3},"Textures Unique Texture Paths":{"Count":3},"Textures Unique Particle Texture Paths":{"Count":0},"Textures Unique Particle Texture Vanilla Paths":{"Count":1},"Textures Unique Entity Texture Paths":{"Count":3},"Command say":{"Count":1},"Command summon":{"Count":1}},"errorCount":0,"internalProcessingErrorCount":0,"warningCount":0,"testSuccessCount":2,"testFailCount":3,"errorSummary":"","internalProcessingErrorSummary":"","testFailSummary":"TESTFAIL: [ADDONREQ102] Found an add-on-blocked folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term: entities\r\nTESTFAIL: [ADDONREQ104] Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon.json\r\nTESTFAIL: [ADDONREQ104] Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon_shear.json","summary":{"PACKSIZE":{"1":{"title":"Overall Size"},"2":{"title":"Overall File Count","defaultMessage":"File Counts"},"3":{"title":"Overall Folder Count","defaultMessage":"Folder Counts"},"4":{"title":"Content Size"},"5":{"title":"Content File Count","defaultMessage":"Content File Counts"},"6":{"title":"Content Folder Count","defaultMessage":"Content Folder Counts"}},"ADDONREQ":{"102":{"title":"102","defaultMessage":"Found an add-on-blocked folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term","testCompleteFails":1},"104":{"title":"104","defaultMessage":"Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\","testCompleteFails":2}},"TEXTURE":{"1":{"title":"Textures"}},"WORLDDATA":{"1":{"defaultMessage":"Blocks","testCompleteSuccesses":1},"2":{"defaultMessage":"Block Data"},"3":{"defaultMessage":"Commands"},"4":{"defaultMessage":"Execute Sub Commands"},"5":{"defaultMessage":"NBT Tags"},"6":{"defaultMessage":"NBT Experiment Tags"}},"ADDONIREQ":{"1":{"defaultMessage":"Test Addon Item Requirements Generator completed successfully.","testCompleteSuccesses":1}}}},"items":[{"iTp":7,"gId":"PACKSIZE","gIx":1,"d":50944},{"iTp":7,"gId":"PACKSIZE","gIx":2,"d":36},{"iTp":7,"gId":"PACKSIZE","gIx":3,"d":23},{"iTp":7,"gId":"PACKSIZE","gIx":4,"d":50944},{"iTp":7,"gId":"PACKSIZE","gIx":5,"d":36},{"iTp":7,"gId":"PACKSIZE","gIx":6,"d":18},{"iTp":1,"gId":"ADDONREQ","gIx":102,"d":"entities"},{"iTp":1,"gId":"ADDONREQ","gIx":104,"d":"sheepomelon.json"},{"iTp":1,"gId":"ADDONREQ","gIx":104,"m":"Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\","d":"sheepomelon_shear.json"},{"iTp":7,"gId":"TEXTURE","gIx":1,"fs":{"Entity Resource Count":{"Count":3},"Texture References":{"Count":3},"Entity References":{"Count":3},"File Count":{"Count":3},"Unique Texture Handles (estimated)":{"Count":3},"Unique Texture Paths":{"Count":3},"Unique Particle Texture Paths":{"Count":0},"Unique Particle Texture Vanilla Paths":{"Count":1},"Unique Entity Texture Paths":{"Count":3}}},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json","fs":{"say":{"Count":1},"summon":{"Count":1}}},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/entities/biceson.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/entities/nardolphle.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/entities/sheepomelon.behavior.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/loot_tables/entities/sheepomelon_shear.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/biceson.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/nardolphle.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/spawn_rules/sheepomelon.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/manifest.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/sounds.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/sounds.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/sounds.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/sounds.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/sounds.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/sounds.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/animations/biceson.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/animations/nardolphle.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/animations/sheepomelon.animation.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/entity/biceson.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/entity/nardolphle.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/entity/sheepomelon.entity.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/materials/entity.material"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/materials/entity.material"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/materials/entity.material"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/materials/entity.material"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/materials/entity.material"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/materials/entity.material"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/models/entity/biceson.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/models/entity/nardolphle.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/models/entity/sheepomelon.geometry.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/particles/fireworks_pop.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/particles/smoke_puff.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/texts/en_US.lang"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/resource_packs/aop_mobsrp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/resource_packs/aop_mobsrp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/resource_packs/aop_mobsrp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/resource_packs/aop_mobsrp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/resource_packs/aop_mobsrp/texts/languages.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/resource_packs/aop_mobsrp/texts/languages.json"},{"iTp":0,"gId":"WORLDDATA","gIx":1,"m":"Test World Data Validation completed successfully."},{"iTp":0,"gId":"ADDONIREQ","gIx":1}],"generatorName":"Minecraft Creator Tools","suite":2,"generatorVersion":"0.2.9","sourceName":"content1","sourcePath":"/"}); +_addReportJson({"info":{"behaviorPackManifestCount":0,"unknownJsonCount":0,"entityTypeManifestCount":0,"itemTypeManifestCount":0,"blockTypeManifestCount":0,"resourcePackManifestCount":0,"worldCount":0,"entityTypeResourceCount":0,"behaviorPackAnimationCount":0,"behaviorPackAnimationControllerCount":0,"overallSize":50944,"fileCounts":36,"folderCounts":23,"contentSize":50944,"contentFileCounts":36,"contentFolderCounts":18,"subpackCount":0,"subpackTier1Count":0,"subpackTier2Count":0,"subpackTier3Count":0,"subpackTier4Count":0,"animationCount":0,"textureCount":0,"chunkCount":0,"subchunkLessChunkCount":0,"worldLoadErrors":0,"featureSets":{"Textures Entity Resource Count":{"Count":3},"Textures Texture References":{"Count":3},"Textures Entity References":{"Count":3},"Textures File Count":{"Count":3},"Textures Unique Texture Handles (estimated)":{"Count":3},"Textures Unique Texture Paths":{"Count":3},"Textures Unique Particle Texture Paths":{"Count":0},"Textures Unique Particle Texture Vanilla Paths":{"Count":1},"Textures Unique Entity Texture Paths":{"Count":3},"Command say":{"Count":1},"Command summon":{"Count":1}},"errorCount":0,"internalProcessingErrorCount":0,"warningCount":0,"testSuccessCount":2,"testFailCount":3,"errorSummary":"","internalProcessingErrorSummary":"","testFailSummary":"TESTFAIL: [CADDONREQ102] Found an cooperative add-on common name folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term: entities\r\nTESTFAIL: [CADDONREQ104] Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon.json\r\nTESTFAIL: [CADDONREQ104] Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\: sheepomelon_shear.json","summary":{"PACKSIZE":{"1":{"title":"Overall Size"},"2":{"title":"File Count"},"3":{"title":"Folder Count"},"4":{"title":"Content Size"},"5":{"title":"Content File Count"},"6":{"title":"Content Folder Count"}},"CADDONREQ":{"102":{"title":"No Common Names In Creator Folder Name","defaultMessage":"Found an cooperative add-on common name folder 'entities' in a parent folder pack\\loot_tables. Should be named 'creatorshortname' and not a common term","testCompleteFails":1},"104":{"title":"No Loose File In Creator Folder","defaultMessage":"Found a loose file 'sheepomelon.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\","testCompleteFails":2}},"TEXTURE":{"1":{"title":"Textures"}},"WORLDDATA":{"1":{"defaultMessage":"Blocks","testCompleteSuccesses":1},"2":{"defaultMessage":"Block Data"},"3":{"defaultMessage":"Command"},"4":{"defaultMessage":"Execute Sub Command"},"5":{"defaultMessage":"Level Dat"},"6":{"defaultMessage":"Level Dat Experiments"}},"CADDONIREQ":{"1":{"defaultMessage":"Test Cooperative Add-On Item Requirements Generator completed successfully.","testCompleteSuccesses":1}}}},"items":[{"iTp":7,"gId":"PACKSIZE","gIx":1,"d":50944},{"iTp":7,"gId":"PACKSIZE","gIx":2,"d":36},{"iTp":7,"gId":"PACKSIZE","gIx":3,"d":23},{"iTp":7,"gId":"PACKSIZE","gIx":4,"d":50944},{"iTp":7,"gId":"PACKSIZE","gIx":5,"d":36},{"iTp":7,"gId":"PACKSIZE","gIx":6,"d":18},{"iTp":1,"gId":"CADDONREQ","gIx":102,"d":"entities"},{"iTp":1,"gId":"CADDONREQ","gIx":104,"d":"sheepomelon.json"},{"iTp":1,"gId":"CADDONREQ","gIx":104,"m":"Found a loose file 'sheepomelon_shear.json' in loot_tables\\entities. Files should only be in the folder loot_tables\\entities\\","d":"sheepomelon_shear.json"},{"iTp":7,"gId":"TEXTURE","gIx":1,"fs":{"Entity Resource Count":{"Count":3},"Texture References":{"Count":3},"Entity References":{"Count":3},"File Count":{"Count":3},"Unique Texture Handles (estimated)":{"Count":3},"Unique Texture Paths":{"Count":3},"Unique Particle Texture Paths":{"Count":0},"Unique Particle Texture Vanilla Paths":{"Count":1},"Unique Entity Texture Paths":{"Count":3}}},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json","fs":{"say":{"Count":1},"summon":{"Count":1}}},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/animations/sheepomelon.bp_anims.json"},{"iTp":7,"gId":"WORLDDATA","gIx":1,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":2,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":3,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":4,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":5,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":7,"gId":"WORLDDATA","gIx":6,"p":"/Content/behavior_packs/aop_mobsbp/animation_controllers/sheepomelon.bp_ac.json"},{"iTp":0,"gId":"WORLDDATA","gIx":1,"m":"Test World Data Validation completed successfully."},{"iTp":0,"gId":"CADDONIREQ","gIx":1}],"generatorName":"Minecraft Creator Tools","suite":2,"generatorVersion":"0.2.9","sourceName":"content1","sourcePath":"/"});