Use asset IDs when looking up pet's PetAppearance
This was causing a bug where unlabeled poses would cause pet lookups to fail! Now, we return the actual pet appearance for the pet, if we have it, by matching against asset IDs first.
This commit is contained in:
parent
4cb47f3c7c
commit
020ac572e4
1 changed files with 49 additions and 3 deletions
|
@ -32,7 +32,7 @@ const resolvers = {
|
||||||
pose: ({ customPetData, petMetaData }) =>
|
pose: ({ customPetData, petMetaData }) =>
|
||||||
getPoseFromPetData(petMetaData, customPetData),
|
getPoseFromPetData(petMetaData, customPetData),
|
||||||
petAppearance: async (
|
petAppearance: async (
|
||||||
{ customPetData, petMetaData },
|
{ name, customPetData, petMetaData },
|
||||||
_,
|
_,
|
||||||
{ petTypeBySpeciesAndColorLoader, petStatesForPetTypeLoader }
|
{ petTypeBySpeciesAndColorLoader, petStatesForPetTypeLoader }
|
||||||
) => {
|
) => {
|
||||||
|
@ -41,9 +41,55 @@ const resolvers = {
|
||||||
colorId: customPetData.custom_pet.color_id,
|
colorId: customPetData.custom_pet.color_id,
|
||||||
});
|
});
|
||||||
const petStates = await petStatesForPetTypeLoader.load(petType.id);
|
const petStates = await petStatesForPetTypeLoader.load(petType.id);
|
||||||
const pose = getPoseFromPetData(petMetaData, customPetData);
|
|
||||||
const petState = petStates.find((ps) => getPoseFromPetState(ps) === pose);
|
let petState;
|
||||||
|
|
||||||
|
// First, look for a pet state containing exactly the same assets as this
|
||||||
|
// one.
|
||||||
|
const swfAssetIdsString = Object.values(
|
||||||
|
customPetData.custom_pet.biology_by_zone
|
||||||
|
)
|
||||||
|
.map((b) => b.part_id)
|
||||||
|
.sort((a, b) => Number(a) - Number(b))
|
||||||
|
.join(",");
|
||||||
|
petState = petStates.find((ps) => ps.swfAssetIds === swfAssetIdsString);
|
||||||
|
if (petState) {
|
||||||
return { id: petState.id };
|
return { id: petState.id };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next, look for a pet state matching the same pose. (This can happen if
|
||||||
|
// modeling data for this pet hasn't saved yet.)
|
||||||
|
const pose = getPoseFromPetData(petMetaData, customPetData);
|
||||||
|
petState = petStates.find((ps) => getPoseFromPetState(ps) === pose);
|
||||||
|
if (petState) {
|
||||||
|
console.warn(
|
||||||
|
`Warning: For pet "${name}", fell back to pet state ${petState.id} ` +
|
||||||
|
`because it matches pose ${pose}. Actual pet state for these ` +
|
||||||
|
`assets not found: ${swfAssetIdsString}`
|
||||||
|
);
|
||||||
|
return { id: petState.id };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, look for an UNKNOWN pet state. (This can happen if modeling
|
||||||
|
// data for this pet hasn't saved yet, and we haven't manually labeled a
|
||||||
|
// matching pose.)
|
||||||
|
petState = petStates.find((ps) => getPoseFromPetState(ps) === "UNKNOWN");
|
||||||
|
if (petState) {
|
||||||
|
console.warn(
|
||||||
|
`Warning: For pet "${name}", fell back to pet state ${petState.id} ` +
|
||||||
|
`as an UNKNOWN fallback pose. Actual pet state for these ` +
|
||||||
|
`assets not found: ${swfAssetIdsString}`
|
||||||
|
);
|
||||||
|
return { id: petState.id };
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we still don't have a pet state, raise an error. (This can happen
|
||||||
|
// for a brand new new species/color combination, when the modeling data
|
||||||
|
// hasn't been saved yet.)
|
||||||
|
throw new Error(
|
||||||
|
`This pet's modeling data isn't loaded into our database yet, ` +
|
||||||
|
`sorry! Try using the Modeling Hub on Classic DTI to upload it first?`
|
||||||
|
);
|
||||||
},
|
},
|
||||||
wornItems: ({ customPetData }) =>
|
wornItems: ({ customPetData }) =>
|
||||||
Object.values(customPetData.object_info_registry).map((o) => ({
|
Object.values(customPetData.object_info_registry).map((o) => ({
|
||||||
|
|
Loading…
Reference in a new issue