diff --git a/lib/plugins/entities.js b/lib/plugins/entities.js index 31db991f0..fb00f8963 100644 --- a/lib/plugins/entities.js +++ b/lib/plugins/entities.js @@ -978,6 +978,26 @@ function inject (bot) { function fetchEntity (id) { return bot.entities[id] || (bot.entities[id] = new Entity(id)) } + + function extractSkinInformation (properties) { + if (!properties) { + return undefined + } + const props = Object.fromEntries(properties.map((e) => bot.supportFeature('skinUsesKeyedProperties') ? [e.key, e] : [e.name, e])) + if (!props.textures || !props.textures.value) { + return undefined + } + const decodedString = Buffer.from(props.textures.value, 'base64').toString('utf8') + const correctedString = decodedString.replace(/([{,]\s*)([a-zA-Z0-9_]+)\s*:/g, '$1"$2":') + const skinTexture = JSON.parse(correctedString) + const skinTextureUrl = skinTexture?.textures?.SKIN?.url ?? undefined + const skinTextureModel = skinTexture?.textures?.SKIN?.metadata?.model ?? undefined + + if (!skinTextureUrl) { + return undefined + } + return { url: skinTextureUrl, model: skinTextureModel } + } } function parseMetadata (metadata, entityMetadata = {}) { @@ -989,25 +1009,3 @@ function parseMetadata (metadata, entityMetadata = {}) { return entityMetadata } - -function extractSkinInformation (properties) { - if (!properties) { - return undefined - } - - const props = Object.fromEntries(properties.map((e) => [e.name, e])) - if (!props.textures || !props.textures.value) { - return undefined - } - - const skinTexture = JSON.parse(Buffer.from(props.textures.value, 'base64').toString('utf8')) - - const skinTextureUrl = skinTexture?.textures?.SKIN?.url ?? undefined - const skinTextureModel = skinTexture?.textures?.SKIN?.metadata?.model ?? undefined - - if (!skinTextureUrl) { - return undefined - } - - return { url: skinTextureUrl, model: skinTextureModel } -}