@@ -3788,7 +3788,7 @@ __webpack_require__.r(__webpack_exports__);
37883788
37893789
37903790function soundEffectId(namespace, folder, id, fileName) {
3791- return namespace + ':' + folder + '/' + id + '/' + (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.withoutSuffix )(fileName);
3791+ return namespace + ':' + folder + '/' + id + '/' + (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.companionStem )(fileName);
37923792}
37933793function particleEffectId(namespace, particleJson) {
37943794 const meta = (0,_particleTexture__WEBPACK_IMPORTED_MODULE_1__.readParticleMeta)(particleJson);
@@ -3925,11 +3925,11 @@ function listEffectFiles(channels) {
39253925 return [];
39263926 const seen = new Set();
39273927 const refs = [];
3928- const add = (path, name) => {
3928+ const add = (path, name, textureName ) => {
39293929 if (seen.has(path))
39303930 return;
39313931 seen.add(path);
3932- refs.push({ path, name });
3932+ refs.push({ path, name, textureName });
39333933 };
39343934 for (const keyframe of (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.allEffectKeyframes)()) {
39353935 if (channels && channels.indexOf(keyframe.channel) === -1)
@@ -3939,15 +3939,16 @@ function listEffectFiles(channels) {
39393939 const full = point.file;
39403940 if (!full || (0,_vanillaSounds__WEBPACK_IMPORTED_MODULE_2__.isVanillaSoundPath)(full))
39413941 continue;
3942- let name = _core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.basename(full);
3943- if (suffix && !(0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.isCompanionFile)(name))
3944- name = (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.withoutSuffix)(name) + suffix;
3945- add(full, name);
3946- if (keyframe.channel !== 'particle')
3942+ const name = (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.companionStem)(_core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.basename(full)) + suffix;
3943+ if (keyframe.channel !== 'particle') {
3944+ add(full, name);
39473945 continue;
3946+ }
39483947 const texture = (0,_particleTexture__WEBPACK_IMPORTED_MODULE_1__.particleTextureOf)(full);
3948+ const textureName = texture ? (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_3__.companionStem)(_core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.basename(texture)) : undefined;
3949+ add(full, name, textureName);
39493950 if (texture)
3950- add(texture, _core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.basename(texture) );
3951+ add(texture, textureName + '.png' );
39513952 }
39523953 }
39533954 return refs;
@@ -3956,14 +3957,28 @@ function collectEffectFiles(channels) {
39563957 const out = [];
39573958 for (const ref of listEffectFiles(channels)) {
39583959 try {
3959- out.push({ name: ref.name, content: _core_node__WEBPACK_IMPORTED_MODULE_0__.fs.readFileSync(ref.path) });
3960+ const content = _core_node__WEBPACK_IMPORTED_MODULE_0__.fs.readFileSync(ref.path);
3961+ out.push({ name: ref.name, content: ref.textureName ? withTextureName(content, ref.textureName) : content });
39603962 }
39613963 catch (e) {
39623964 (0,_core_log__WEBPACK_IMPORTED_MODULE_4__.log)('effect files: could not read ' + ref.path + ': ' + e);
39633965 }
39643966 }
39653967 return out;
39663968}
3969+ function withTextureName(content, textureName) {
3970+ try {
3971+ const json = JSON.parse(content.toString('utf8'));
3972+ const params = json.particle_effect.description.basic_render_parameters;
3973+ if (String(params.texture || '').split('/').pop() === textureName)
3974+ return content;
3975+ params.texture = textureName;
3976+ return JSON.stringify(json, null, 2);
3977+ }
3978+ catch (e) {
3979+ return content;
3980+ }
3981+ }
39673982
39683983
39693984/***/ },
@@ -3979,6 +3994,7 @@ __webpack_require__.r(__webpack_exports__);
39793994/* harmony export */ CHANNEL_SUFFIX: () => (/* binding */ CHANNEL_SUFFIX),
39803995/* harmony export */ EFFECT_CHANNELS: () => (/* binding */ EFFECT_CHANNELS),
39813996/* harmony export */ allEffectKeyframes: () => (/* binding */ allEffectKeyframes),
3997+ /* harmony export */ companionStem: () => (/* binding */ companionStem),
39823998/* harmony export */ countEffectKeyframes: () => (/* binding */ countEffectKeyframes),
39833999/* harmony export */ effectsAnimator: () => (/* binding */ effectsAnimator),
39844000/* harmony export */ findEffectKeyframe: () => (/* binding */ findEffectKeyframe),
@@ -3999,6 +4015,10 @@ function isCompanionFile(name) {
39994015function withoutSuffix(name) {
40004016 return name.replace(SUFFIX_PATTERN, '').toLowerCase();
40014017}
4018+ // Minecraft resource paths: [a-z0-9/._-] only, enforced at render time.
4019+ function companionStem(name) {
4020+ return withoutSuffix(name).replace(/\.png$/i, '').replace(/[^a-z0-9._-]+/g, '_');
4021+ }
40024022function effectsAnimator(animation, create = false) {
40034023 if (!animation || !animation.animators)
40044024 return null;
@@ -4586,6 +4606,8 @@ __webpack_require__.r(__webpack_exports__);
45864606/* harmony export */ });
45874607/* harmony import */ var _core_node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/node */ "./ts/core/node.ts");
45884608/* harmony import */ var _core_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../core/log */ "./ts/core/log.ts");
4609+ /* harmony import */ var _effectKeyframes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./effectKeyframes */ "./ts/platform/effectKeyframes.ts");
4610+
45894611
45904612
45914613const PLACEHOLDER_NAME = 'missing_particle.png';
@@ -4738,7 +4760,7 @@ function setParticleTexture(particleFile, pngPath) {
47384760 (0,_core_log__WEBPACK_IMPORTED_MODULE_1__.log)('setParticleTexture: could not read ' + particleFile + ': ' + e);
47394761 return false;
47404762 }
4741- const name = _core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.basename(pngPath).replace(/\.png$/i, '' );
4763+ const name = (0,_effectKeyframes__WEBPACK_IMPORTED_MODULE_2__.companionStem)( _core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.basename(pngPath));
47424764 const target = _core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.join(_core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.dirname(particleFile), name + '.png');
47434765 try {
47444766 if (_core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.resolve(pngPath) !== _core_node__WEBPACK_IMPORTED_MODULE_0__.nodePath.resolve(target)) {
@@ -64709,7 +64731,7 @@ if ( typeof window !== 'undefined' ) {
6470964731 \**********************/
6471064732(module) {
6471164733
64712- module.exports = /*#__PURE__*/JSON.parse('{"name":"nrc_cosmetics","version":"1.12 .0","private":true,"description":"NoRisk Client Cosmetics","main":"index.js","scripts":{"build":"npm run build:only","build:only":"webpack","start":"webpack --watch --mode=development","tsc":"tsc --noEmit"},"author":"NoRisk Client","license":"MIT","blockbenchConfig":{"title":"NoRisk Client Cosmetics","author":"NoRisk Client","icon":"fa-shapes","description":"Author NoRisk Client emotes against the player rig and export NRC-ready animation + cosmetic metadata.","min_version":"4.11.0","variant":"both"},"devDependencies":{"blockbench-types":"^4.9.0","ts-loader":"^9.4.4","typescript":"^4.9.5","webpack":"^5.88.2","webpack-cli":"^5.1.4"},"dependencies":{"@noriskclient/nrc-skin-renderer":"^0.3.1","fflate":"^0.8.3","three":"^0.160.1"}}');
64734+ module.exports = /*#__PURE__*/JSON.parse('{"name":"nrc_cosmetics","version":"1.13 .0","private":true,"description":"NoRisk Client Cosmetics","main":"index.js","scripts":{"build":"npm run build:only","build:only":"webpack","start":"webpack --watch --mode=development","tsc":"tsc --noEmit"},"author":"NoRisk Client","license":"MIT","blockbenchConfig":{"title":"NoRisk Client Cosmetics","author":"NoRisk Client","icon":"fa-shapes","description":"Author NoRisk Client emotes against the player rig and export NRC-ready animation + cosmetic metadata.","min_version":"4.11.0","variant":"both"},"devDependencies":{"blockbench-types":"^4.9.0","ts-loader":"^9.4.4","typescript":"^4.9.5","webpack":"^5.88.2","webpack-cli":"^5.1.4"},"dependencies":{"@noriskclient/nrc-skin-renderer":"^0.3.1","fflate":"^0.8.3","three":"^0.160.1"}}');
6471364735
6471464736/***/ },
6471564737
0 commit comments