Replaced expensive getActiveProperties with cheaper filter by inactive field
This commit is contained in:
@@ -3,7 +3,7 @@ import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js';
|
||||
import Creatures from '/imports/api/creature/Creatures.js';
|
||||
import getActiveProperties from '/imports/api/creature/getActiveProperties.js';
|
||||
import CreatureProperties from '/imports/api/creature/CreatureProperties.js';
|
||||
|
||||
export const recomputeDamageMultipliers = new ValidatedMethod({
|
||||
|
||||
@@ -31,9 +31,13 @@ export const recomputeDamageMultipliers = new ValidatedMethod({
|
||||
|
||||
export function recomputeDamageMultipliersById(creatureId){
|
||||
if (!creatureId) throw 'Creature ID is required';
|
||||
let props = getActiveProperties({
|
||||
ancestorId: creatureId,
|
||||
filter: {type: 'damageMultiplier'},
|
||||
let props = CreatureProperties.find({
|
||||
'ancestors.id': creatureId,
|
||||
type: 'damageMultiplier',
|
||||
removed: {$ne: true},
|
||||
inactive: {$ne: true},
|
||||
}, {
|
||||
sort: {order: 1}
|
||||
});
|
||||
|
||||
// Count of how many weakness, resistances and immunities each damage type has
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
import Creatures from '/imports/api/creature/Creatures.js';
|
||||
import CreatureProperties from '/imports/api/creature/CreatureProperties.js';
|
||||
|
||||
export default function getActiveProperties({
|
||||
ancestorId,
|
||||
filter = {},
|
||||
options = {sort: {order: 1}},
|
||||
includeUntoggled = false,
|
||||
includeUnprepared = false,
|
||||
includeUnequipped = false,
|
||||
excludeAncestors,
|
||||
}){
|
||||
filter = getActivePropertyFilter({
|
||||
ancestorId,
|
||||
filter,
|
||||
includeUntoggled,
|
||||
includeUnprepared,
|
||||
includeUnequipped,
|
||||
excludeAncestors,
|
||||
});
|
||||
return CreatureProperties.find(filter, options).fetch();
|
||||
}
|
||||
|
||||
export function getActivePropertyFilter({
|
||||
ancestorId,
|
||||
filter = {},
|
||||
includeUntoggled = false,
|
||||
includeUnprepared = false,
|
||||
includeUnequipped = false,
|
||||
excludeAncestors = [],
|
||||
}){
|
||||
if (!ancestorId){
|
||||
throw 'Ancestor Id is required to get active properties'
|
||||
}
|
||||
// First get ids of disabled properties, unequiped items, unapplied buffs
|
||||
let disabledAncestorsFilter = {
|
||||
'ancestors.id': ancestorId,
|
||||
$or: [
|
||||
{disabled: true}, // Everything can be disabled
|
||||
{applied: false}, // Buffs can be applied
|
||||
],
|
||||
};
|
||||
if (!includeUnequipped){
|
||||
disabledAncestorsFilter.$or.push({type: 'item', equipped: {$ne: true}});
|
||||
}
|
||||
if (!includeUntoggled){
|
||||
disabledAncestorsFilter.$or.push({toggleResult: false});
|
||||
}
|
||||
if (!includeUnprepared){
|
||||
disabledAncestorsFilter.$or.push({
|
||||
type: 'spell',
|
||||
prepared: {$ne: true},
|
||||
alwaysPrepared: {$ne: true}
|
||||
});
|
||||
}
|
||||
let disabledAncestorIds = CreatureProperties.find(disabledAncestorsFilter, {
|
||||
fields: {_id: 1},
|
||||
}).map(prop => prop._id);
|
||||
|
||||
// Then get the ids of creatures that are children of this creature
|
||||
// to isolate their decendent properties
|
||||
Creatures.find({
|
||||
'ancestors.id': ancestorId,
|
||||
}, {
|
||||
fields: {_id: 1},
|
||||
}).forEach(subCreature => {
|
||||
disabledAncestorIds.push(subCreature._id);
|
||||
});
|
||||
|
||||
// Get all the properties that are decendents of the ancestor of interest but
|
||||
// aren't from the excluded decendents
|
||||
if (filter['ancestors.id'] && Meteor.isClient){
|
||||
console.warn('Filtering on ancestor id is ignored')
|
||||
}
|
||||
filter['ancestors.id'] = {
|
||||
$eq: ancestorId,
|
||||
$nin: disabledAncestorIds.concat(excludeAncestors),
|
||||
};
|
||||
// Get properties that aren't removed
|
||||
filter.removed = {$ne: true};
|
||||
// Don't include the disabled ancestors themselves either
|
||||
filter._id = {
|
||||
$nin: disabledAncestorIds,
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
@@ -3,7 +3,6 @@ import { ValidatedMethod } from 'meteor/mdg:validated-method';
|
||||
import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
|
||||
import Creatures from '/imports/api/creature/Creatures.js';
|
||||
import CreatureProperties from '/imports/api/creature/CreatureProperties.js';
|
||||
import getActiveProperties, { getActivePropertyFilter } from '/imports/api/creature/getActiveProperties.js';
|
||||
import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js';
|
||||
import { recomputeCreatureById } from '/imports/api/creature/computation/recomputeCreature.js';
|
||||
|
||||
@@ -43,11 +42,12 @@ const restCreature = new ValidatedMethod({
|
||||
resetFilter = {$in: ['shortRest', 'longRest']}
|
||||
}
|
||||
// Only apply to active properties
|
||||
let filter = getActivePropertyFilter({
|
||||
filter: {reset: resetFilter},
|
||||
ancestorId: creatureId,
|
||||
includeUntoggled: true,
|
||||
});
|
||||
let filter = {
|
||||
'ancestors.id': creatureId,
|
||||
reset: resetFilter,
|
||||
removed: {$ne: true},
|
||||
inactive: {$ne: true},
|
||||
};
|
||||
// update all attribute's damage
|
||||
filter.type = 'attribute';
|
||||
CreatureProperties.update(filter, {
|
||||
@@ -70,14 +70,18 @@ const restCreature = new ValidatedMethod({
|
||||
});
|
||||
// Reset half hit dice on a long rest, starting with the highest dice
|
||||
if (restType === 'longRest'){
|
||||
let hitDice = getActiveProperties({
|
||||
ancestorId: creatureId,
|
||||
filter: {type: 'attribute', attributeType: 'hitDice'},
|
||||
options: {fields: {
|
||||
let hitDice = CreatureProperties.find({
|
||||
'ancestors.id': creatureId,
|
||||
type: 'attribute',
|
||||
attributeType: 'hitDice',
|
||||
removed: {$ne: true},
|
||||
inactive: {$ne: true},
|
||||
}, {
|
||||
fields: {
|
||||
hitDiceSize: 1,
|
||||
damage: 1,
|
||||
value: 1,
|
||||
}},
|
||||
}
|
||||
});
|
||||
// Use a collator to do sorting in natural order
|
||||
let collator = new Intl.Collator('en', {
|
||||
|
||||
Reference in New Issue
Block a user