diff --git a/rpg-docs/.meteor/packages b/rpg-docs/.meteor/packages index a927b8e0..edb7af8a 100644 --- a/rpg-docs/.meteor/packages +++ b/rpg-docs/.meteor/packages @@ -18,3 +18,4 @@ differential:vulcanize aldeed:autoform conielo:autoform-polymer-paper msavin:mongol +matb33:collection-hooks diff --git a/rpg-docs/.meteor/versions b/rpg-docs/.meteor/versions index f1a122af..bf4aa9d9 100644 --- a/rpg-docs/.meteor/versions +++ b/rpg-docs/.meteor/versions @@ -46,6 +46,7 @@ less@1.0.12 livedata@1.0.12 localstorage@1.0.2 logging@1.0.6 +matb33:collection-hooks@0.7.11 meteor@1.1.4 meteor-platform@1.2.1 minifiers@1.1.3 diff --git a/rpg-docs/Model/Character/Buffs.js b/rpg-docs/Model/Character/Buffs.js index 19042e3e..591d221c 100644 --- a/rpg-docs/Model/Character/Buffs.js +++ b/rpg-docs/Model/Character/Buffs.js @@ -19,3 +19,10 @@ Schemas.Buff = new SimpleSchema({ }); Buffs.attachSchema(Schemas.Buff); + +Buffs.before.remove(function (userId, buff) { + Effects.find({sourceId: buff._id, type: "buff"}).forEach(function(effect){ + Effects.remove(effect._id); + }); +}); + diff --git a/rpg-docs/Model/Character/Characters.js b/rpg-docs/Model/Character/Characters.js index ffe65ae9..d248f7cd 100644 --- a/rpg-docs/Model/Character/Characters.js +++ b/rpg-docs/Model/Character/Characters.js @@ -433,7 +433,7 @@ Characters.helpers({ var mod = +getMod(this.attributeValue(attribute)); return 10 + mod; }, - + xpLevel: function(){ var xp = this.experience(); var xpTable = [0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, @@ -455,7 +455,7 @@ Characters.helpers({ }) return level; }, - + experience: function(){ var xp = 0; Experiences.find({charId: this._id}, {fields: {value: 1}}).forEach(function(e){ @@ -464,3 +464,21 @@ Characters.helpers({ return xp; } }); + +//clean up all data related to that character before removing it +Characters.before.remove(function (userId, character) { + if(Meteor.isServer){ + Actions .remove({charId: character._id}); + Attacks .remove({charId: character._id}); + Buffs .remove({charId: character._id}); + Classes .remove({charId: character._id}); + Effects .remove({charId: character._id}); + Experience .remove({charId: character._id}); + Features .remove({charId: character._id}); + Notes .remove({charId: character._id}); + Proficiencies .remove({charId: character._id}); + SpellLists .remove({charId: character._id}); + Items .remove({charId: character._id}); + Containers .remove({charId: character._id}); + } +}); diff --git a/rpg-docs/Model/Character/Features.js b/rpg-docs/Model/Character/Features.js index 66832e5d..327d51c5 100644 --- a/rpg-docs/Model/Character/Features.js +++ b/rpg-docs/Model/Character/Features.js @@ -20,3 +20,9 @@ Features.helpers({ return evaluate(this.charId, this.uses); } }); + +Features.before.remove(function (userId, feature) { + Effects.find({sourceId: feature._id, type: "feature"}).forEach(function(effect){ + Effects.remove(effect._id); + }); +}); diff --git a/rpg-docs/Model/Character/SpellLists.js b/rpg-docs/Model/Character/SpellLists.js index 0badedea..d2603c53 100644 --- a/rpg-docs/Model/Character/SpellLists.js +++ b/rpg-docs/Model/Character/SpellLists.js @@ -22,3 +22,13 @@ SpellLists.helpers({ return num; } }); + +SpellLists.before.remove(function (userId, list) { + if(Meteor.isServer){ + Spells.remove({listId: list._id}); + } else { + Spells.find({listId: list._id}).forEach(function(spell){ + Spells.remove(spell._id); + }); + } +}); diff --git a/rpg-docs/Model/Inventory/Containers.js b/rpg-docs/Model/Inventory/Containers.js index ac32d51d..e6b95f71 100644 --- a/rpg-docs/Model/Inventory/Containers.js +++ b/rpg-docs/Model/Inventory/Containers.js @@ -29,3 +29,13 @@ Containers.helpers({ return weight; } }); + +Containers.before.remove(function (userId, container) { + if(Meteor.isServer){ + Items.remove({container: container._id}); + } else { + Items.find({container: container._id}).forEach(function(item){ + Items.remove(item._id); + }); + } +}); diff --git a/rpg-docs/Model/Inventory/Items.js b/rpg-docs/Model/Inventory/Items.js index bf8032d4..c6728d53 100644 --- a/rpg-docs/Model/Inventory/Items.js +++ b/rpg-docs/Model/Inventory/Items.js @@ -36,35 +36,16 @@ Items.helpers({ } }); -//keep effects sycned with items -//if an item's equipped state changes, update related effects' enabled state -Items.find({}, {fields: {equipped: 1}}).observeChanges({ - added: function(id, fields){ - Effects.find({ type: "equipment", sourceId: id, enabled: {$ne: fields.equipped} }, - {fields: {enabled: 1} }).forEach(function(effect){ - Effects.update(effect._id, {$set: {enabled: fields.equipped}}) - }); - }, - changed: function(id, fields){ - Effects.find({type: "equipment", sourceId: id, enabled: {$ne: fields.equipped} }, - {fields: {enabled: 1} }).forEach(function(effect){ - Effects.update(effect._id, {$set: {enabled: fields.equipped}}) - }); - } +//remove effects if their item source is removed +Items.before.remove(function (userId, item) { + Effects.find({sourceId: item._id, type: "equipment"}).forEach(function(effect){ + Effects.remove(effect._id); + }); }); -//if an effect's type, source or enabled state change, keep the enabled state up to date with the item's equipped state -Effects.find({type: "equipment"}, {fields: {type: 1, enabled: 1, sourceId: 1}}).observe({ - added: function(newEffect){ - var item = Items.findOne(newEffect.sourceId, {fields: {equipped: 1}}); - if(item && item.equipped !== newEffect.enabled){ - Effects.update(newEffect._id, {$set: {enabled: item.equipped}}) - } - }, - changed: function(newEffect, oldEffect){ - var item = Items.findOne(newEffect.sourceId, {fields: {equipped: 1}}); - if(item && item.equipped !== newEffect.enabled){ - Effects.update(newEffect._id, {$set: {enabled: item.equipped}}) - } - } -}) +//keep the effects on the correct character and enabled when equipped +Items.after.update(function (userId, item, fieldNames, modifier, options) { + Effects.find({sourceId: item._id, type: "equipment"}).forEach(function(effect){ + Effects.update(effect._id, { $set: {charId: item.charId, enabled: item.equipped} }); + }, {fetchPrevious: false}); +}); diff --git a/rpg-docs/client/views/character/effects/effectsEditList/effectsEditList.js b/rpg-docs/client/views/character/effects/effectsEditList/effectsEditList.js index d3097547..e7ff7e3c 100644 --- a/rpg-docs/client/views/character/effects/effectsEditList/effectsEditList.js +++ b/rpg-docs/client/views/character/effects/effectsEditList/effectsEditList.js @@ -7,11 +7,15 @@ Template.effectsEditList.helpers({ Template.effectsEditList.events({ "tap #addEffectButton": function(){ + if ( !_.isBoolean(this.enabled) ) { + this.enabled = true; + } Effects.insert({ charId: this.charId, sourceId: this.sourceId, operation: "add", - type: this.type + type: this.type, + enabled: this.enabled }); }, }); \ No newline at end of file diff --git a/rpg-docs/client/views/character/inventory/itemDialog/itemDialog.html b/rpg-docs/client/views/character/inventory/itemDialog/itemDialog.html index b27839ea..7d293ab5 100644 --- a/rpg-docs/client/views/character/inventory/itemDialog/itemDialog.html +++ b/rpg-docs/client/views/character/inventory/itemDialog/itemDialog.html @@ -56,7 +56,7 @@ - {{> effectsEditList sourceId=_id charId=charId type="equipment"}} + {{> effectsEditList sourceId=_id charId=charId type="equipment" enabled=equipped}} {{/baseDialog}} {{/with}} \ No newline at end of file